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 → 设置路由与策略。
实战要点: 蓝绿发布切换时,新版本 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 策略生效流程
- 策略解析: kube-controller-manager 中的 networkpolicy controller 监听 NetworkPolicy 资源变化。
- 规则下发: 调用 CNI 插件(如 calico-kube-controllers)将策略转换为数据面规则。
- 规则注入: 在宿主机上写入 iptables 链(Calico 的 felix 组件)或 eBPF map。
- 实时生效: 所有进出 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 流水线在发布前注入、回滚时切换,确保网络层面的安全与一致性。