总结

  1. 集群级/节点级的网段划分(IPAM)
  2. 容器启动时的网络命名空间配置

核心机制: IPAM

Tip

CNI 插件通常会内置或调用一个 IPAM(IP Address Management) 插件。它的主要职责是管理和分配 IP 资源,防止 IP 冲突

  1. Host-Local 模式(按节点分段,如 Flannel / Calico 默认)
    • 原理:在集群部署时,会定义一个巨大的集群 Pod 网段(Cluster CIDR,例如 10.244.0.0/16)。
    • 节点划分:Kubernetes 的 kube-controller-manager 会为每个加入集群的 Node 节点分配一个子网段(Node CIDR,例如 Node A 分配 10.244.1.0/24,Node B 分配 10.244.2.0/24)。
    • 本地分配:当 Pod 被调度到某个 Node 上时,该节点上的 CNI 插件只需从自己本地的这个子网段中挑一个未使用的 IP 分配给 Pod 即可。这种方式速度极快,不需要全局加锁。
  2. Cilium / Calico CRD 模式(全局/动态分配)
    • 原理:不固定节点网段,而是通过自定义资源(CRD,如 Calico 的 IPPool)来全局管理 IP。
    • 动态申请:节点上的 CNI 代理会动态地向集群申请一块 IP 块(Block),用完后再申请,这样可以提高 IP 的利用率,适合大规模集群。

分配流程

[kubelet] 
   │ (1) 调用 CRI 创建容器 (创建 Network Namespace)
   ▼
[Container Runtime (如 Containerd)]
   │ (2) 读取 CNI 配置,调用 CNI 插件
   ▼
[CNI 插件 (如 Calico/Flannel 二进制文件)]
   │ (3) 调用 IPAM 插件获取可用 IP
   ├──────────────────────────────► [IPAM 插件] (从本地网段/CRD 中挑一个 IP)
   │ (4) 创建 veth pair,一端挂宿主机,一端塞入容器
   │ (5) 在容器内配置 IP、网关和路由
   ▼
[Pod 成功获取 IP 并联网]

详细步骤

  1. 创建网络命名空间:
    kubelet 调度 Pod 到节点后,通过 CRI(容器运行时接口)通知容器运行时(如 Containerd/Docker)创建 Pod 的基础设施容器(Pause 容器)。此时,容器运行时会为该 Pod 创建一个独立的网络命名空间(Network Namespace)。
  2. 触发 CNI 插件:
    容器运行时去读取节点上的 CNI 配置文件(通常在 /etc/cni/net.d/),然后调用标准的 CNI 二进制文件(通常在 /opt/cni/bin/),并传入操作指令 ADD 以及该 Pod 的网络命名空间路径。
  3. 获取 IP 地址:
    CNI 插件收到 ADD 请求后,调用 IPAM 插件。IPAM 根据上文提到的机制(如查找本地已分配的子网数据库),计算出一个当前未被占用的 IP 地址,并将其返回给 CNI 插件。
  4. 管道搭建(veth pair):
    CNI 插件在宿主机上创建一对虚拟网卡(veth pair,就像一根虚拟网线,数据从一端进,必从另一端出)。
    • 将 veth pair 的一端留在宿主机上(例如命名为 caliXXXX 或 vethXXXX),并挂载到宿主机的网桥或路由表中。
    • 将 veth pair 的另一端“塞入” Pod 的网络命名空间内,并重命名为 eth0。
  5. 配置网络与绑定:
    CNI 插件在 Pod 的网络命名空间内,将刚刚从 IPAM 获取到的 IP 地址绑定到 eth0 网卡上,并配置默认网关(指向宿主机端的虚拟网卡或网桥)。
  6. 状态上报:
    CNI 插件将分配好的 IP 信息以 JSON 格式返回给容器运行时,容器运行时再上报给 kubelet。最后,kubelet 将该 IP 更新到 Pod 的 status.podIP 中,同步到 etcd,此时通过 kubectl get pod -o wide 就能看到这个 IP 了。

对比

CNI 插件默认 IPAM 机制IP 存储在哪里?底层网络原理
Flannelhost-local存储在宿主机的本地文件/本地缓存Overlay 隧道(默认 VXLAN),通过封包实现跨节点通信。
Calicocalico-ipam存储在 etcd(作为 Kubernetes CRD 存储)三层路由(BGP / IPIP)。Pod IP 也是一个真正的路由条目,节点间直接通过路由表转发。
Ciliumcilium-ipam存储在 etcd / 动态分配eBPF 技术。在内核层直接绕过传统的 iptables,通过 eBPF 路由和分配 IP,性能最高。