2. Kubernetes多租户基础概念:Namespace隔离、RBAC、NetworkPolicy、ResourceQuota、LimitRange在多租户场景下的作用

在Kubernetes多租户集群中,隔离与资源管控是两大核心挑战。Kubernetes原生提供了五个关键组件来构建多租户基础:Namespace、RBAC、NetworkPolicy、ResourceQuota 和 LimitRange。它们分别从逻辑边界、权限、网络、资源总量和单个容器资源约束五个维度实现租户隔离。

核心观点:多租户隔离不是单一机制能完成的,而是Namespace(边界)+ RBAC(身份与权限)+ NetworkPolicy(网络隔离)+ ResourceQuota(总量限制)+ LimitRange(单体约束)的组合策略。缺少任何一个,隔离都可能出现漏洞。

2.1 五维隔离模型总览

下表清晰展示了每个组件在多租户场景中的隔离维度、作用对象和典型场景:

组件 隔离维度 作用对象 多租户典型场景
Namespace 逻辑边界 资源分组 每个租户一个独立Namespace,资源名称天然隔离
RBAC 身份与权限 用户/ServiceAccount 租户管理员只能管理自己的Namespace,不能跨租户操作
NetworkPolicy 网络流量 Pod间通信 禁止租户A的Pod访问租户B的Pod,默认拒绝所有跨Namespace流量
ResourceQuota 资源总量 Namespace级别 限制每个租户最多使用10个Pod、20个Service、8核CPU、16Gi内存
LimitRange 单体资源约束 Pod/Container 强制每个容器必须设置requests/limits,防止单个Pod耗尽租户配额

2.2 五组件协同工作流(SVG架构图)

下图展示了在多租户集群中,五个组件如何分层协作,共同构建一个完整的隔离与管控体系:

Kubernetes多租户五维隔离协同架构图 Kubernetes 多租户五维隔离协同架构 租户A(Namespace: tenant-a) 逻辑边界:资源名称天然隔离,Service/ConfigMap/Secret 互不可见 租户B(Namespace: tenant-b) 逻辑边界:资源名称天然隔离,Service/ConfigMap/Secret 互不可见 RBAC 权限隔离 RoleBinding 限定租户管理员只能操作自己的 Namespace NetworkPolicy 网络隔离 默认拒绝跨 Namespace 流量,只允许同 Namespace 内部通信 ResourceQuota 资源总量限制 限制每个 Namespace 的 Pod/CPU/内存/存储总量上限 LimitRange 单体资源约束 强制每个容器设置 requests/limits,防止单个 Pod 超配额

2.3 各组件深度解析

2.3.1 Namespace:多租户的逻辑边界

Namespace 是 Kubernetes 多租户的第一道防线。每个租户拥有独立的 Namespace,资源名称(如 Pod、Service、ConfigMap)在各自 Namespace 内唯一,跨 Namespace 不可见。

  • 资源隔离:同名 Service 可以在不同 Namespace 共存,互不干扰。
  • DNS 隔离:跨 Namespace 访问需使用 <service>.<namespace>.svc.cluster.local 全限定域名。
  • 管理边界:kubectl 操作默认限定在当前 Namespace,避免误操作影响其他租户。

2.3.2 RBAC:细粒度的权限控制

RBAC(基于角色的访问控制)确保租户只能访问自己的 Namespace。核心概念包括:

  • Role / ClusterRole:定义一组权限规则(如 get pods、create deployments)。
  • RoleBinding / ClusterRoleBinding:将 Role 绑定到用户、组或 ServiceAccount。
  • 多租户最佳实践:为每个租户创建独立的 ServiceAccount,绑定仅限该 Namespace 的 Role。
关键配置示例: 为租户A创建只读角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: tenant-a
  name: tenant-a-reader
