flannel网络2

已思考 11 秒

以下汇总了 DockerFlannel (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 的限制 citeturn0search0turn0search2。


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/PREROUTINGnat/OUTPUT 中创建 DOCKER 链,将 HostPort DNAT 到容器内部 citeturn0search0。

  • 对 所有离开 docker0 网桥 的容器流量执行 MASQUERADE SNAT,保证容器对外访问正常 citeturn0search0。

  • filter/FORWARD 使用多条规则允许容器间(docker0 内部)及容器到 Host 及外部的转发,并预留 DOCKER-USER 链供用户自定义隔离 citeturn0search0。


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 的所有流量,保证隧道包可解封装 citeturn0search1。

  • filter/FORWARD 放行源自或目标为 Pod 网络 (192.168.128.0/18) 的转发流量,支持跨节点 Pod 通信 citeturn0search1。

  • nat/POSTROUTING 钩子创建 FLANNEL-POSTRTG 链,对 Pod 出网流量做 MASQUERADE SNAT,使 Pod 能访问外部网络 citeturn0search1。


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 范围并分发 citeturn0search0。

  • KUBE-NODEPORTS 处理 NodePort 和 LoadBalancer 类型服务外部入口,将流量跳转到相应 KUBE-SVC-* 链 citeturn0search0。

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-* 链,实现简单的负载均衡 citeturn0search3。

  • KUBE-SEP-* 链代表后端 Pod,每条规则先跳转到 KUBE-MARK-MASQ,再做 DNAT → Pod IP:Port citeturn0search0。

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 限制 citeturn0search0turn0search2。


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 路由到对应节点或外部 citeturn0search1。


以上即 DockerFlannelkube-proxy (包含 KUBE-MARK-MASQ) 各自管理的 iptables 规则全貌,以及核心路由配置。请结合 iptables-saveip route 输出逐条核对。

posted on 2025-04-24 20:20  吃草的青蛙  阅读(50)  评论(0)    收藏  举报

导航