直接回答:K8s 网络模型有三条硬性要求:任意两个 Pod 之间不经过 NAT 直接通信;节点和 Pod 之间不经过 NAT 直接通信;Pod 看到的自己的 IP 和别人看到的它的 IP 一致。每个 Pod 一个独立 IP(IP-per-Pod),这是与 Docker 单机端口映射模型的本质区别,让应用迁移时不用改端口架构。

CNI 的实现机制:kubelet 创建 Pod 时先建一个 pause 容器持有 network namespace,然后调用 CNI 插件(二进制 + 配置文件)为这个 netns 配网。插件做三件事:从 IPAM 分配 IP、在 netns 里创建 veth pair 一端给 Pod 一端接宿主、配置路由让 Pod 流量正确进出。跨节点通信分两大流派:一是 overlay 封装(VXLAN),如 Flannel、Calico 的 VXLAN 模式——Pod 包被封装进 UDP 隧道,对底层网络零要求但多一次封解包开销;二是路由模式(underlay),如 Calico BGP、Cilium 的 native routing——把 Pod 网段路由宣告到物理网络或云 VPC 路由表,性能接近原生但要求底层网络支持。eBPF 方案(Cilium)更进一步,用 eBPF 程序在内核直接处理转发、负载均衡和 NetworkPolicy,绕开 iptables 链路过长的性能问题。

排障视角:Pod 不通时按层查——本节点 veth/cni0 或 cilium 设备是否存在、跨节点隧道或路由表是否正确、kube-proxy 的 Service 规则、最后才是 NetworkPolicy 和 DNS。

追问方向:IPAM 的 IP 池如何划分,节点扩容时如何避免 IP 耗尽?VXLAN 的 MTU 为什么要调小?Service 的 ClusterIP 在 Cilium eBPF 模式下如何转发?

(约 850 字)