flannel之SNAT规则优化

使得容器之间的透明访问

解决两宿主机容器之间的透明访问,如不进行优化,容器之间的访问,日志记录为宿主机的IP地址
# 把nginx:curl拉下来,21机器
~]# docker login docker.io/909336740/nginx:curl
~]# docker pull 909336740/nginx:curl
~]# docker images|grep curl
~]# docker tag 34736e20b17b harbor.od.com/public/nginx:curl
~]# docker login harbor.od.com
~]# docker push harbor.od.com/public/nginx:curl

# 改以下内容,21机器:
cd
~]# vi nginx-ds.yaml
image: harbor.od.com/public/nginx:curl
~]# kubectl apply -f nginx-ds.yaml
~]# kubectl get pods
# 删掉两个pod让它们自动重启以便应用新镜像
~]# kubectl delete pod nginx-ds-5nhq6
# out:pod "nginx-ds-5nhq6" deleted
~]# kubectl delete pod nginx-ds-cfjvn
#out:pod "nginx-ds-cfjvn" deleted
~]# kubectl get pods -o wide

# 21机器:
~]# kubectl exec -ti nginx-ds-6nmbr /bin/bash
6nmbr:/# curl 172.7.22.2
# 注意这个pod是起在了22网络了,如果网段没有在22上,就curl 172.7.22.2,只要有welcome的网页回应即可,而且log日志也有
# 22机器
etcd]# kubectl get pods -o wide
etcd]# kubectl logs -f nginx-ds-drrkt

kubectl logs -f :查看Pod日志

确认启动正常

# 21机器:
~]# iptables-save |grep -i postrouting

iptables:

  • 语法:iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
  • -A :在规则链的末尾加入新规则
  • -s :匹配来源地址IP/MASK,加叹号"!"表示除这个IP外
  • -o :匹配从这块网卡流出的数据
  • MASQUERADE :动态伪装,能够自动的寻找外网地址并改为当前正确的外网IP地址
  • 上面红框内的可以理解为:如果是172.7.21.0/24段的docker的ip,网络发包不从docker0桥设备出战的,就进行SNAT转换,而我们需要的是如果出网的地址是172.7.21.0/24或者172.7.0.0/16网络(这是docker的大网络),就不要做源地址NAT转换,因为我们集群内部需要坦诚相见,自己人不需要伪装。
# 21/22机器,我们开始改:
~]# yum install iptables-services -y
~]# systemctl start iptables
~]# systemctl enable iptables
# 删掉对应的规则,以下需要对应机器,一处修改:-s 172.7.21
~]# iptables -t nat -D POSTROUTING -s 172.7.21.0/24 ! -o docker0 -j MASQUERADE
# 添加对应的规则,以下需要对应机器,一处修改:-s 172.7.21
~]# iptables -t nat -I POSTROUTING -s 172.7.21.0/24 ! -d 172.7.0.0/16 ! -o docker0 -j MASQUERADE
# 上面这条规则可以理解为:只有出网地址不是172.7.21.0/24或者172.7.0.0/16,网络发包不从docker0桥设备出战的,才做SNAT转换
~]# iptables-save |grep -i postrouting
~]# iptables-save > /etc/sysconfig/iptables
# 21机器curl22,22机器curl21
~]# kubectl exec -ti nginx-ds-6nmbr /bin/bash
6nmbr:/# curl 172.7.22.2
### 相关报错
# 如果报错:curl: (7) Failed to connect to 172.7.22.2 port 80: No route to host
# 则执行以下操作,在删掉两台机器21/22的iptables的reject,两边同时执行
~]# iptables-save|grep -i reject
~]# iptables -t filter -D [名字]
~]# iptables-save > /etc/sysconfig/iptables
###

iptables:

  • 语法:iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
  • -D:删除某一条规则
  • -I:在规则链的头部加入新规则
  • -s:匹配来源地址IP/MASK,加叹号"!"表示除这个IP外
  • -d:匹配目标地址
  • -o:匹配从这块网卡流出的数据
  • MASQUERADE:动态伪装,能够自动的寻找外网地址并改为当前正确的外网IP地址

成功图,在22上已经可以明确的看到对方是172.7.21.2了,在21上可以看到对方是172的22: