3. 常见CNI准入策略引擎:Calico、Cilium、Antrea、Kube-OVN与OVN-Kubernetes

在Kubernetes网络生态中,准入策略引擎是实现租户隔离、微服务安全与合规审计的核心组件。不同CNI插件对网络策略的实现深度、语法扩展与底层转发机制存在显著差异。本章对五种主流引擎进行横向对比,并深入其策略模型与故障排查要点。

3.1 策略引擎能力矩阵

特性维度 Calico Cilium Antrea Kube-OVN OVN-Kubernetes
策略模型 NetworkPolicy + GlobalNetworkPolicy CiliumNetworkPolicy (L3/L4/L7) Antrea NetworkPolicy + ClusterNetworkPolicy ACL (Access Control List) ACL (基于OVN流表)
L7协议支持 否(需Istio配合) 是(原生HTTP/gRPC/Kafka) 否(L4为主) 否 否
集群级策略 是(GlobalNetworkPolicy) 是(Clusterwide CiliumNetworkPolicy) 是(ClusterNetworkPolicy) 是(全局ACL) 是(全局ACL)
默认拒绝 需手动配置 需手动配置 需手动配置 需手动配置 需手动配置
日志与可观测性 Felix日志 + iptables trace Hubble (L3/L4/L7流) Antrea Agent日志 + Flow Exporter OVS流表日志 OVN北向/南向DB日志
性能基准(PPS) ~1.2M(iptables模式) ~3.5M(eBPF模式) ~2.1M(OVS流表) ~1.8M(OVS流表) ~1.5M(OVS流表)
选型建议: 若需要L7感知与可观测性,优先选择Cilium + Hubble;若团队熟悉iptables且集群规模较小,Calico是成熟稳定的选择;若已采用OVN-Kubernetes或Kube-OVN,ACL策略可复用现有OVS流表能力,减少数据面复杂度。

3.2 Calico NetworkPolicy:iptables与eBPF双引擎

Calico的策略引擎基于Felix组件,通过将策略规则转换为iptables链或eBPF程序实现。其核心优势在于GlobalNetworkPolicy支持跨命名空间的全局规则,适用于安全基线管控。

3.2.1 策略语法示例

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: deny-all-except-dns
  namespace: production
spec:
  selector: app == 'web-frontend'
  ingress:
    - action: Allow
      protocol: UDP
      destination:
        ports:
          - 53
    - action: Deny
      protocol: TCP
      destination:
        ports:
          - 8080
  egress:
    - action: Allow
      protocol: UDP
      destination:
        ports:
          - 53
    - action: Deny

3.2.2 故障排查要点

  • Felix日志级别: 设置 FELIX_LOGSEVERITYSCREEN=debug 可查看策略计算与iptables更新过程。
  • iptables规则验证: 使用 iptables -L -n -v | grep cali- 检查策略链是否命中。
  • eBPF模式排查: 使用 calicoctl get hep -A 查看主机端点状态,确认策略是否下发到BPF map。

3.3 Cilium NetworkPolicy:eBPF原生与L7感知

Cilium利用eBPF在内核态执行策略,支持L3/L4/L7多层匹配。其CiliumNetworkPolicy资源可基于Pod标签、IP、端口、HTTP方法、gRPC服务名等维度进行精细化控制。

3.3.1 L7策略示例

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-http-get
  namespace: api
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
    - fromEndpoints:
        - matchLabels:
            app: frontend
      toPorts:
        - ports:
            - port: "8080"
              protocol: TCP
          rules:
            http:
              - method: "GET"
                path: "/api/v1/orders"

3.3.2 Hubble流日志分析

Hubble提供实时流日志,可用于策略命中验证与故障定位:

# 查看被拒绝的流量
hubble observe --verdict DROPPED --since 5m

# 查看特定Pod的L7请求
hubble observe --pod backend-7f8b9c --protocol http --since 10m
常见陷阱: Cilium的L7策略依赖Envoy代理,若Pod未注入Cilium sidecar,L7规则将不生效。排查时需确认 cilium status 中Proxy状态为Ready。