rules:
- apiGroups: [""]
  resources: ["pods", "services", "configmaps"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: tenant-a
  name: tenant-a-reader-binding
subjects:
- kind: User
  name: "user-tenant-a"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: tenant-a-reader
  apiGroup: rbac.authorization.k8s.io

2.3.3 NetworkPolicy:网络层面的强制隔离

在多租户场景中,默认允许所有流量是巨大的安全风险。NetworkPolicy 通过标签选择器和 CIDR 规则,实现 Pod 级别的网络访问控制。

  • 默认拒绝策略:先创建一条拒绝所有入站/出站流量的策略,再按需放行。
  • 跨 Namespace 控制:使用 namespaceSelector 精确控制哪些 Namespace 可以通信。
  • Cilium 增强:Cilium 支持基于 DNS、HTTP 方法、Kafka 主题等 L7 协议的 NetworkPolicy,实现更精细的租户网络隔离。
常见陷阱: 仅创建 NetworkPolicy 是不够的,必须确保集群网络插件(如 Cilium、Calico)支持 NetworkPolicy。此外,默认策略应设置为 Deny All,否则未匹配策略的 Pod 仍可自由通信。

2.3.4 ResourceQuota:防止租户资源滥用

ResourceQuota 限制一个 Namespace 内资源总量,防止单个租户耗尽集群资源。可限制的资源包括:

  • 计算资源:requests.cpu、requests.memory、limits.cpu、limits.memory。
  • 存储资源:requests.storage、persistentvolumeclaims。
  • 对象数量:pods、services、configmaps、secrets、replicationcontrollers 等。
典型配置: 限制租户A最多使用 4 核 CPU、8Gi 内存、10 个 Pod
apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-a-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "10"
    services: "5"
    persistentvolumeclaims: "3"

2.3.5 LimitRange:单体容器的资源约束

ResourceQuota 控制总量,但无法阻止单个 Pod 申请过大的资源。LimitRange 为 Namespace 内的每个容器设置默认 requests/limits 和最小/最大约束。

  • 默认值:如果 Pod 未设置 requests/limits,自动注入默认值。
  • 边界约束:强制每个容器的 CPU 请求在 100m~2 之间,内存请求在 128Mi~4Gi 之间。
  • 比例约束:限制 limits/requests 的比例(如 maxLimitRequestRatio),防止过度超卖。
典型配置: 强制每个容器设置 requests 和 limits,且 limits 不超过 requests 的 2 倍
apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-a-limits
  namespace: tenant-a
spec:
  limits:
  - max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    maxLimitRequestRatio:
      cpu: "2"

2.4 五组件协同实战流程(SVG流程图)

下图展示了在多租户集群中,从租户创建到 Pod 启动的完整隔离检查流程:

多租户隔离检查流程图 多租户 Pod 启动隔离检查流程 1. 创建 Namespace 2. 配置 RBAC 权限 3. 设置 NetworkPolicy 4. 创建 ResourceQuota 5. 创建 LimitRange 6. Pod 启动(通过所有检查)

2.5 多租户隔离最佳实践清单

维度 最佳实践 避坑指南
Namespace 每个租户使用独立 Namespace,命名规范如 tenant-{id} 不要将敏感资源(如 Secret)放在 default Namespace
RBAC 使用 ServiceAccount 而非用户账号,最小权限原则 避免使用 cluster-admin 角色绑定到租户
NetworkPolicy 先创建默认拒绝策略,再按需放行 不要依赖默认允许策略,必须显式定义
ResourceQuota 设置合理的 CPU/内存/对象数量上限 不要只限制 CPU 而忽略内存和存储
LimitRange 强制设置 requests 和 limits,防止资源争抢 不要设置过大的 max 值,避免单个 Pod 撑爆配额
进阶提示: 在 Cilium 环境下,NetworkPolicy 可以结合 CiliumNetworkPolicy 实现 L7 协议过滤(如 HTTP 路径、gRPC 方法、Kafka 主题),为多租户提供更精细的网络隔离。后续章节将深入讲解 Cilium 网络策略的调优实战。