3. 多租户模型基础:命名空间隔离、RBAC、资源配额与网络策略

在 Kubernetes 多租户集群中,租户之间的安全隔离与资源公平性是核心挑战。本章将深入剖析构建多租户模型的四大基础组件:命名空间(Namespace)作为隔离边界、RBAC 作为权限控制手段、ResourceQuota 作为资源保障机制、NetworkPolicy 作为网络流量防火墙。理解这些组件的协同工作方式,是后续 API 版本废弃与迁移工程的前提。

3.1 命名空间:租户隔离的第一道边界

命名空间是 Kubernetes 实现多租户隔离的最基本单元。它并非严格的安全边界(如网络或存储仍可跨命名空间访问),但在逻辑上为每个租户提供了独立的资源视图。

特性 说明 多租户场景示例
资源分组 将 Pod、Service、ConfigMap 等资源按租户分组 租户 A 的所有资源位于 tenant-a 命名空间
DNS 域名 服务可通过 <service>.<namespace>.svc.cluster.local 访问 租户间服务调用需显式指定命名空间
资源配额绑定 ResourceQuota 和 LimitRange 必须绑定到命名空间 防止单个租户耗尽集群资源
默认标签继承 命名空间标签可自动传播到其下的资源 用于成本分摊和审计
工程建议:在 API 版本迁移场景中,建议为每个租户创建独立的命名空间,并在命名空间级别标注 API 版本兼容性标签(如 api-version: v1beta1),以便在升级过程中按租户粒度控制迁移节奏。

3.2 RBAC:细粒度的权限控制模型

Kubernetes RBAC(基于角色的访问控制)通过 Role / ClusterRole 和 RoleBinding / ClusterRoleBinding 两对资源实现权限管理。在多租户架构中,RBAC 必须与命名空间深度绑定,确保租户只能操作自己命名空间内的资源。

3.2.1 核心对象关系

  • Role:定义在某个命名空间内的权限规则集。
  • ClusterRole:集群级别的权限规则集,可跨命名空间绑定。
  • RoleBinding:将 Role 绑定到用户/组/ServiceAccount,作用域为命名空间。
  • ClusterRoleBinding:将 ClusterRole 绑定到主体,作用域为整个集群。

3.2.2 多租户 RBAC 最佳实践

# 为租户管理员创建命名空间级别的 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: tenant-a
  name: tenant-admin
