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-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
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"
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
version: v1 和 version: v2),避免迁移期间服务中断。
3.5 多租户模型架构总览
下图展示了多租户模型中四个基础组件的协同关系:命名空间提供逻辑隔离,RBAC 控制操作权限,ResourceQuota 保障资源公平,NetworkPolicy 实现网络隔离。
3.6 四组件协同工作流
在实际的多租户集群中,四个组件并非独立运行,而是形成一条完整的请求处理链路。下图展示了租户用户发起请求时,各组件依次生效的流程。
3.7 多租户模型与 API 版本迁移的关联
在后续章节中,我们将基于本章建立的多租户模型,设计 API 版本废弃与迁移策略。以下是四个组件在迁移过程中的关键作用:
| 组件 | 迁移阶段作用 | 典型操作 |
|---|---|---|
| 命名空间 | 按租户粒度控制迁移范围 | 为每个租户创建独立的迁移命名空间(如 tenant-a-migration) |
| RBAC | 限制迁移操作权限 | 创建临时迁移角色,仅授予目标命名空间的读写权限 |
| ResourceQuota | 保障迁移期间资源充足 | 临时提高 Pod/Deployment 配额上限 |
| NetworkPolicy | 确保新旧版本服务互通 | 添加允许新旧版本 Pod 之间流量的策略 |