不同节点上的 Pod 无法互相 ping 通

Posted

技术标签:

【中文标题】不同节点上的 Pod 无法互相 ping 通【英文标题】:Pods on different nodes can't ping each other 【发布时间】:2019-01-18 14:30:40 【问题描述】:

我根据文档设置了 1 个主 2 个节点的 k8s 集群。一个 pod 可以 ping 同一个节点上的另一个 pod,但不能 ping 另一个节点上的 pod。

为了演示我在具有 3 个副本的部署下部署的问题。其中两个位于同一个节点上,而另一个 pod 位于另一个节点上。

$ 猫 nginx.yaml api版本:应用程序/v1 种类:部署 元数据: 名称:nginx-部署 标签: 应用程序:nginx 规格: 复制品:2 选择器: 匹配标签: 应用程序:nginx 模板: 元数据: 标签: 应用程序:nginx 规格: 容器: - 名称:nginx 图片:nginx 端口: - 容器端口:80 --- 种类:服务 api版本:v1 元数据: 名称:nginx-svc 规格: 选择器: 应用程序:nginx 端口: - 协议:TCP 端口:80 $ kubectl 获取节点 姓名 状态 角色 年龄 版本 ip-172-31-21-115.us-west-2.compute.internal Ready master 20m v1.11.2 ip-172-31-26-62.us-west-2.compute.internal Ready 19m v1.11.2 ip-172-31-29-204.us-west-2.compute.internal Ready 14m v1.11.2 $ kubectl 获取 pods -o 宽 名称 就绪 状态 重启 年龄 IP 节点 提名节点 nginx-deployment-966857787-22qq7 1/1 运行 0 11m 10.244.2.3 ip-172-31-29-204.us-west-2.compute.internal nginx-deployment-966857787-lv7dd 1/1 运行 0 11m 10.244.1.2 ip-172-31-26-62.us-west-2.compute.internal nginx-deployment-966857787-zkzg6 1/1 运行 0 11m 10.244.2.2 ip-172-31-29-204.us-west-2.compute.internal $ kubectl 获取 svc 名称 类型 CLUSTER-IP EXTERNAL-IP PORT(S) 年龄 Kubernetes ClusterIP 10.96.0.1 443/TCP 21m nginx-svc ClusterIP 10.105.205.10 80/TCP 11m

一切看起来都很好。

让我告诉你容器。

# docker exec -it 489b180f512b /bin/bash root@nginx-deployment-966857787-zkzg6:/# ifconfig eth0:标志=4163 mtu 8951 inet 10.244.2.2 网络掩码 255.255.255.0 广播 0.0.0.0 inet6 fe80::cc4d:61ff:fe8a:5aeb prefixlen 64 scopeid 0x20 root@nginx-deployment-966857787-zkzg6:/# ping 10.244.2.3 PING 10.244.2.3 (10.244.2.3) 56(84) 字节数据。 来自 10.244.2.3 的 64 个字节:icmp_seq=1 ttl=64 time=0.066 ms 来自 10.244.2.3 的 64 个字节:icmp_seq=2 ttl=64 time=0.055 ms ^C

所以它在同一个节点上ping它的邻居pod。

root@nginx-deployment-966857787-zkzg6:/# ping 10.244.1.2 PING 10.244.1.2 (10.244.1.2) 56(84) 字节数据。 ^C --- 10.244.1.2 ping 统计 --- 2个包发送,0个接收,100%丢包,时间1059ms

并且无法在另一个节点上 ping 其副本。

这里是主机接口:

# 如果配置 cni0:标志=4163 mtu 8951 inet 10.244.2.1 网络掩码 255.255.255.0 广播 0.0.0.0 docker0:标志=4099 mtu 1500 inet 172.17.0.1 网络掩码 255.255.0.0 广播 172.17.255.255 eth0:标志=4163 mtu 9001 inet 172.31.29.204 网络掩码 255.255.240.0 广播 172.31.31.255 法兰绒.1:标志=4163 mtu 8951 inet 10.244.2.0 网络掩码 255.255.255.255 广播 0.0.0.0 lo:标志=73 mtu 65536 inet 127.0.0.1 网络掩码 255.0.0.0 veth09fb984a:标志=4163 mtu 8951 inet6 fe80::d819:14ff:fe06:174c prefixlen 64 scopeid 0x20 veth87b3563e:标志=4163 mtu 8951 inet6 fe80::d09c:d2ff:fe7b:7dd7 prefixlen 64 scopeid 0x20 # 如果配置 cni0:标志=4163 mtu 8951 inet 10.244.1.1 网络掩码 255.255.255.0 广播 0.0.0.0 docker0:标志=4099 mtu 1500 inet 172.17.0.1 网络掩码 255.255.0.0 广播 172.17.255.255 eth0:标志=4163 mtu 9001 inet 172.31.26.62 网络掩码 255.255.240.0 广播 172.31.31.255 法兰绒.1:标志=4163 mtu 8951 inet 10.244.1.0 网络掩码 255.255.255.255 广播 0.0.0.0 lo:标志=73 mtu 65536 inet 127.0.0.1 网络掩码 255.0.0.0 veth9733e2e6:标志=4163 mtu 8951 inet6 fe80::8003:46ff:fee2:abc2 prefixlen 64 scopeid 0x20

节点上的进程:

# ps auxww|grep kube 根 4059 0.1 2.8 43568 28316 ? Ssl 00:31 0:01 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf 根 4260 0.0 3.4 358984 34288 ? Ssl 00:31 0:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr 根 4455 1.1 9.6 760868 97260 ? ssl 00:31 0:14 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/ kubelet/config.yaml --cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni

由于这个网络问题clusterIP也无法访问:

$ 卷曲 10.105.205.10:80

有什么建议吗?

谢谢。

【问题讨论】:

【参考方案1】:

我发现了问题。

Flannel 使用被 AWS 安全组阻止的 UDP 端口 8285 和 8472。我只打开了 TCP 端口。

我启用了 UDP 端口 8285 和 UDP 端口 8472 以及 TCP 6443、10250、10256。

【讨论】:

【参考方案2】:

docker 虚拟网桥接口 docker0 现在在两台主机上都有 IP 172.17.0.1

但根据 docker/flannel 集成指南,docker0virtual 网桥应位于每台主机的 flannel 网络中。

下面是 flannel/docker 网络集成的高级工作流程

Flannel 在flanneld 启动期间根据etcd 网络配置创建/run/flannel/subnet.env。 Docker 引用文件/run/flannel/subnet.env 并在dockerd 启动期间设置--bip 标志,并将来自法兰绒网络的IP 分配给docker0

请参阅 docker/flannel 集成文档了解更多详细信息: http://docker-k8s-lab.readthedocs.io/en/latest/docker/docker-flannel.html#restart-docker-daemon-with-flannel-network

【讨论】:

以上是关于不同节点上的 Pod 无法互相 ping 通的主要内容,如果未能解决你的问题,请参考以下文章

虚拟机nat方式上网,虚拟机和主机为啥不能互相ping通

nat转换之后终端PC无法ping通外部网关?

node节点flannel网络问题导致该node上的pod与其他node节点网络不通的排查思路与解决

将Pod迁移到其他节点

K8s中pod的数据通讯

两台虚拟机可能互相ping通,为啥不能互相访问网站?