rules:
- apiGroups: [""]
  resources: ["pods", "services", "configmaps", "secrets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
  resources: ["deployments", "statefulsets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
# 绑定租户管理员
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: tenant-a
  name: tenant-a-admin-binding
subjects:
- kind: User
  name: "alice@tenant-a.com"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: tenant-admin
  apiGroup: rbac.authorization.k8s.io
常见陷阱:不要使用 ClusterRoleBinding 将集群管理员权限授予租户用户。即使只授予特定资源的权限,ClusterRoleBinding 也会使该用户能够访问所有命名空间中的对应资源,这直接破坏了多租户隔离。

3.3 资源配额:防止租户资源抢占

ResourceQuota 是 Kubernetes 提供的资源硬限制机制,用于约束命名空间级别的资源使用总量。在 API 版本迁移过程中,资源配额可以防止因迁移操作导致的资源突发占用。

3.3.1 常用配额字段

资源类型 配额字段 说明
计算资源 requests.cpu, requests.memory, limits.cpu, limits.memory CPU 和内存的请求/限制总量
存储资源 requests.storage, persistentvolumeclaims 存储请求总量和 PVC 数量
对象数量 pods, services, configmaps, secrets, deployments.apps 各类 Kubernetes 对象的最大数量
扩展资源 requests.nvidia.com/gpu 自定义或设备插件资源

3.3.2 配额配置示例

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: "20"
    services: "10"
    persistentvolumeclaims: "5"
    configmaps: "30"
    secrets: "30"
迁移场景提示:在 API 版本升级期间,建议临时提高目标命名空间的 pods 和 deployments.apps 配额上限,以容纳新旧版本应用同时运行所需的额外资源。升级完成后恢复原配额。

3.4 网络策略:租户间的流量防火墙

NetworkPolicy 是 Kubernetes 原生的网络隔离机制,通过标签选择器定义 Pod 之间以及 Pod 与外部端点之间的流量规则。在多租户集群中,默认应拒绝所有跨命名空间的流量,然后按需开放。

3.4.1 网络策略的核心要素

  • podSelector:选择策略作用的 Pod 集合。
  • policyTypes:指定策略类型(Ingress / Egress)。
  • ingress:允许入站流量的来源规则。
  • egress:允许出站流量的目标规则。

3.4.2 多租户默认隔离策略

# 拒绝所有跨命名空间的入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-cross-namespace-ingress
  namespace: tenant-a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: tenant-a
工程实践:在 API 版本迁移过程中,如果新旧版本的 Service 需要同时对外提供服务,务必在 NetworkPolicy 中显式允许流量到达两个版本的 Pod 标签(如 version: v1 和 version: v2),避免迁移期间服务中断。

3.5 多租户模型架构总览

下图展示了多租户模型中四个基础组件的协同关系:命名空间提供逻辑隔离,RBAC 控制操作权限,ResourceQuota 保障资源公平,NetworkPolicy 实现网络隔离。

多租户模型四层隔离架构 Kubernetes 集群 命名空间:tenant-a RBAC 权限控制 Role: tenant-admin → User: alice@tenant-a.com ResourceQuota 资源配额 CPU: 4/8 核 | 内存: 8/16 Gi | Pods: 20 NetworkPolicy 网络隔离 拒绝跨命名空间入站流量 租户工作负载 Deployment: app-v1 (API v1beta1) Service: app-service ConfigMap: app-config 命名空间:tenant-b RBAC 权限控制 Role: tenant-admin → User: bob@tenant-b.com ResourceQuota 资源配额 CPU: 2/4 核 | 内存: 4/8 Gi | Pods: 10 NetworkPolicy 网络隔离 拒绝跨命名空间入站流量 租户工作负载 Deployment: app-v2 (API v1) Service: app-service ConfigMap: app-config ✕ 禁止

3.6 四组件协同工作流

在实际的多租户集群中,四个组件并非独立运行,而是形成一条完整的请求处理链路。下图展示了租户用户发起请求时,各组件依次生效的流程。

多租户请求处理流程 ① 租户用户请求 kubectl apply -f deploy.yaml --namespace tenant-a ② API Server 认证 TLS 证书验证 Bearer 校验 ③ RBAC 鉴权 检查 RoleBinding 验证 verbs 权限 ④ 准入控制 ResourceQuota 检查 LimitRange 验证 ⑤ etcd 持久化 写入资源对象 触发 watch 事件 ⑥ 调度与执行 Pod 调度 / 控制器协调 NetworkPolicy 在 Pod 网络层生效

3.7 多租户模型与 API 版本迁移的关联

在后续章节中,我们将基于本章建立的多租户模型,设计 API 版本废弃与迁移策略。以下是四个组件在迁移过程中的关键作用:

组件 迁移阶段作用 典型操作
命名空间 按租户粒度控制迁移范围 为每个租户创建独立的迁移命名空间(如 tenant-a-migration)
RBAC 限制迁移操作权限 创建临时迁移角色,仅授予目标命名空间的读写权限
ResourceQuota 保障迁移期间资源充足 临时提高 Pod/Deployment 配额上限
NetworkPolicy 确保新旧版本服务互通 添加允许新旧版本 Pod 之间流量的策略
核心原则:多租户模型不是一次性配置,而是需要持续治理的工程体系。在 API 版本迁移过程中,每次变更都应遵循“最小权限、资源隔离、网络可控”的原则,确保一个租户的迁移操作不会影响其他租户的稳定性。