Kubernetes 网络模型与 CNI¶
Kubernetes 定义网络模型,但不直接实现 Pod 网络。集群安装 CNI 网络插件后,kubelet/容器运行时在创建 Pod Sandbox 时调用 CNI,为 Pod 创建网卡、分配 IP、配置路由,并在插件支持时实现 NetworkPolicy 和 Service 转发。
网络模型¶
默认模型要求:
- 每个 Pod 有自己的网络命名空间和集群内唯一 IP。
- 同一 Pod 内多个容器共享 IP 和端口空间,通过
localhost通信。 - 不同节点上的 Pod 能直接通信,不依赖应用自己做 NAT。
- Node 能与本节点 Pod 通信。
Pod IP 仍是短暂地址;应用访问应通过 Service/DNS,不应把 Pod IP 写入配置。
CNI 创建 Pod 网络的过程¶
Scheduler 把 Pod 分配到 Node
→ kubelet 请求容器运行时创建 Pod Sandbox
→ 运行时调用 CNI ADD
→ CNI 创建 veth/设备并放入 Pod 网络命名空间
→ IPAM 分配 Pod IP
→ 配置路由、隧道/eBPF/策略
→ Pod Condition 获得网络就绪状态
删除 Pod 时调用 CNI DEL 释放网络资源。CNI 异常常导致 Pod 停在 ContainerCreating、无 IP、跨节点不通或 NetworkPolicy 不生效。
常见数据路径¶
| 流量 | 典型路径 |
|---|---|
| 同 Pod 容器间 | localhost,不经过 Service |
| 同节点 Pod 间 | veth/虚拟交换或 eBPF 数据路径 |
| 跨节点 Pod 间 | 节点路由、Overlay 隧道或 Underlay/BGP |
| Pod 到 Service | Service VIP 经 kube-proxy 或 CNI/eBPF 转发到 Endpoint |
| Pod 出集群 | 经过节点路由/NAT/出口网关,取决于方案 |
| 外部进集群 | LoadBalancer/NodePort/Ingress/Gateway → Service → Pod |
Overlay、Underlay 与路由¶
| 方案 | 特点 | 关注点 |
|---|---|---|
| Overlay | 使用 VXLAN/Geneve 等隧道封装跨节点流量 | 部署通用,但有封装开销和 MTU 问题 |
| Underlay/路由 | Pod 网段通过物理网络或 BGP 可路由 | 性能和可观测性较直观,但依赖网络规划 |
| eBPF 数据路径 | 在内核 eBPF 中实现转发、策略和可观测 | 能替代部分传统规则,仍需理解具体插件行为 |
插件选择应考虑数据中心网络、IPv4/IPv6、NetworkPolicy、加密、BGP、可观测性、性能、运维能力和 Kubernetes 版本支持。常见实现包括 Calico、Cilium 等,但不能只按流行度选择。
必须规划的网段¶
这些网段不能相互冲突,也不能与需要访问的现有网络冲突。Overlay 方案还要考虑底层网络 MTU;封装后报文超过路径 MTU 会出现小包正常、大包超时、TLS/上传异常等隐蔽问题。
组件与资源检查¶
kubectl get nodes -o wide
kubectl get pods -n kube-system -o wide
kubectl get daemonset -n kube-system
kubectl get pod <pod> -n <namespace> -o wide
kubectl describe pod <pod> -n <namespace>
根据具体插件查看它的 DaemonSet、Operator 和日志。不要假定插件 Pod Running 就代表数据面正常,还要做同节点、跨节点、Service、DNS 和出口连通测试。
分层排障¶
Pod 是否获得 IP
→ 同 Pod localhost
→ 同节点 Pod IP
→ 跨节点 Pod IP
→ Service ClusterIP
→ CoreDNS 名称
→ Ingress/Gateway 外部入口
→ NetworkPolicy / 防火墙 / MTU
可使用经过授权的临时调试 Pod:
生产环境应从内部可信 Registry 固定调试镜像版本,并限制权限。调试时记录源 Pod、目的 IP/端口、节点和 NetworkPolicy,避免只说“网络不通”。
常见故障¶
| 现象 | 优先检查 |
|---|---|
| Pod 一直 ContainerCreating | Pod Event、CNI DaemonSet、IP 地址池耗尽、节点 CNI 配置 |
| 同节点通、跨节点不通 | 节点路由、隧道端口、防火墙、BGP、MTU |
| Pod IP 通,Service 不通 | EndpointSlice、Service selector、kube-proxy/CNI Service 数据面 |
| 小请求正常,大请求卡住 | MTU、分片、隧道封装和防火墙 MSS |
| NetworkPolicy 创建后无效果 | CNI 是否实现 NetworkPolicy;Pod Label/Namespace Selector |
| 节点重启后部分 Pod 无网络 | CNI/运行时启动顺序、残留设备、地址分配状态 |