flannel网络2
已思考 11 秒
以下汇总了 Docker、Flannel (VXLAN CNI) 和 kube-proxy (iptables 模式) 在节点上分别管理的 iptables 规则,并重点补充了 KUBE-MARK-MASQ 的作用及链路。每句话后均附权威来源,便于逐条核对。
关键概览
在 Kubernetes 中,Docker 负责容器网络桥接的基础隔离与端口映射,Flannel 插入 Overlay 网络(PodCIDR)的放行和 SNAT 规则,kube-proxy 则通过一系列 KUBE-* 链实现 Service 的 DNAT/SNAT。KUBE-MARK-MASQ 用于在执行 DNAT 后标记需要在 POSTROUTING 阶段做 MASQUERADE 的数据包,弥补了 iptables 不能同时在同一链做 DNAT 和 SNAT 的限制 citeturn0search0turn0search2。
1. Docker iptables
# nat 表
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
# filter 表
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j DOCKER-USER
-
Docker 在
nat/PREROUTING和nat/OUTPUT中创建DOCKER链,将 HostPort DNAT 到容器内部 citeturn0search0。 -
对 所有离开
docker0网桥 的容器流量执行MASQUERADESNAT,保证容器对外访问正常 citeturn0search0。 -
在
filter/FORWARD使用多条规则允许容器间(docker0内部)及容器到 Host 及外部的转发,并预留DOCKER-USER链供用户自定义隔离 citeturn0search0。
2. Flannel iptables (VXLAN 模式)
# filter 表
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
-A INPUT -i flannel.1 -j ACCEPT
-A FORWARD -s 192.168.128.0/18 -j ACCEPT
-A FORWARD -d 192.168.128.0/18 -j ACCEPT
-A FORWARD -i flannel.1 -j ACCEPT
# nat 表
:POSTROUTING ACCEPT [0:0]
:FLANNEL-POSTRTG - [0:0]
-A POSTROUTING -j FLANNEL-POSTRTG
-A FLANNEL-POSTRTG -s 192.168.128.0/18 -j MASQUERADE
-
Flannel 在物理机
filter/INPUT放行 VXLAN 接口flannel.1的所有流量,保证隧道包可解封装 citeturn0search1。 -
在
filter/FORWARD放行源自或目标为 Pod 网络 (192.168.128.0/18) 的转发流量,支持跨节点 Pod 通信 citeturn0search1。 -
在
nat/POSTROUTING钩子创建FLANNEL-POSTRTG链,对 Pod 出网流量做MASQUERADESNAT,使 Pod 能访问外部网络 citeturn0search1。
3. kube-proxy iptables(含 KUBE-MARK-MASQ)
3.1 核心 nat 表链
# PREROUTING & OUTPUT:匹配 ClusterIP
-A PREROUTING -d 192.168.255.0/24 -j KUBE-SERVICES
-A OUTPUT -d 192.168.255.0/24 -j KUBE-SERVICES
# PREROUTING:匹配 NodePort
-A PREROUTING -p tcp --dport <NodePort> -j KUBE-NODEPORTS
-
KUBE-SERVICES是所有 Service DNAT 的入口链,匹配 ClusterIP 范围并分发 citeturn0search0。 -
KUBE-NODEPORTS处理 NodePort 和 LoadBalancer 类型服务外部入口,将流量跳转到相应KUBE-SVC-*链 citeturn0search0。
3.2 Service 调度与 DNAT
:KUBE-SERVICES - [0:0]
-A KUBE-SERVICES -d 192.168.255.10/32 -p tcp --dport 80 -j KUBE-SVC-ABC123
:KUBE-SVC-ABC123 - [0:0]
-A KUBE-SVC-ABC123 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-DEF456
-A KUBE-SVC-ABC123 -j KUBE-SEP-GHI789
:KUBE-SEP-DEF456 - [0:0]
-A KUBE-SEP-DEF456 -s 10.244.1.5/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-DEF456 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.244.1.5:80
-
KUBE-SVC-*链通过统计/轮询将流量分发到各KUBE-SEP-*链,实现简单的负载均衡 citeturn0search3。 -
KUBE-SEP-*链代表后端 Pod,每条规则先跳转到KUBE-MARK-MASQ,再做 DNAT → Pod IP:Port citeturn0search0。
3.3 KUBE-MARK-MASQ 及后续 SNAT
:KUBE-MARK-MASQ - [0:0]
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
# 在 POSTROUTING 中统一 MASQUERADE
-A POSTROUTING -m mark --mark 0x4000/0x4000 -j MASQUERADE
-
KUBE-MARK-MASQ给需要 SNAT 的数据包打上标记 (0x4000),以便后续在POSTROUTING统一做MASQUERADE,解决不能同时在同一链做 DNAT 和 SNAT 的 iptables 限制 citeturn0search0turn0search2。
4. Linux 路由 关系
# Host 主路由
192.168.128.0/18 dev flannel.1 proto kernel scope link src 192.168.128.1 # PodCIDR
192.168.255.0/24 dev cni0 proto kernel scope link # ServiceCIDR
default via 10.0.0.1 dev eth0 # Internet
# Pod ns 路由
192.168.128.0/18 dev eth0 proto kernel scope link src 192.168.128.X
default via 192.168.128.1 dev eth0
-
Pod 命名空间将所有非 PodCIDR 流量通过 veth pair 交给 Host,再由 Host 的 Flannel 路由到对应节点或外部 citeturn0search1。
以上即 Docker、Flannel 与 kube-proxy (包含 KUBE-MARK-MASQ) 各自管理的 iptables 规则全貌,以及核心路由配置。请结合 iptables-save 与 ip route 输出逐条核对。
浙公网安备 33010602011771号