kubernetes - Kubernetes pod 无法访问外部 IP 地址
问题描述
我正在搭建一个 k8s 测试集群环境。但是k8s部署的pods无法访问外部ip地址。
Pod ip 地址为 173.16.2.5/24 该节点在接口 eth0 上的 ip 为 10.168.99.198/24,在 cni 网络上的 ip 为 173.16.2.1/24。
- 从节点 ping 10.168.99.197 正在工作:
#ping 10.168.99.197
PING 10.168.99.197 (10.168.99.197) 56(84) bytes of data.
64 bytes from 10.168.99.197: icmp_seq=1 ttl=64 time=0.120 ms
- 但是从busybox pod ping 相同的IP 失败:
#ping 10.168.99.197
PING 10.168.99.197 (10.168.99.197): 56 data bytes
<-- no response
k8s创建的busybox容器上的路由:
# ip route
default via 173.16.2.1 dev eth0
10.244.0.0/16 via 173.16.2.1 dev eth0
173.16.2.0/24 dev eth0 scope link src 173.16.2.5
如果我启动一个不是由 k8s 创建的busybox 容器,则网络很好: 路由在docker 创建的busybox 容器上:
# ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 scope link src 172.17.0.2
# ping 10.168.99.197
PING 10.168.99.197 (10.168.99.197): 56 data bytes
64 bytes from 10.168.99.197: seq=0 ttl=63 time=0.554 ms
节点上的路由表:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default localhost 0.0.0.0 UG 0 0 0 eth0
10.168.99.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
173.16.0.0 173-16-0-0.clie 255.255.255.0 UG 0 0 0 flannel.1
173.16.1.0 173-16-1-0.clie 255.255.255.0 UG 0 0 0 flannel.1
173.16.2.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
如何解决这个问题,让 k8s 创建的 pod 到达外部 ip?
解决方案
pod 无法访问外部 ip 的原因是 flannel 网络配置与 cni 网络不匹配,更改 flannel 设置解决了这个问题:
# kubectl get configmap -n kube-system -o yaml kube-flannel-cfg
...
net-conf.json: |
{
"Network": "172.30.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
...
推荐阅读
- php - codeigniter 中的下拉菜单 li 未使用 id 从数据库中获取正确的值
- c++ - 最初无法在窗口中看到列表
- c++ - 用 Wine 执行给出:vsprintf 选项 25 未处理
- jquery - 剑道下拉列表重新初始化问题
- php - 接受大量输入的请求(千)
- c# - LINQ 查询异常错误无效的列名“courseId1”EFCore
- c# - ArgumentException:必须发送 orderId 或 origClientOrderId
- c# - 无法将反序列化的 JObject 转换为 SQLiteCommand 数据类型
- android - 我应该使用 Observable(RxJava2) 还是 Call (retrofit2)?
- google-cloud-platform - 无法从 Google Cloud 中的磁盘源创建映像