k8s网络
https://kubernetes.io/docs/concepts/services-networking/service/
https://kubernetes.io/docs/reference/node/kernel-version-requirements/

https://kubernetes.io/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/

calico:https://github.com/kubernetes-sigs/kubespray/issues/6289

https://kubernetes.io/docs/concepts/cluster-administration/networking/

https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/

https://kubernetes.io/zh-cn/docs/reference/networking/virtual-ips/

https://kubernetes.io/blog/2025/02/28/nftables-kube-proxy/

https://kubernetes.io/docs/tasks/administer-cluster/ip-masq-agent/

https://kubernetes.io/docs/tasks/administer-cluster/ip-masq-agent/

明白了,你希望我保留之前整理的 非 Service NodePort / ClusterIP / LVS 的 Pod 流量、内核模块、sysctl、观测方法,然后在这个基础上补充 Service 的 NodePort / ClusterIP / LVS 流量拆解、跨节点/非跨节点说明、kube-proxy 模式差异、观测方法,形成一份 完整文档。
我可以帮你整理成这样一个结构化文档:
Kubernetes Pod & Service 网络完整文档
1️⃣ 非 Service 流量(Pod → Pod / Pod → veth → bridge → netfilter → iptables)
| 流量类型 | 跨节点 | 流量路径 | 内核模块 | sysctl 参数 | 观测方法 | 官方文档 |
|---|---|---|---|---|---|---|
| Pod → Pod (同节点) | 否 | Pod eth0 → veth → cni bridge → netfilter → iptables → Pod | bridge, br_netfilter, nf_conntrack, ip_tables | net.bridge.bridge-nf-call-iptables=1net.ipv4.ip_forward=1 | `conntrack -L | grep <br>iptables -L -v -n` |
| Pod → Pod (跨节点, Flannel VXLAN/IPIP) | 是 | Pod eth0 → veth → cni → eth0 → overlay (vxlan/ipip) → 对端节点 cni → veth → Pod | vxlan, ipip, nf_conntrack | net.ipv4.ip_forward=1net.bridge.bridge-nf-call-iptables=1 | tcpdump -i flannel.1conntrack -L |
Flannel |
| Pod → Service → Pod | 否 | Pod → veth → cni bridge → netfilter → iptables DNAT → Pod | nf_conntrack, ip_tables, xt_conntrack | net.netfilter.nf_conntrack_max | `conntrack -L | grep ` |
2️⃣ Service 类型流量(NodePort / ClusterIP / LoadBalancer / ExternalTrafficPolicy / LVS/IPVS)
| Service 类型 | 跨节点 | kube-proxy 模式 | 流量路径 | 内核模块 | sysctl 参数 | 观测方法 | 官方文档 |
|---|---|---|---|---|---|---|---|
| ClusterIP | 否 | iptables / IPVS | Pod → veth → cni → bridge → netfilter → iptables DNAT → Pod | br_netfilter, ip_tables, nf_conntrack | net.bridge.bridge-nf-call-iptables=1 | `conntrack -L | grep ` |
| ClusterIP | 是 | iptables / IPVS | Pod → veth → cni overlay → eth0 → 网络 → 对端 overlay → cni → veth → Pod | vxlan/ipip, nf_conntrack | net.ipv4.ip_forward=1 | tcpdump -i flannel.1 |
ClusterIP跨节点 |
| NodePort | 否 | iptables / IPVS | 外部客户端 → Node eth0 → kube-proxy → iptables DNAT → Pod veth → cni → Pod | ip_tables, nf_conntrack | net.netfilter.nf_conntrack_max | `conntrack -L | grep ` |
| NodePort | 是 | iptables / IPVS | 外部客户端 → 任意 Node eth0 → kube-proxy → iptables DNAT → overlay → Pod | vxlan/ipip, ip_tables, nf_conntrack | net.ipv4.ip_forward=1 | tcpdump -i flannel.1 |
NodePort跨节点 |
| LoadBalancer | 跨节点 | iptables / IPVS | 外部客户端 → Cloud LB → NodePort → kube-proxy → iptables/IPVS → Pod | ip_vs, ip_tables, nf_conntrack | net.ipv4.vs.conntrack, net.netfilter.nf_conntrack_max | ipvsadm -Lnconntrack -L |
LoadBalancer |
| ExternalTrafficPolicy=Local | 跨节点 | iptables / IPVS | 外部客户端 → Node eth0 → kube-proxy → Pod(本节点 Pod) | ip_tables, nf_conntrack | net.netfilter.nf_conntrack_max | `conntrack -L | grep ` |
| LVS / IPVS | 跨节点 | IPVS | kube-proxy IPVS → nf_conntrack → Pod veth → cni → Pod | ip_vs, nf_conntrack | net.ipv4.vs.conntrack | ipvsadm -Lnconntrack -L |
IPVS |
3️⃣ 内核模块和 sysctl 参数总结
| 功能 | 模块 | sysctl | 用途 | 观测方法 |
|---|---|---|---|---|
| 桥接流量经过 netfilter | br_netfilter | net.bridge.bridge-nf-call-iptables=1 | Pod → Pod 通过 bridge 时经过 iptables | cat /proc/sys/net/bridge/bridge-nf-call-iptables |
| NAT / DNAT / SNAT | ip_tables, xt_conntrack | net.netfilter.nf_conntrack_max | kube-proxy 转发流量 | conntrack -L |
| Overlay / VXLAN | vxlan, ipip | net.ipv4.ip_forward=1 | 跨节点封装转发 | tcpdump -i flannel.1 |
| IPVS | ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh | net.ipv4.vs.conntrack | kube-proxy IPVS 模式 | ipvsadm -Ln |
明白,我可以帮你把之前整理的表格、模块/sysctl信息、跨节点/非跨节点流量、kube-proxy 模式依赖和观测方法全部合并成一份完整、官方可验证的文档,并附上官方链接。以下是合并后的版本:
Kubernetes 网络与内核模块 / sysctl 完整文档(跨节点 & 非跨节点)
1️⃣ 网络路径分类
| 场景 | 流量路径 | 核心作用 | 注意点 |
|---|---|---|---|
| 同节点 Pod → Pod | Pod eth0 → veth → cni0 / kube-bridge → netfilter → veth → Pod | L2 转发、Pod 内部通信 | 不跨物理网卡 |
| 跨节点 Pod → Pod | Pod eth0 → veth → cni0 → overlay 接口(flannel.1 / vxlan.calico / tunl0)→ 宿主 eth0 → 物理网络 → 对端节点 → overlay → cni0 → veth → Pod | L3 封装、跨节点路由 | 需要开启 IP Forward、Overlay 封装 |
| Service NodePort / ClusterIP / LVS | Pod → veth → cni0 → netfilter → ip_vs → nat/iptables → eth0 → 外部访问 | LVS/IPVS 负载均衡、iptables NAT | LVS 可 bypass iptables,依赖 ip_vs 模块 |
官方参考:
2️⃣ 内核模块 & sysctl 参数
| 功能 | 内核模块 | 关键 sysctl | 官方文档 |
|---|---|---|---|
| Linux Bridge L2 转发 | bridge, br_netfilter | /proc/sys/net/bridge/bridge-nf-call-iptablesbridge-nf-call-ip6tablesbridge-nf-call-arptables |
bridge-nf-call-iptables |
| CNI Overlay 封装 | vxlan, ipip, tunl0(Calico/Flannel) | /proc/sys/net/ipv4/ip_forward/proc/sys/net/ipv6/conf/all/forwarding |
VXLAN Linux Kernel Doc |
| iptables / Netfilter | nf_conntrack, ip_tables, ip6_tables, ebtables | /proc/sys/net/netfilter/nf_conntrack_maxnf_conntrack_tcp_timeout_established |
conntrack-HOWTO |
| LVS / IPVS | ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh | /proc/sys/net/ipv4/vs/conntrack_tcp_timeout_* |
IPVS Linux Kernel Doc |
| Kubernetes CNI 配置影响 | - | net.bridge.bridge-nf-call-iptables=1 |
Kubernetes Networking |
注意:不同场景关注的模块和 sysctl 不同。例如 LVS 流量可能绕过 netfilter,跨节点 Overlay 流量必须开启 IP Forward。
3️⃣ kube-proxy 模式与依赖
| kube-proxy 模式 | 模块依赖 | iptables / nftables | conntrack | 说明 |
|---|---|---|---|---|
| iptables | nf_conntrack, ip_tables | 必须 | 必须 | NAT 转发 ClusterIP / NodePort / LB |
| IPVS | ip_vs, nf_conntrack | 可选 | 必须 | IPVS 负载均衡会话跟踪 |
| LVS DR/NAT/TUN | ip_vs, nf_conntrack(可选) | 可选,仅 NAT/TUN | 可选 | DR 模式可绕过 netfilter,NAT/TUN 依赖 conntrack |
4️⃣ 流量表(跨节点 & 非跨节点)
| 流量类型 | 跨节点/非跨节点 | CNI / Overlay | 核心模块 | sysctl 关键参数 | conntrack 依赖 | iptables/nftables 依赖 | 说明 | 官方文档 |
|---|---|---|---|---|---|---|---|---|
| Pod → Pod | 非跨节点 | cni0 / veth / bridge | bridge |
net.bridge.bridge-nf-call-iptables=1 |
可选,仅当 netfilter 介入 | iptables/nftables:可选 | 同节点 Pod 流量经过 veth → bridge,可选择是否经过 netfilter | Kubernetes Networking |
| Pod → Pod | 跨节点 | flannel.1 / vxlan.calico / tunl0 | vxlan / ipip / tunl |
net.ipv4.ip_forward=1 |
可选 | iptables/nftables:通常不处理 | Overlay 封装负责跨节点,iptables 仅用于路由/NetworkPolicy | Kubernetes CNI Plugins |
| Service → Pod(ClusterIP / NodePort / LB) | 任意 | 任意 | nf_conntrack, ip_tables, br_netfilter |
net.bridge.bridge-nf-call-iptables=1 |
必须 | iptables 必须 | kube-proxy 通过 iptables NAT 转发 ClusterIP / NodePort / LB | Kubernetes Services |
| Service → Pod | 任意 | 任意 | ip_vs, ip_vs_rr/wrr/sh, nf_conntrack |
net.ipv4.vs.conntrack=1 |
必须 | iptables 可选 | IPVS 转发依赖 conntrack,会话跟踪,iptables 可不处理 | Kubernetes Services |
| NetworkPolicy | 任意 | 任意 | nf_conntrack, ip_tables / nftables |
net.bridge.bridge-nf-call-iptables=1 |
必须 | iptables/nftables 必须 | 网络策略必须通过 netfilter 过滤 Pod 流量 | Kubernetes NetworkPolicy |
5️⃣ 观测方法(官方可验证)
| 流量/模块 | 观测方法 |
|---|---|
| Pod veth | tcpdump -i vethXXX host <PodIP>,确认流量进出 Pod |
| 桥接流量 | tcpdump -i cni0 host <PodIP>,检查是否经过 bridge → netfilter;开启 bridge-nf-call-iptables 查看 iptables hit |
| Overlay 封装 | tcpdump -i flannel.1 host <PodIP>,或 ip -d link show flannel.1 查看 VXLAN/IPIP 封装 |
| iptables / nftables | iptables -L -v -n, nft list ruleset,看链规则命中计数 |
| conntrack | conntrack -L, conntrack -E 查看会话表和事件 |
| IPVS/LVS 会话 | cat /proc/net/ip_vs, ipvsadm -L -n |
| 物理网卡抓包验证 | tcpdump -i eth0 host <PodIP>,对比抓包顺序确认流量路径 |
官方文档参考:
✅ 结论:
-
非跨节点 Pod → Pod 流量可选择经过 iptables;跨节点流量主要依赖 Overlay 封装。
-
kube-proxy 模式决定 LVS/IPVS/iptable 使用和 conntrack 依赖。
-
NetworkPolicy 强制依赖 netfilter,无论跨节点或非跨节点。
-
通过 tcpdump、iptables hit counter、conntrack、IPVS stats 可以全链路观测流量。
明白,我给你整理一份完整、官方可验证、覆盖跨节点/非跨节点、LVS/iptables/Overlay/Flannel/CNI、模块/sysctl/观测方法的文档,并补充 Kubernetes 官方链接,确保可查可验证。
Kubernetes 网络路径与 Netfilter / iptables / LVS 完整文档
1️⃣ 网络路径分类
| 场景 | 流量路径 | 核心作用 | 注意点 |
|---|---|---|---|
| 同节点 Pod → Pod | Pod eth0 → veth → cni0 / kube-bridge → netfilter → veth → Pod | L2 转发、Pod 内部通信 | 不跨物理网卡 |
| 跨节点 Pod → Pod | Pod eth0 → veth → cni0 → overlay 接口(flannel.1 / vxlan.calico / tunl0)→ 宿主 eth0 → 物理网络 → 对端节点 → overlay → cni0 → veth → Pod | L3 封装、跨节点路由 | 需要开启 IP Forward、Overlay 封装 |
| Service NodePort / ClusterIP / LVS | Pod → veth → cni0 → netfilter → ip_vs → nat/iptables → eth0 → 外部访问 | LVS/IPVS 负载均衡、iptables NAT | LVS 可 bypass iptables,依赖 ip_vs 模块 |
Kubernetes 官方参考:
2️⃣ 内核模块 & sysctl 参数
| 功能 | 内核模块 | 关键 sysctl | 官方文档 |
|---|---|---|---|
| Linux Bridge L2 转发 | bridge, br_netfilter | /proc/sys/net/bridge/bridge-nf-call-iptablesbridge-nf-call-ip6tablesbridge-nf-call-arptables |
bridge-nf-call-iptables |
| CNI Overlay 封装 | vxlan, ipip, tunl0(Calico/Flannel) | /proc/sys/net/ipv4/ip_forward/proc/sys/net/ipv6/conf/all/forwarding |
VXLAN Linux Kernel Doc |
| iptables / Netfilter | nf_conntrack, ip_tables, ip6_tables, ebtables | /proc/sys/net/netfilter/nf_conntrack_maxnf_conntrack_tcp_timeout_established |
conntrack-HOWTO |
| LVS / IPVS | ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh | /proc/sys/net/ipv4/vs/conntrack_tcp_timeout_* |
IPVS Linux Kernel Doc |
| Kubernetes CNI 配置影响 | - | net.bridge.bridge-nf-call-iptables=1 |
Kubernetes Networking |
注意:不同场景关注的模块和 sysctl 不同。例如 LVS 流量可能绕过 netfilter,跨节点 Overlay 流量必须开启 IP Forward。
3️⃣ 观测方法(官方可验证)
A. 网桥流量是否经过 iptables / netfilter
-
使用 iptables hit counter(官方方法)
# 插入规则
iptables -I FORWARD -s <PodA_IP> -d <PodB_IP> -j ACCEPT
# 发送流量
ping <PodB_IP>
# 查看命中
iptables -L FORWARD -v -n
官方文档:iptables-HOWTO
-
使用 conntrack 检查状态跟踪
conntrack -L | grep <PodA_IP>
官方文档:conntrack-HOWTO
-
使用 NFLOG + tcpdump 验证
iptables -I FORWARD -s <PodA_IP> -d <PodB_IP> -j NFLOG --nflog-group 1
nflogd -d -g 1
tcpdump -i nflog:1
官方文档:libnetfilter_log
B. Overlay / Flannel / VXLAN 流量观察
# 抓包 Overlay 接口
tcpdump -i flannel.1 host <PodA_IP>
tcpdump -i vxlan.calico host <PodA_IP>
tcpdump -i tunl0 host <PodA_IP>
# 查看 VXLAN 信息
bridge fdb show
ip -d link show flannel.1
C. LVS / IPVS 流量观察
-
查看 LVS 会话表:
cat /proc/net/ip_vs
cat /proc/net/ip_vs_stats
-
使用 iptables hit counter 验证 NAT:
iptables -t nat -L -v -n
注意:LVS 直通模式可能绕过 iptables,需要使用 IPVS stats 或 conntrack 验证。
D. 物理网卡和 Pod veth 抓包验证
# 宿主节点 veth
tcpdump -i veth<hash> host <PodA_IP>
# 网桥接口
tcpdump -i cni0 host <PodA_IP>
# Overlay 接口
tcpdump -i flannel.1 host <PodA_IP>
# 宿主物理网卡
tcpdump -i eth0 host <PodA_IP>
-
对比抓包顺序,可确认流量路径
官方文档:tcpdump
E. Kubernetes 官方网络调试工具
我可以基于这个文档再画一个 完整示意图,展示:
-
Pod eth0 → veth → cni0 → flannel.1 → eth0 → LVS / 目标 Pod
-
标出每个环节可观测的方法(iptables hit counter / conntrack / NFLOG / tcpdump)
-
标出关键模块和 sysctl 影响点
浙公网安备 33010602011771号