3. 网络策略基础:CiliumNetworkPolicy 与 Kubernetes NetworkPolicy 的区别、策略层级

在集群升级过程中,网络策略是保障镜像拉取和数据传输安全的关键防线。Kubernetes 原生提供了 NetworkPolicy 资源,而 Cilium 在此基础上扩展出更强大的 CiliumNetworkPolicy 和 CiliumClusterwideNetworkPolicy。理解两者的区别以及策略的层级关系,是设计安全、高效的升级网络模型的前提。

3.1 Kubernetes NetworkPolicy 的局限性

Kubernetes 原生 NetworkPolicy 是一个 有状态、L3/L4 层 的防火墙规则,它通过 podSelector、namespaceSelector 和 ipBlock 来控制 Pod 之间的流量。然而,它在生产环境中存在明显的功能缺口:

  • 仅支持 L3/L4:无法基于 HTTP 方法、API 路径、gRPC 服务等 L7 协议进行过滤。
  • 仅支持 Ingress/Egress:无法实现基于 DNS 名称的策略,也无法对集群外部的流量进行精细控制。
  • 无集群范围策略:无法定义跨命名空间的全局默认策略,导致每个命名空间都需要重复配置。
  • 无端点级粒度:策略作用于 Pod 标签,无法针对 Pod 内的特定容器或进程进行隔离。
升级场景提示: 在集群升级期间,如果仅依赖 Kubernetes NetworkPolicy,当节点滚动升级导致 Pod 重建或 IP 变化时,原生策略的 ipBlock 规则可能失效,造成镜像拉取中断。Cilium 的基于身份的安全模型可以避免此问题。

3.2 CiliumNetworkPolicy 的核心增强

CiliumNetworkPolicy (CNP) 完全兼容 Kubernetes NetworkPolicy 的语义,并在此基础上引入了以下关键能力:

能力维度 Kubernetes NetworkPolicy CiliumNetworkPolicy
协议层 L3/L4 (TCP, UDP, SCTP) L3/L4 + L7 (HTTP, gRPC, Kafka, DNS)
身份标识 基于 Pod 标签 + Namespace 标签 基于 安全身份 (Security Identity),与 Pod 标签解耦
规则匹配 podSelector, namespaceSelector, ipBlock 支持以上所有 + toFQDN, toServices, toEntities
端点粒度 Pod 级别 Pod 级别 + 容器级别 (通过 endpointSelector 结合容器标签)
集群范围 不支持 支持 CiliumClusterwideNetworkPolicy (CCNP)
日志与可观测性 无原生支持 集成 Hubble,支持 L7 请求/响应日志、指标和监控
关键差异: Cilium 使用 基于身份 (Identity-based) 的安全模型,而非基于 IP。这意味着即使 Pod 在升级过程中被重新调度到不同节点并获得新 IP,只要其标签不变,安全身份就保持不变,策略规则依然生效。这对于升级过程中镜像仓库的稳定访问至关重要。

3.3 策略层级:从集群到端点

Cilium 将网络策略划分为三个清晰的层级,遵循 “从宽到严、从全局到局部” 的叠加原则。策略的生效顺序为:集群范围策略 → 命名空间范围策略 → 端点级策略。

Cilium 网络策略层级架构 层级 1:集群范围策略 (CCNP) 资源类型:CiliumClusterwideNetworkPolicy 作用域:整个集群所有命名空间的所有 Pod 典型用途:全局默认拒绝、全局 DNS 规则、全局审计策略 叠加 层级 2:命名空间范围策略 (CNP) 资源类型:CiliumNetworkPolicy 作用域:单个命名空间内的 Pod 典型用途:微服务间 L7 访问控制、数据库白名单、API 网关策略 叠加 层级 3:端点级策略 (细粒度) 通过 CNP/CCNP 中的 endpointSelector 结合容器标签实现 典型用途:Sidecar 容器与主容器隔离、特定进程访问控制

3.4 层级策略的叠加与冲突处理

当多个层级的策略同时存在时,Cilium 遵循以下规则:

  • 白名单叠加模型:所有层级的策略规则取 并集。只要任何一个层级的策略允许某流量,该流量就被允许。
  • 默认拒绝:一旦在某个层级应用了策略,该层级覆盖的端点将默认拒绝所有未显式允许的流量。
  • 优先级:没有显式的优先级数字,但 更具体的匹配规则优先。例如,针对特定 Pod 的 L7 规则会覆盖针对命名空间的通用 L4 规则。
升级风险点: 在集群升级前,务必检查是否存在 隐式冲突。例如,CCNP 中定义了一条允许所有 Pod 访问镜像仓库的规则,但某个命名空间的 CNP 中定义了一条拒绝所有 Egress 流量的规则。由于 Cilium 采用白名单叠加模型,最终结果是允许访问镜像仓库。如果期望的是严格隔离,则需要调整策略设计。

3.5 策略层级在镜像拉取场景中的应用

在集群升级过程中,镜像拉取流量通常涉及以下组件:

  1. kubelet:在节点上负责拉取镜像。
  2. 镜像仓库:可能是集群内的 Harbor 或集群外的 Docker Hub / 云厂商仓库。
  3. 代理/缓存:如配置了镜像加速器或分布式缓存。

利用 Cilium 的策略层级,可以设计出既安全又灵活的升级网络模型:

策略层级 推荐规则 目的
CCNP (集群范围) 允许所有节点 (通过 toEntities: host) 访问集群内镜像仓库的 443 端口 确保升级过程中所有节点都能拉取基础镜像
CNP (命名空间范围) 在 kube-system 命名空间中,允许 kubelet 访问镜像仓库的 DNS 解析 避免 DNS 解析被阻断导致镜像拉取失败
端点级 针对特定升级 Job Pod,允许其访问外部仓库的特定 API 路径 精细控制升级过程中的数据传输范围
最佳实践: 在升级前,使用 Cilium 的 cilium connectivity test 命令验证策略是否按预期生效。重点关注 toFQDN 规则是否覆盖了镜像仓库的域名,以及 toEntities: host 是否允许了节点流量。

3.6 小结