3. K8s多租户隔离策略:Namespace隔离、网络策略、资源配额、Pod安全策略在多租户中的应用

在多租户Kubernetes集群中,隔离是保障租户间安全与公平的首要任务。本章深入剖析四种核心隔离机制:Namespace(逻辑边界)、NetworkPolicy(网络隔离)、ResourceQuota(资源公平)与Pod Security Policy / Pod Security Admission(工作负载安全)。这四层策略共同构建了纵深防御体系,确保租户A的流量不会意外到达租户B,租户C的突发负载不会挤占租户D的资源。

核心原则: 多租户隔离不是单一策略的产物,而是Namespace(边界)、NetworkPolicy(网络)、ResourceQuota(资源)、Pod Security(安全)四层策略的叠加与协同。缺少任何一层,隔离都可能被绕过。

3.1 Namespace:多租户的逻辑边界

Namespace是Kubernetes多租户隔离的第一道防线。它为每个租户提供一个独立的虚拟集群,租户只能看到和操作自己Namespace内的资源(Pod、Service、ConfigMap等)。

  • 资源命名隔离:不同Namespace允许同名资源共存,避免命名冲突。
  • 权限边界:RBAC规则绑定到Namespace级别,租户无法跨Namespace操作。
  • 资源配额作用域:ResourceQuota和LimitRange绑定到特定Namespace,实现资源公平。
Namespace 多租户逻辑边界示意图 Kubernetes 集群(共享控制面) Namespace: tenant-a Pod: app-a Service: svc-a ConfigMap: cfg-a Secret: sec-a Namespace: tenant-b Pod: app-b Service: svc-b ConfigMap: cfg-b Secret: sec-b 隔离
最佳实践: 为每个租户创建独立的Namespace,命名规范建议使用 {tenant-id}-{environment} 格式,例如 acme-prod、acme-staging。避免使用 default Namespace承载租户工作负载。

3.2 NetworkPolicy:微隔离与流量控制

Namespace提供了逻辑边界,但默认情况下,不同Namespace的Pod可以互相通信。NetworkPolicy实现了微隔离,通过标签选择器定义Pod级别的入站(Ingress)和出站(Egress)规则。

策略类型 作用方向 典型场景
Ingress 控制进入Pod的流量 只允许同Namespace的Pod访问数据库Pod
Egress 控制Pod发出的流量 只允许应用Pod访问特定外部API,禁止访问互联网
双向 同时控制入站和出站 租户间完全隔离,禁止跨Namespace通信

以下是一个典型的租户隔离NetworkPolicy示例,它拒绝所有来自其他Namespace的入站流量,仅允许同Namespace内的通信:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-cross-namespace
  namespace: tenant-a
spec:
  podSelector: {}  # 匹配该Namespace下所有Pod
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: tenant-a
注意: NetworkPolicy需要CNI插件支持(如Calico、Cilium、Weave Net)。如果集群使用Flannel(不支持NetworkPolicy),则无法实施Pod级别的网络隔离。在生产环境中,建议使用支持NetworkPolicy的CNI。

3.3 ResourceQuota & LimitRange:资源公平与限制

资源隔离不仅关乎安全,还关乎公平性。一个租户的突发负载不应导致其他租户的服务降级。ResourceQuota和LimitRange是Kubernetes提供的资源管理工具。

  • ResourceQuota: 为Namespace设置聚合资源上限(CPU、内存、PVC数量、Service数量等)。
  • LimitRange: 为Namespace内的每个Pod或容器设置默认资源请求/限制,防止单个Pod占用过多资源。
ResourceQuota & LimitRange 资源隔离机制 集群总资源池(CPU: 32核, 内存: 128Gi) 由ResourceQuota向下分配 Namespace: tenant-a ResourceQuota: CPU 8核, 内存32Gi LimitRange: 容器CPU 0.5~4核 LimitRange: 容器内存 256Mi~16Gi Namespace: tenant-b ResourceQuota: CPU 16核, 内存64Gi LimitRange: 容器CPU 0.25~8核 LimitRange: 容器内存 128Mi~32Gi

以下是一个完整的ResourceQuota配置示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "8"
    requests.memory: "32Gi"
    limits.cpu: "16"
    limits.memory: "64Gi"
    persistentvolumeclaims: "10"
    pods: "50"
    services: "20"
    secrets: "20"
    configmaps: "20"
建议: 为每个租户Namespace同时配置ResourceQuota和LimitRange。ResourceQuota防止租户整体资源超限,LimitRange防止单个Pod资源请求过高导致配额浪费。两者配合使用,才能实现精细化的资源管理。

3.4 Pod Security:工作负载安全策略

Pod Security是保障租户工作负载安全运行的最后一道防线。它通过限制Pod的运行时行为(如特权模式、主机网络、卷类型、用户ID等),防止恶意或配置不当的Pod破坏宿主机或影响其他租户。

Kubernetes从v1.25开始使用Pod Security Admission (PSA)替代了旧的PodSecurityPolicy (PSP)。PSA定义了三个安全标准:

标准级别 安全强度 典型限制 适用场景
Privileged 低 无限制,允许特权容器、hostNetwork、hostPID等 系统组件、监控Agent、需要特殊权限的Pod
Baseline 中 禁止特权容器、禁止hostPID/IPC、限制hostPort 大多数普通应用Pod
Restricted 高 Baseline基础上,强制非root用户、只读根文件系统、禁止Seccomp未设置 高安全要求的金融、医疗应用

通过Namespace标签启用PSA:

apiVersion: v1
kind: Namespace
metadata:
  name: tenant-a
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/enforce-version: latest
    pod-security.kubernetes.io/audit: baseline
    pod-security.kubernetes.io/warn: baseline
迁移注意: 如果集群版本低于v1.25且仍在使用PSP,请尽快规划迁移到PSA。PSP在v1.21被弃用,v1.25被移除。迁移时,建议先使用 audit 或 warn 模式观察现有Pod的合规情况,再逐步切换到 enforce 模式。

3.5 四层隔离策略协同工作

在实际多租户环境中,这四层策略需要协同工作,形成完整的隔离矩阵:

多租户四层隔离策略协同架构 第1层:Namespace 隔离(逻辑边界) 为每个租户创建独立Namespace,RBAC绑定到Namespace级别 第2层:NetworkPolicy 隔离(网络微隔离) 拒绝跨Namespace流量,只允许同Namespace或特定标签的Pod通信 第3层:ResourceQuota & LimitRange(资源公平) 限制租户资源上限,防止资源争抢,保障SLA 第4层:Pod Security Admission(工作负载安全)

下表总结了每层隔离策略的职责与覆盖范围:

隔离层 API资源 隔离对象 绕过风险
Namespace Namespace 资源命名、权限边界 ClusterRole绑定到所有Namespace
NetworkPolicy NetworkPolicy Pod网络流量 CNI不支持NetworkPolicy
ResourceQuota ResourceQuota, LimitRange CPU、内存、存储、对象数量 未配置LimitRange导致单个Pod超配
Pod Security PodSecurity Admission Pod运行时安全配置 使用Privileged级别且未审计
自动化流水线集成: 在CI/CD流水线中,建议将Namespace创建、NetworkPolicy部署、ResourceQuota配置和PSA标签设置作为基础设施即代码(IaC)的一部分。使用Helm Chart或Kustomize模板化这些策略,确保每个新租户上线时自动应用完整的隔离配置,避免人工遗漏。