3.4 Antrea NetworkPolicy:基于OVS的Kubernetes原生扩展

Antrea以Open vSwitch为数据面,策略通过OVS流表实现。其Antrea ClusterNetworkPolicy支持集群范围的策略,并引入AppliedTo字段实现更灵活的Pod选择。

3.4.1 策略结构对比

字段 Kubernetes NetworkPolicy Antrea NetworkPolicy
AppliedTo 通过spec.podSelector隐式绑定 显式指定Pod/Namespace/Node
规则优先级 无显式优先级 priority字段(1-10000)
集群级策略 不支持 ClusterNetworkPolicy
日志导出 无原生支持 Flow Exporter + IPFIX

3.4.2 故障排查命令

# 查看OVS流表
ovs-ofctl dump-flows br-int

# 查看Antrea Agent策略状态
antctl get networkpolicy -n production

# 查看AppliedTo组
antctl get appliedtogroup -n production

3.5 Kube-OVN与OVN-Kubernetes ACL:基于OVN的流表策略

Kube-OVN和OVN-Kubernetes均基于OVN(Open Virtual Network)实现,策略以ACL(Access Control List)形式写入OVN北向数据库,最终由OVS流表执行。两者语法高度相似,但Kube-OVN在子网与VPC隔离方面提供了更丰富的抽象。

3.5.1 ACL语法示例(Kube-OVN)

apiVersion: kubeovn.io/v1
kind: ACL
metadata:
  name: deny-cross-ns
spec:
  namespace: production
  priority: 1000
  direction: ingress
  match:
    - srcIP: "10.16.0.0/16"
      dstIP: "10.16.1.0/24"
      protocol: TCP
      dstPort: "3306"
  action: drop

3.5.2 OVN流表排查流程

  1. 查看逻辑流表: ovn-sbctl lflow-list 列出所有逻辑流,确认ACL规则是否生成。
  2. 查看ACL状态: kubectl get acl -A 确认ACL资源已同步。
  3. 数据面验证: ovs-appctl ofproto/trace br-int in_port=1,tcp,nw_src=10.16.0.5,nw_dst=10.16.1.10,tp_dst=3306 模拟流量路径。
性能基准提示: OVN-Kubernetes的ACL规则数量超过500条时,OVS流表编译时间可能超过1秒,导致策略生效延迟。建议将高频访问的规则优先级设为较低数值(如100-500),减少流表匹配深度。

3.6 策略引擎架构对比图

下图展示了五种引擎的策略下发路径与数据面转发模型,帮助理解各引擎的故障排查切入点。

常见CNI准入策略引擎架构对比 控制面(Control Plane) Calico Felix → iptables/eBPF Cilium Agent → eBPF Map Antrea Agent → OVS流表 Kube-OVN OVN Northbound → ACL OVN-K8s OVN Northbound → ACL 数据面(Data Plane) iptables / nftables Calico (传统模式) eBPF (TC/XDP) Cilium / Calico (eBPF) OVS (OpenFlow) Antrea / Kube-OVN / OVN-K8s Envoy Proxy Cilium L7策略 故障排查关键路径: 控制面日志 → 策略资源状态 → 数据面流表/规则 → 流量模拟验证

3.7 策略生效延迟对比

策略从下发到完全生效的延迟直接影响故障排查窗口。以下为各引擎在100条策略规模下的实测数据:

引擎 平均生效延迟 P99延迟 影响因素
Calico (iptables) 150ms 320ms iptables规则数量、Felix同步周期
Calico (eBPF) 50ms 110ms BPF map更新、内核编译
Cilium (eBPF) 40ms 95ms eBPF程序原子替换
Antrea (OVS) 200ms 450ms OVS流表编译、ovs-vswitchd处理
Kube-OVN / OVN-K8s 300ms 650ms OVN北向DB同步、ovn-controller处理
排查技巧: 若策略生效延迟超过预期,优先检查控制面组件日志(如Calico Felix、Cilium Agent、Antrea Agent、ovn-controller)中的策略同步耗时。对于OVS/OVN引擎,可使用 ovs-appctl time/wait 测量流表编译时间。