IP forward 是一种内核态设置,允许将一个接口的流量转发到另外一个接口,该配置是 Linux 内核将流量从容器路由到外部所必须的。
失败情况
有时候该项设置可能会被安全团队运行的定期安全扫描给重置了,或者没有配置为重启后生效,在这种情况下,就会出现网络访问失败的情况。 Pod 服务连接超时:
1 2 3 4
* connectto10.100.225.223 port 5000 failed: Connection timed out * Failed toconnectto10.100.225.223 port 5000: Connection timed out * Closing connection0 curl: (7) Failed toconnectto10.100.225.223 port 5000: Connection timed out
# this will turn things back on a live server sysctl -w net.ipv4.ip_forward=1 # on Centos this will make the setting apply after reboot echo net.ipv4.ip_forward=1 >> /etc/sysconf.d/10-ipv4-forwarding-on.conf
$ curl http://172.28.128.132:5000 curl: (7) Failed to connect to172.28.128.132port5000: No routeto host
如何诊断
首先查看分配的 Pod IP 地址:
1 2 3 4 5
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE netbox-2123814941-f7qfr 1/1 Running 421h172.28.27.2172.28.128.103 netbox-2123814941-ncp3q 1/1 Running 421h172.28.21.3172.28.128.102 testbox-2460950909-5wdr4 1/1 Running 321h172.28.128.132172.28.128.101
然后将主机 IP 范围与apiserver中指定的 kubernetes 子网进行比较:
1 2 3 4 5 6 7
$ ip addr list 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP groupdefault qlen 1000 link/ether 52:54:00:2c:6c:50 brd ff:ff:ff:ff:ff:ff inet172.28.128.103/24 brd 172.28.128.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe2c:6c50/64 scope link valid_lft forever preferred_lft forever
如果出现了同网段的 IP,则很大概率会出现冲突了。
如何修复
仔细检查你的网络设置,确保你正在使用的网络、VLAN 或 VPC 之间不会有重叠。如果有冲突的,我们可以在 CNI 插件或 kubelet 的pod-cidr参数中指定 IP 地址范围,避免冲突。