问题描述
K8S宿主机使用dockerd当做csi, 业务需使用docker run启动container运行,通过docker run启动的容器无法与外界网络连接
结论先行
根因是节点的docker bridge网络问题,docker启动会对机器进行一些iptables规则添加,该机器有人使用了iptables -F 清理了规则,导致bridge模式的container无法和机器外的网络进行通信
排查
- 先ping同机器的其他container,确认可ping通,证明docker的vth对和netns没有问题
- 确认路由是至docker0网桥, ping 宿主机同网段机器,在机器上抓包,发现源IP没有进行SNAT
- 查看nat表的iptables规则,果然缺少关于docker默认网段172.17.0.0/16网段对应的snat规则;
- 加上nat相关的iptables规则之后还是无法ping通,而是梳理所有iptables规则对比
梳理前快速定位的对比,可以在docker正常的机器启动一个bridge容器,进入后ping跨主机通信的ip,然后watch iptables 的nat表和fileter表的匹配规则哪些有新增,再确认对应的链是否有规则遗漏。
docker run -d ubuntu:18.04 /bin/bash -c “tail -f /dev/null”
docker inspect $containID |grep -i pid
nsenter -n -t $pid ;; ping xxxx (宿主机同网段的其他机器,跨主机通信即可)
watch -n 1 -d sudo iptables -nvL -t nat/filter (找到持续ping数据经过iptables过滤的规则链,确认问题机器是否有缺失)
梳理了docker相关的iptables规则
nat 表
:PREROUTING ACCEPT [151:20127]
:INPUT ACCEPT [82:13633]
:OUTPUT ACCEPT [86:19935]
:POSTROUTING ACCEPT [168:28083]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
COMMIT
#docker对于nat表主要是在POSTROUTING链对不是从docker0网卡发出的源IP为172.17段的包进行SNAT
filter 表
:INPUT DROP [4:160]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [59:48132]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
#filter表主要是将FORWAR链上包指定至docker的自定义链
补充
该机器是K8S的宿主机,iptables -F清理了规则后,为什么pod网络还可以正常使用?
KUBE相关的iptables规则是由kube-proxy组件进行维护的,kube-proxy默认30s会刷新iptables规则,而且pod的重启,service的更新都会主动刷新机器的iptables。