安装好CNI网络插件之后,在集群任何一台机子上都可以访问其他集群上任意Pod的IP了。 但是在一下场景中会有点不完美 假设有宿主机 k8s-5-138(192.168.5.138) , 该宿主机上有一个Pod, IP 为 172.5.138.2 另有宿主机 k8s-5-139(192.168.5.139),该宿主机上有一个pod, IP为172.5.139.2 然后从172.5.138.2 访问 K8s-5-139服务器上的 172.5.139.2 , 在 pod 172.5.139.2 中识别到的被访问者却是 192.168.5.138 ,并不是 172.5.138.2 在生产环境的集群中,最好是每个容器都是用自身的IP去和其他容器通信
如果需要各个容器精准识别被访问者, 就需要做SNAT规则优化
~]# yum install iptables-services -y
[root@k8s-5-138 ~]# systemctl start iptables
[root@k8s-5-138 ~]# systemctl enable iptables
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@k8s-5-138 ~]# iptables-save |grep -i postrouting
:POSTROUTING ACCEPT [1409049:234910260]
:POSTROUTING ACCEPT [65:3916]
:KUBE-POSTROUTING - [0:0]
-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
-A POSTROUTING -s 172.5.138.0/24 ! -o docker0 -j MASQUERADE #这条配置的含义:源地址是172.5.138.0/24 且不是从docker0 出网的,才做源地址转换
-A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN
-A KUBE-POSTROUTING -j MARK --set-xmark 0x4000/0x0
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE
[root@k8s-5-138 ~]# iptables -t nat -D POSTROUTING -s 172.5.138.0/24 ! -o docker0 -j MASQUERADE
[root@k8s-5-138 ~]# iptables -t nat -I POSTROUTING -s 172.5.138.0/24 ! -d 172.5.0.0/16 ! -o docker0 -j MASQUERADE
[root@k8s-5-138 ~]# iptables-save | grep -i postrouting
:POSTROUTING ACCEPT [2:120]
:KUBE-POSTROUTING - [0:0]
-A POSTROUTING -s 172.5.138.0/24 ! -d 172.5.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE
[root@k8s-5-138 ~]# iptables-save | grep -i reject
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
[root@k8s-5-138 ~]# iptables -t filter -D INPUT -j REJECT --reject-with icmp-host-prohibited
[root@k8s-5-138 ~]# iptables -t filter -D FORWARD -j REJECT --reject-with icmp-host-prohibited
[root@k8s-5-138 ~]# iptables-save > /etc/sysconfig/iptables
[root@k8s-5-138 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@k8s-5-138 ~]#
docker服务重启后,会再次增加该规则,要注意在每次重启docker服务后,删除该规则
验证:
修改后会影响到docker原本的iptables链的规则,所以需要重启docker服务
[root@k8s-5-138 ~]# systemctl restart docker
[root@k8s-5-138 ~]# iptables-save |grep -i postrouting|grep docker0
-A POSTROUTING -s 172.5.138.0/24 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.5.138.0/24 ! -d 172.5.0.0/16 ! -o docker0 -j MASQUERADE
# 可以用iptables-restore重新应用iptables规则,也可以直接再删
[root@k8s-5-138 ~]# iptables-restore /etc/sysconfig/iptables
[root@k8s-5-138 ~]# iptables-save |grep -i postrouting|grep docker0
-A POSTROUTING -s 172.5.138.0/24 ! -d 172.5.0.0/16 ! -o docker0 -j MASQUERADE