使用flannel插件的情况下,开启Iptables

背景

kubernetes: 1.16.3
CNI: flannel
因为Node有公网和内网两个IP,使用防火墙对机器进行安全加固

问题

开启防火墙后,不同节点的Node之间无法通信

# Generated by iptables-save v1.4.21 on Thu Jul  8 10:16:12 2021
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6:438]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 10.244.0.0/16 -m comment --comment "pod Subnet" -j ACCEPT
-A INPUT -s 10.96.0.0/12 -m comment --comment "service Subnet" -j ACCEPT
-A INPUT -s 10.241.0.0/16 -m comment --comment "lan IP" -j ACCEPT
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
-A INPUT -p udp -m udp --sport 123 -j ACCEPT
-A INPUT -p udp -m udp --dport 123 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -p udp -m udp --dport 161 -j ACCEPT
COMMIT
# Completed on Thu Jul  8 10:16:12 2021

node 节点内网全开

解决思路

  1. 将上述配置写入到/etc/sysconfig/iptables中,并重启防火墙配置
  2. kube-proxy和flannel检查到自身的防火墙被清理后,会自动创建
  3. 此时在A节点上Ping B节点的Pod IP,发现网络不通
  4. 通过抓包发现,对端没有回复任何包
  5. 关闭Iptables服务,并清理自己创建的规则
  6. 此时检查是通的
  7. 开启防火墙,并全开flannel数据传输的UTP 8472端口,发现也是通的
    -A INPUT -p udp --dport 8472 -j ACCEPT
    
  8. 此时可以出结论,故障出现在公网网卡上,检查flannel日志,发现果然监听的是公网IP
    I0903 09:57:22.857993       1 main.go:532] Using interface with name XXX and address XX.XXX.X.X
    I0903 09:57:22.858084       1 main.go:549] Defaulting external address to interface address (XX.XXX.X.X)
    

解决方法

重新部署flannel,并指定使用的网卡

args:
  - '--ip-masq'
  - '--kube-subnet-mgr'
  - '--iface=ens192'

总结

  1. 在双网卡的情况下,flannel默认使用第一张网卡
  2. flannel会使用网卡对应的IP的8472来传输数据
上一篇:iptables详解


下一篇:Linux下iptables基本使用