几个容器网络相关问题的分析和解决总结(续1)

举报
docker君 发表于 2016/11/17 15:10:10 2016/11/17
【摘要】 上次我发了“几个容器网络相关问题的分析和解决总结”后,有的童鞋已经能照猫画虎地解决容器网络问题了,我心甚慰。前几天我又不务正业地帮忙分析解决了几个影响版本发布的网络问题。其中一个还比较复杂,我记录下来备忘。

目录

7. 主机防火墙iptables、跨节点通信Overlay网络flannel和主机安全组Security Group多种因素导致的网络不通 - iptables&flannel&security group
8. ping稳定概率丢包 - route

上次我发了“几个容器网络相关问题的分析和解决总结”后,有的童鞋已经能照猫画虎地解决容器网络问题了,我心甚慰。

前几天我又不务正业地帮忙分析解决了几个影响版本发布的网络问题。其中一个还比较复杂,我记录下来备忘。

7. 主机防火墙iptables、跨节点通信Overlay网络flannel和主机安全组Security Group多种因素导致的网络不通 - iptables&flannel&security group

问题现象:

某类生产环境,要开放K8s原生API。其中有一项功能是从K8s api Server代理(Proxy)流量到后端Pods。因为K8s Master到K8s Node的网络不通,导致版本发不出去。
跨节点通信使用Flannel,backend是VXLAN。据说backend是UDP的时候可以通信。

分析排查:

整个排障过程如下图所示,这是一个由主机防火墙iptables、跨节点通信Overlay网络flannel和主机安全组Security Group多种因素导致的网络不通的问题。比较复杂和典型。

首先,根据“几个容器网络相关问题的分析和解决总结”中的“6. K8s Master主机上ping不通Node节点上的docker0和容器,但在Node上可以ping通 - iptables”,移除K8s Master上的主机防火墙的INPUT和FORWARD链上对icmp的限制reject-with icmp-host-prohibited,还是不通。(注:此乃网络不通原因之一)

在K8s Master上查看路由,发现这个网络环境和其它的不一样,多了一个网络172.16.0.0/24,而且使用了eth0。如下:

# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.0.1 0.0.0.0 UG 100 0 0 eth0
169.254.169.254 172.16.0.2 255.255.255.255 UGH 100 0 0 eth0
172.16.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel.1
172.18.100.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1

经询问172.16.0.0/24网络是deploy-mgr连接K8s Master的网络。因此排查重点放在此网络不一致上。尝试更改此默认路由到gw 192.168.0.1和eth1(flannel的通信网络),结果导致K8s Master不可访问。通过VNC连接上恢复。

使用journalctl -u flanneld查看flannel的日志,发现如下异常:

Using 172.16.0.4 as external interface
Using 172.16.0.4 as external endpoint

因为缺省flannel的出口网络会使用default路由的接口,而default路由的接口不在flannel的向外通信的网络上,因此肯定这个是错误的。(注:此乃网络不通原因之二)

--public-ip="":
IP accessible by other nodes for inter-host communication. Defaults to the IP of the interface being used for communication.
--iface="":
interface to use (IP or name) for inter-host communication. Defaults to the interface for the default route on the machine.

按照以上描述,修改/etc/default/flanneld中flannel的启动参数如下(-iface和-public-ip),并重启flanneld服务:

FLANNEL_OPTS="-etcd-endpoints=https://192.168.0.15:4003
-iface=eth1 -public-ip=192.168.0.15
-etcd-cafile=/var/paas/srv/kubernetes/ca.crt
-etcd-certfile=/var/paas/srv/kubernetes/kubecfg.crt
-etcd-keyfile=/var/paas/srv/kubernetes/kubecfg.key"

这块感谢丁姝洁童鞋一起头脑风暴。

查看flannel参数启动正常后,验证K8s Master到K8s Node网络还是不通!

问题解决:

百思不得其姐,几近黔驴技穷。

随后要求再次确认K8s Master上的安全组对UDP协议的8472端口的出方向和入方向是打开的,并要求设置此规则。(注:此乃网络不通原因之三)

Port (number): UDP port to use for sending encapsulated packets. Defaults to kernel default, currently 8472

注意:RFC的VXLAN协议默认端口是4789,但是flannel默认使用8472

如下打开后,网络通了!

我再次得到的教训是对诸如“我在别的地方也是这么配的,但是正常的”、“两个节点之间的通信我已经全部开放了”之类的说法要赔持怀疑态度,一定要亲自查看和确保。

8. ping稳定概率丢包 - route

问题现象:

某环境两台主机之间ping的时候稳定概率丢包50%。

图示如下:

分析排查:

怀疑是多(两)网卡和路由问题导致的一半ping包丢失。查看路由如下:

Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.175.100.1 0.0.0.0 UG 0 0 0 eth2
0.0.0.0 9.91.17.59 0.0.0.0 UG 0 0 0 eth0
9.91.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
9.91.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
10.175.100.0 0.0.0.0 255.255.252.0 U 0 0 0 eth2
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0

很明显地可以看出前4条路由明显不对,default有两条路由且出口完全不一样,到9.91.0.0/24有两条路由且出口完全不一样。

问题解决:

删掉错误的路由,ping就正常了。

作者 | 乔雷

转载请注明出处:华为云博客 https://portal.hwclouds.com/blogs

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。