4. CNI 网络基础:CNI 插件架构、常见 CNI 对比与网络策略

在 Kubernetes 集群中,Pod 网络是调度与通信的基石。CNI(Container Network Interface)作为容器运行时与网络实现之间的标准接口,决定了 Pod 如何获取 IP、如何连通以及如何被隔离。本章将深入 CNI 插件架构,对比主流方案(Calico / Flannel / Weave),并解析网络策略(NetworkPolicy)的底层生效机制,为后续蓝绿发布中的流量切换与回滚防护建立网络视角。

4.1 CNI 插件架构与调用链路

CNI 插件本质是一个可执行二进制文件,由 kubelet 在创建 Pod 时按标准流程调用。整个调用链路分为三个阶段:ADD(添加网络)、DEL(删除网络)、CHECK(网络状态检查)。

关键流程: kubelet → CRI(如 containerd)→ 调用 CNI 插件 → 配置网络命名空间 → 分配 IP → 设置路由与策略。
CNI 插件调用链路(ADD 阶段) kubelet CRI (containerd) CNI 插件 网络命名空间 CNI 插件内部子流程 1. 读取 CNI 配置文件(/etc/cni/net.d/*.conf) 2. 调用 IPAM 插件(host-local / dhcp / calico-ipam)分配 IP 3. 创建 veth pair,一端放入 Pod netns,一端接入宿主机 bridge/路由 4. 配置静态路由、ARP 代理、iptables/ebpf 规则 5. 返回接口信息(IP、MAC、路由表)给 kubelet
实战要点: 蓝绿发布切换时,新版本 Pod 的 IP 由 CNI 插件在 ADD 阶段分配。如果 CNI 插件响应超时或 IP 池耗尽,Pod 将无法进入 Ready 状态,导致发布阻塞。建议在发布前通过 kubectl get events -n 检查 CNI 相关事件。

4.2 常见 CNI 方案对比:Calico / Flannel / Weave

三种主流 CNI 插件在数据面实现、网络模型、性能与功能上存在显著差异。下表从蓝绿发布与回滚防护的视角进行对比:

特性维度 Calico Flannel Weave
数据面 纯三层路由(BGP / eBPF) Overlay(VXLAN / host-gw) Overlay(fastdp / weave-kube)
网络模型 每个 Pod 分配集群可路由 IP Pod IP 在 Overlay 隧道内通信 Pod IP 通过 weave router 封装
NetworkPolicy 支持 原生支持(iptables / eBPF) 不支持(需配合其他组件) 原生支持(内置策略引擎)
性能(吞吐/延迟) 高(接近宿主机网络) 中(Overlay 封装开销) 中(fastdp 模式较好)
回滚场景优势 IP 固定 + 策略隔离,回滚时流量可精确控制 简单轻量,回滚时网络重建快 加密通信,回滚时数据面安全
运维复杂度 较高(需维护 BGP / eBPF 配置) 低(开箱即用) 中(需管理 weave peers)
选型建议: 对于需要精细网络策略的蓝绿发布场景(如金融、电商),推荐 Calico。Flannel 适合对策略无要求、追求简单部署的开发测试环境。Weave 在跨集群加密通信场景有独特优势,但大规模集群下性能不如 Calico。

4.3 网络策略(NetworkPolicy)基础与生效机制

NetworkPolicy 是 Kubernetes 原生的网络隔离资源,通过选择器(PodSelector / NamespaceSelector / IPBlock)定义哪些 Pod 可以互相通信。其底层实现依赖 CNI 插件的数据面规则(iptables / eBPF / ipset)。

4.3.1 策略结构

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

4.3.2 策略生效流程

  1. 策略解析: kube-controller-manager 中的 networkpolicy controller 监听 NetworkPolicy 资源变化。
  2. 规则下发: 调用 CNI 插件(如 calico-kube-controllers)将策略转换为数据面规则。
  3. 规则注入: 在宿主机上写入 iptables 链(Calico 的 felix 组件)或 eBPF map。
  4. 实时生效: 所有进出 Pod 的流量经过规则匹配,不匹配则丢弃。
NetworkPolicy 生效流程(以 Calico 为例) NetworkPolicy YAML calico-kube-controllers Felix (节点代理) iptables / eBPF 回滚场景中的 NetworkPolicy 作用 • 蓝绿发布期间,为旧版本(蓝)Pod 设置隔离策略,防止新版本(绿)异常流量污染旧版本。 • 回滚时,快速删除新版本策略,恢复旧版本策略,确保流量路径立即切换回蓝版本。 • 策略变更通过 CNI 数据面实时生效,无需重启 Pod,回滚延迟可控制在秒级。

4.3.3 常见策略模式

模式 YAML 关键字段 适用场景
默认拒绝所有入站 podSelector: {} + policyTypes: [Ingress] 安全基线,防止未授权访问
允许同命名空间通信 from: [namespaceSelector: {matchLabels: {kubernetes.io/metadata.name: same}}] 微服务内部调用
允许特定 IP 段 from: [ipBlock: {cidr: 10.0.0.0/16}] 监控系统 / CI/CD 访问
多端口多来源 ports: [{port: 80}, {port: 443}] + 多个 from 条目 Web 服务同时暴露 HTTP/HTTPS
验证命令: 使用 kubectl describe networkpolicy <name> -n <ns> 查看策略详情;使用 kubectl run test-pod --image=busybox --rm -it -- sh 进入临时 Pod 测试连通性,确认策略是否生效。

4.4 本章小结

  • CNI 插件是 Kubernetes 网络的核心扩展点,ADD/DEL/CHECK 三阶段决定了 Pod 网络的创建与销毁。
  • Calico 适合需要网络策略与高性能的蓝绿发布场景;Flannel 适合简单 Overlay 网络;Weave 在加密通信场景有优势。
  • NetworkPolicy 通过 CNI 数据面实时生效,是蓝绿发布中实现流量隔离与回滚防护的关键手段。
  • 在回滚自动化中,应提前设计好策略模板,通过 CI/CD 流水线在发布前注入、回滚时切换,确保网络层面的安全与一致性。