3. 多租户网络拓扑基础:Kubernetes网络模型、CNI插件(Calico/Cilium)与租户隔离原理

在多租户 Argo CD 部署中,网络拓扑是故障隔离与安全通信的基石。Kubernetes 原生的扁平网络模型无法直接满足租户间的严格隔离需求,必须借助 CNI 插件的网络策略与隧道技术来实现。本节将深入剖析 Kubernetes 网络模型的核心约束、主流 CNI 插件(Calico / Cilium)的隔离机制,以及多租户场景下的网络拓扑设计原则。

3.1 Kubernetes 网络模型核心约束

Kubernetes 对集群网络提出了三个基本要求,所有 CNI 插件都必须满足:

  • Pod-to-Pod 直接通信:任意 Pod 无需 NAT 即可通过 IP 地址直接访问集群内其他 Pod。
  • Node-to-Pod 直接通信:节点上的 kubelet 或系统组件可直接访问 Pod IP。
  • Pod 看到的 IP 与集群内其他组件看到的 IP 一致:不存在地址转换或代理导致的 IP 不一致。

这种扁平模型天然缺乏租户边界,任何 Pod 默认都能访问集群内所有其他 Pod,因此必须通过 NetworkPolicy 和 CNI 插件级隔离 来构建多租户网络拓扑。

关键认知: Kubernetes 网络模型只解决了连通性,未解决隔离性。多租户场景下,网络拓扑设计的核心任务是在扁平模型之上叠加租户专属的隔离域。

3.2 CNI 插件对比:Calico vs Cilium

Calico 和 Cilium 是当前生产环境中最主流的两款 CNI 插件,它们在多租户隔离的实现路径上有显著差异。

特性维度 Calico Cilium
数据平面 Linux 内核 iptables / eBPF(可选) eBPF(原生)
网络策略引擎 Felix 策略控制器 + iptables 规则 eBPF 程序直接挂载到网络钩子
租户隔离粒度 Namespace + NetworkPolicy + 全局网络策略 Namespace + CiliumNetworkPolicy + 身份标识(Identity)
加密支持 WireGuard(节点间) IPsec / WireGuard(透明加密)
可观测性 流日志(需额外组件) Hubble(内置,L3/L4/L7 全栈)
多集群互联 Calico Enterprise / 手动 BGP ClusterMesh(原生多集群服务发现)
选型建议: 如果团队对 eBPF 技术栈熟悉且需要 L7 可观测性,优先选择 Cilium;如果已有 iptables 运维经验且对加密要求简单,Calico 是更稳妥的选择。

3.3 租户隔离原理:从 NetworkPolicy 到租户网络域

多租户网络隔离的实现分为三个层次:

  1. Namespace 级隔离:每个租户独占一个或多个 Namespace,通过 RBAC 限制跨 Namespace 的 Pod 访问。
  2. NetworkPolicy 精细化控制:定义入站(ingress)和出站(egress)规则,允许或拒绝特定 IP 段、标签选择器或端口。
  3. CNI 插件级租户域:利用 CNI 插件的扩展能力(如 Calico 的 GlobalNetworkPolicy、Cilium 的 CiliumClusterwideNetworkPolicy)实现跨 Namespace 的租户统一策略。

以下是一个典型的租户隔离 NetworkPolicy 示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-isolation
  namespace: tenant-a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          tenant: tenant-a
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          tenant: tenant-a
    - ports:
      - port: 53
        protocol: UDP
      - port: 53
        protocol: TCP
常见陷阱: 仅依赖 Namespace 标签选择器是不够的。攻击者可能通过创建带有相同标签的 Namespace 来绕过隔离。生产环境应结合 CNI 插件的身份认证机制(如 Cilium Identity)或服务网格(如 Istio)来加固租户边界。

3.4 多租户网络拓扑架构图

下图展示了基于 Cilium 的多租户网络拓扑结构,包含两个租户域、共享服务域以及 Argo CD 控制平面:

多租户网络拓扑架构图(Cilium 实现) 多租户网络拓扑架构(Cilium 实现) 租户 A 域 Pod A-1 (app) Pod A-2 (db) NetworkPolicy: 仅允许 tenant-a 标签 租户 B 域 Pod B-1 (web) Pod B-2 (cache) NetworkPolicy: 仅允许 tenant-b 标签 共享服务域 DNS (CoreDNS) Argo CD 监控 (Prom) Cilium 控制平面 eBPF 程序 · Identity 管理 · 策略分发 租户间流量默认被 Cilium NetworkPolicy 拒绝,仅共享服务域可被所有租户访问

3.5 多租户网络故障排查要点

在 Argo CD 结合多租户网络拓扑的故障排查中,以下场景最为常见:

  • Argo CD 无法连接目标集群:检查 Argo CD 所在 Pod 的 egress 规则是否允许访问目标集群 API Server 的 IP 和端口(通常 6443)。
  • 跨租户应用同步失败:确认 Argo CD 控制平面所在 Namespace 的 NetworkPolicy 是否放行了到租户 Namespace 的流量。
  • Hubble 流日志显示 DROP:使用 hubble observe --namespace tenant-a 查看被拒绝的流量,定位缺失的 NetworkPolicy 规则。
  • Calico 策略冲突:使用 calicoctl get networkpolicy -o yaml 检查全局策略与 Namespace 策略的优先级关系。
排查口诀: 先看连通性(ping/tcp),再看策略(NetworkPolicy),最后查 CNI(calicoctl/hubble)。多租户场景下,90% 的网络故障源于策略缺失而非 CNI 本身。

3.6 租户隔离的进阶模式:Cilium Identity 与租户标签

Cilium 引入了 Identity(身份标识) 概念,每个 Pod 根据其标签组合被分配一个 24 位整数 ID。网络策略基于 Identity 而非 IP 地址进行匹配,这带来了两个关键优势:

  • 动态适应:Pod 重建或扩缩容时,Identity 保持不变,策略无需更新。
  • 跨集群一致性:在多集群场景下,相同标签的 Pod 在不同集群中拥有相同的 Identity,简化了多集群网络策略管理。

以下是一个基于 CiliumIdentity 的租户隔离策略示例:

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: tenant-isolation-identity
  namespace: tenant-a
spec:
  endpointSelector:
    matchLabels:
      tenant: tenant-a
  ingress:
  - fromEndpoints:
    - matchLabels:
        tenant: tenant-a
  egress:
  - toEndpoints:
    - matchLabels:
        tenant: tenant-a
  - toFQDNs:
    - matchName: "*.cluster.local"
生产建议: 在 Argo CD 的 ApplicationSet 中,为每个租户生成独立的 CiliumNetworkPolicy,并将租户标签作为模板参数。这样可以在 GitOps 流程中自动维护租户网络边界。

3.7 多租户网络拓扑设计原则总结

原则 说明 实现方式
最小权限 默认拒绝所有跨租户流量,仅显式放行必要通信 NetworkPolicy 默认 deny + 白名单规则
身份驱动 使用标签/Identity 而非 IP 进行策略匹配 Cilium Identity / Calico 标签选择器
共享服务隔离 DNS、监控、Argo CD 等共享服务应位于独立 Namespace Namespace + 精细化的 ingress/egress 规则
可观测性优先 部署 Hubble 或 Calico 流日志,实时监控租户间流量 Hubble UI / calicoctl 流日志查询
策略即代码 网络策略应纳入 GitOps 管理,与 Argo CD 应用同步 ApplicationSet + 策略模板