4. 网络隔离与策略管理

在多租户 Kubernetes 集群中,网络是隔离的第一道防线。本章深入剖析 CNI 插件选型、NetworkPolicy 最佳实践、租户间网络加密以及服务网格的多租户支持,帮助你在不同隔离等级下做出最优技术决策。

4.1 CNI 插件选型:Calico、Cilium、Flannel 对比

CNI(Container Network Interface)插件决定了 Pod 网络的基本连通性与隔离能力。对于多租户场景,选型核心在于是否支持网络策略、加密通信及性能开销。

特性 Flannel Calico Cilium
网络模型 Overlay(VXLAN/Host-GW) 纯路由(BGP)或 Overlay(IPIP/VXLAN) Overlay(VXLAN/Geneve)或原生路由
NetworkPolicy 支持 ❌ 不支持 ✅ 完全支持(iptables/eBPF) ✅ 完全支持(eBPF 原生)
加密通信 ❌ 无原生支持 ✅ WireGuard/IPSec(企业版) ✅ WireGuard(透明加密)
性能开销 低(简单封装) 中(BGP 模式低,IPIP 模式中) 高(eBPF 数据面,但延迟极低)
多租户隔离 弱(仅网络连通) 强(策略+命名空间隔离) 最强(策略+身份+可观测性)
运维复杂度 低 中(需 BGP 或 etcd) 中高(需 eBPF 内核支持)
选型建议: 对于严格多租户隔离场景,优先选择 Calico(成熟稳定)或 Cilium(高性能与可观测性)。Flannel 仅适用于开发测试环境或无需网络策略的简单集群。

4.2 NetworkPolicy 最佳实践

NetworkPolicy 是 Kubernetes 原生的网络隔离机制,通过标签选择器定义 Pod 间的访问规则。在多租户集群中,应遵循以下实践:

  • 默认拒绝所有入站/出站流量:为每个命名空间创建默认的 Deny-All 策略,然后按需开放。
  • 基于租户标签的精细化控制:使用 tenant 或 team 标签区分租户,策略中引用这些标签。
  • 隔离命名空间边界:禁止跨命名空间的非授权访问,除非显式声明。
  • 限制外部出口流量:仅允许特定网段或 FQDN 的出站访问,防止数据泄露。
# 示例:默认拒绝所有入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: tenant-a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
# 示例:允许同一租户内的 Pod 互相访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-same-tenant
  namespace: tenant-a
spec:
  podSelector: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          tenant: tenant-a
注意: NetworkPolicy 依赖于 CNI 插件的实现。Calico 和 Cilium 完全支持,而 Flannel 不支持。确保集群 CNI 已启用策略引擎。

4.3 租户间网络加密(IPSec / WireGuard)

对于跨节点或跨集群的租户流量,明文传输存在安全风险。加密方案分为节点级和 Pod 级:

  • 节点级加密(IPSec):在宿主机网络层加密所有 Pod 流量,对应用透明。适用于 Calico 企业版或自建 IPSec 隧道。
  • Pod 级加密(WireGuard):Cilium 支持透明 WireGuard 加密,仅加密特定租户的 Pod 流量,性能优于 IPSec。
性能对比: WireGuard 在延迟和吞吐量上均优于 IPSec,且配置更简单。推荐在 Cilium 环境中启用 WireGuard 作为默认加密方案。
# Cilium 启用 WireGuard 加密(Helm 配置)
helm upgrade cilium cilium/cilium \
  --namespace kube-system \
  --set encryption.enabled=true \
  --set encryption.type=wireguard

4.4 服务网格(Istio)多租户支持

服务网格在应用层提供更细粒度的流量管理、安全与可观测性。Istio 通过以下机制支持多租户:

  • 命名空间隔离:每个租户拥有独立的命名空间,部署自己的 Istio Sidecar 和配置。
  • AuthorizationPolicy:基于 JWT、服务账户或请求属性的访问控制,实现租户间认证与授权。
  • mTLS 加密:自动为同一网格内的服务启用双向 TLS,确保通信加密。
  • 租户级遥测:通过标签和命名空间区分指标、日志和追踪数据。
# 示例:Istio AuthorizationPolicy 限制跨租户访问
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-cross-tenant
  namespace: tenant-a
spec:
  action: DENY
  rules:
  - from:
    - source:
        namespaces: ["tenant-b"]
最佳实践: 在 Istio 多租户部署中,使用 MeshConfig 的 accessLogFile 和 enableTracing 为每个租户开启独立的访问日志和追踪,便于审计与排障。
多租户网络隔离架构 租户 A 命名空间 Pod A1 Pod A2 NetworkPolicy: 允许同租户 租户 B 命名空间 Pod B1 Pod B2 NetworkPolicy: 拒绝跨租户 ✖ 跨租户流量被拒绝 节点级 / Pod 级加密层 IPSec / WireGuard 透明加密 服务网格(Istio) mTLS + AuthorizationPolicy + 遥测

4.5 综合策略矩阵

根据不同的隔离等级,推荐以下组合方案:

隔离等级 CNI 插件 网络策略 加密方案 服务网格
基础隔离 Calico(BGP) 命名空间级 Deny-All 无 无
中等隔离 Calico(IPIP) 租户标签策略 节点级 IPSec 可选
严格隔离 Cilium(eBPF) 身份+标签策略 Pod 级 WireGuard Istio + mTLS
工程落地要点:
  • 在集群初始化阶段就规划好 CNI 与网络策略模板,避免后期大规模改造。
  • 使用 GitOps 管理 NetworkPolicy 和 Istio 配置,确保策略可审计、可回滚。
  • 定期进行网络隔离渗透测试,验证策略是否生效。