安装好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规则优化

    1. ~]# yum install iptables-services -y
    2. [root@k8s-5-138 ~]# systemctl start iptables
    3. [root@k8s-5-138 ~]# systemctl enable iptables
    4. Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
    5. [root@k8s-5-138 ~]# iptables-save |grep -i postrouting
    6. :POSTROUTING ACCEPT [1409049:234910260]
    7. :POSTROUTING ACCEPT [65:3916]
    8. :KUBE-POSTROUTING - [0:0]
    9. -A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
    10. -A POSTROUTING -s 172.5.138.0/24 ! -o docker0 -j MASQUERADE #这条配置的含义:源地址是172.5.138.0/24 且不是从docker0 出网的,才做源地址转换
    11. -A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN
    12. -A KUBE-POSTROUTING -j MARK --set-xmark 0x4000/0x0
    13. -A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE
    14. [root@k8s-5-138 ~]# iptables -t nat -D POSTROUTING -s 172.5.138.0/24 ! -o docker0 -j MASQUERADE
    15. [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
    16. [root@k8s-5-138 ~]# iptables-save | grep -i postrouting
    17. :POSTROUTING ACCEPT [2:120]
    18. :KUBE-POSTROUTING - [0:0]
    19. -A POSTROUTING -s 172.5.138.0/24 ! -d 172.5.0.0/16 ! -o docker0 -j MASQUERADE
    20. -A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING
    21. -A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE
    22. [root@k8s-5-138 ~]# iptables-save | grep -i reject
    23. -A INPUT -j REJECT --reject-with icmp-host-prohibited
    24. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    25. [root@k8s-5-138 ~]# iptables -t filter -D INPUT -j REJECT --reject-with icmp-host-prohibited
    26. [root@k8s-5-138 ~]# iptables -t filter -D FORWARD -j REJECT --reject-with icmp-host-prohibited
    27. [root@k8s-5-138 ~]# iptables-save > /etc/sysconfig/iptables
    28. [root@k8s-5-138 ~]# service iptables save
    29. iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
    30. [root@k8s-5-138 ~]#

    docker服务重启后,会再次增加该规则,要注意在每次重启docker服务后,删除该规则
    验证:
    修改后会影响到docker原本的iptables链的规则,所以需要重启docker服务

    1. [root@k8s-5-138 ~]# systemctl restart docker
    2. [root@k8s-5-138 ~]# iptables-save |grep -i postrouting|grep docker0
    3. -A POSTROUTING -s 172.5.138.0/24 ! -o docker0 -j MASQUERADE
    4. -A POSTROUTING -s 172.5.138.0/24 ! -d 172.5.0.0/16 ! -o docker0 -j MASQUERADE
    5. # 可以用iptables-restore重新应用iptables规则,也可以直接再删
    6. [root@k8s-5-138 ~]# iptables-restore /etc/sysconfig/iptables
    7. [root@k8s-5-138 ~]# iptables-save |grep -i postrouting|grep docker0
    8. -A POSTROUTING -s 172.5.138.0/24 ! -d 172.5.0.0/16 ! -o docker0 -j MASQUERADE