跳转至

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 等,但不能只按流行度选择。

必须规划的网段

Node 网段      节点自身地址
Pod CIDR       Pod 地址池
Service CIDR   ClusterIP 虚拟地址池
外部业务网段   用户、数据库、存储、负载均衡等

这些网段不能相互冲突,也不能与需要访问的现有网络冲突。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:

kubectl run net-debug --rm -it --restart=Never \
  --image=nicolaka/netshoot -- sh

生产环境应从内部可信 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/运行时启动顺序、残留设备、地址分配状态

官方参考:Kubernetes Services, Load Balancing and Networking