3. 多租户网络隔离模型:基于Namespace的软隔离与基于CNI的硬隔离

在生产级Kubernetes集群中,多租户网络隔离是保障安全与稳定性的核心能力。本章深入剖析两种主流隔离模型:基于Namespace的软隔离(逻辑隔离)与基于CNI的硬隔离(物理/策略隔离)。理解两者的差异、适用场景及组合策略,是设计生产回滚方案的前提。

3.1 软隔离:Namespace级别的网络边界

Kubernetes原生提供的Namespace是一种逻辑隔离机制。默认情况下,不同Namespace中的Pod可以通过Cluster IP或DNS名称直接通信,这种“默认允许”模式构成了软隔离的基础。

核心特征:软隔离不改变底层网络数据路径,仅通过Kubernetes API对象的标签、RBAC和NetworkPolicy进行访问控制。它依赖用户正确配置策略,而非网络基础设施的强制阻断。

3.1.1 软隔离的通信模型

在未配置NetworkPolicy时,所有Namespace间的Pod通信是全开放的。软隔离的“软”体现在:

  • 共享网络平面:所有Pod共享同一个CNI插件管理的虚拟网络(如Flannel的VXLAN、Calico的BGP)。
  • 策略驱动:隔离效果完全依赖NetworkPolicy对象的生效状态,一旦策略被误删除或未正确应用,隔离即失效。
  • 无状态阻断:软隔离不维护连接跟踪表,策略变更后已有连接可能继续存在。
特性 软隔离(Namespace + NetworkPolicy) 硬隔离(CNI策略 + 网络层强制)
隔离粒度 Pod级别(通过标签选择器) 节点/子网/接口级别
数据路径 共享虚拟网络,无物理隔离 独立VLAN/VXLAN VNI或加密隧道
性能开销 低(仅iptables/eBPF规则匹配) 中高(封装/解封装、加密)
运维复杂度 低(原生K8s资源) 高(需CNI插件深度配置)
回滚风险 策略删除后恢复原状,无残留 需清理网络接口/VNI映射,易残留

3.1.2 软隔离的典型配置

以下是一个基于Namespace标签的NetworkPolicy示例,实现“只允许同一租户的Pod访问”:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-isolation
  namespace: tenant-a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          tenant: a
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          tenant: a
生产回滚陷阱:软隔离策略的回滚操作(如删除NetworkPolicy)不会立即中断已有连接。TCP长连接可能持续数分钟,导致回滚验证期间出现“假通过”现象。建议在回滚前先通过kubectl exec触发连接重置。

3.2 硬隔离:CNI层面的网络强制

硬隔离通过CNI插件在网络基础设施层实施隔离,不依赖Kubernetes控制平面的策略引擎。常见的实现方式包括:

  • VXLAN/Geneve封装:为每个租户分配独立的VNI(VXLAN Network Identifier),数据包在宿主机层面即被隔离。
  • BGP路由策略:通过Calico的BGP Peering,为不同租户发布独立的路由表,实现L3隔离。
  • MACVLAN/IPVLAN:将物理网卡直接分配给租户Pod,实现硬件级别的网络隔离。

3.2.1 硬隔离的通信模型

硬隔离的核心在于数据平面隔离:即使Kubernetes控制平面完全失效,租户间的网络也无法互通。其典型架构如下:

基于CNI的硬隔离网络拓扑 宿主机 Node-1 租户A Pod 租户B Pod VNI: 1001 VNI: 1002 宿主机 Node-2 租户A Pod 租户C Pod VNI: 1001 VNI: 1003 物理网络(Underlay) VXLAN隧道:VNI 1001 ↔ VNI 1001 互通;其他VNI间隔离 硬隔离关键点 不同VNI的Pod即使在同一宿主机也无法通信(VTEP过滤)

3.2.2 硬隔离的CNI实现对比

CNI插件 隔离机制 数据平面 回滚复杂度
Calico BGP路由 + iptables/eBPF L3路由,无封装 中(需清理BGP会话和路由表)
Flannel (VXLAN) VNI隔离 + UDP封装 L2 over L3 低(删除VNI映射即可)
Cilium eBPF + VXLAN/Geneve L3/L4策略 + 封装 高(需清理eBPF Map和隧道端点)
Weave Net fastdp + 加密隧道 L2 over UDP 中(需清理Peer和加密密钥)

3.3 软硬隔离的协同与回滚策略

在生产环境中,软隔离 + 硬隔离的组合使用是最佳实践。软隔离提供灵活的策略控制,硬隔离提供底线安全。回滚验证时必须同时考虑两者的状态一致性。

生产建议:使用Calico的GlobalNetworkPolicy实现硬隔离基线(如禁止跨租户流量),再通过Namespace级别的NetworkPolicy实现细粒度授权。回滚时先恢复软隔离策略,再验证硬隔离状态。

3.3.1 回滚验证的关键检查点

  1. 软隔离层:确认NetworkPolicy的spec.podSelector和spec.ingress/egress规则与回滚前一致。
  2. 硬隔离层:检查CNI插件的VNI/BGP路由表是否已清理旧租户的残留条目。
  3. 数据路径:通过tcpdump或bpftrace验证跨租户数据包是否被正确丢弃。
  4. 性能基线:回滚后测量吞吐量和延迟,确保硬隔离封装/解封装未引入额外抖动。
软硬隔离协同回滚验证流程 步骤1 恢复NetworkPolicy 步骤2 验证策略生效 步骤3 检查CNI硬隔离 步骤4 数据路径验证 步骤5 性能基线比对 回滚失败处理 回退至快照/重建CNI 回滚验证黄金法则 先软后硬:先恢复K8s原生策略,再验证CNI底层状态;任何一层失败都需回退至完整快照

3.4 生产窗口内的隔离回滚决策树

在生产变更窗口内,当网络隔离策略回滚时,运维人员需快速判断隔离模型是否已恢复。以下决策树可作为操作指南:

决策点1:回滚的是NetworkPolicy还是CNI配置?
→ NetworkPolicy回滚:执行kubectl apply -f backup.yaml,等待30秒后验证。
→ CNI配置回滚:需重启节点上的CNI DaemonSet或执行插件特定的恢复脚本。

决策点2:回滚后租户间是否仍有通信?
→ 是:检查CNI的VNI/BGP表是否残留旧条目,使用calicoctl get wep或ip link show排查。
→ 否:进入性能验证阶段,确认封装/解封装未引入额外延迟。