3、多租户架构基础:Kubernetes多租户模型
在GitOps多租户环境中,Kubernetes原生提供的隔离机制是构建故障定位与隔离策略的基石。本章深入剖析命名空间、RBAC、网络策略和资源配额四大核心组件,并展示它们如何协同工作以形成可观测、可管控的多租户边界。
3.1 命名空间:租户的逻辑边界
命名空间(Namespace)是Kubernetes多租户的第一道隔离层。它将集群内的资源划分为逻辑分组,每个租户拥有独立的命名空间,从而实现资源命名隔离和权限边界。
关键原则: 每个租户对应一个独立的命名空间,命名空间名称作为租户标识(如
tenant-alpha、tenant-beta)。集群级别资源(Node、PV、ClusterRole)不在命名空间内,需额外管控。
3.2 RBAC:细粒度权限控制
基于角色的访问控制(RBAC)决定了每个租户(或用户/服务账户)在各自命名空间内能执行的操作。在多租户场景中,RBAC 策略必须严格遵循最小权限原则。
3.2.1 核心 RBAC 对象
| 对象 | 作用域 | 用途 |
|---|---|---|
| Role | 命名空间 | 定义对特定命名空间内资源的操作权限(如 get pods、create deployments) |
| ClusterRole | 集群 | 定义集群级别资源权限,或可被多个命名空间引用的通用权限模板 |
| RoleBinding | 命名空间 | 将 Role 或 ClusterRole 绑定到命名空间内的用户/组/服务账户 |
| ClusterRoleBinding | 集群 | 将 ClusterRole 绑定到集群级别的用户/组/服务账户 |
3.2.2 多租户 RBAC 最佳实践
- 使用 ClusterRole 作为模板: 创建通用的
tenant-admin、tenant-developer、tenant-viewer等 ClusterRole,然后通过 RoleBinding 在每个租户命名空间内绑定。 - 服务账户隔离: 每个 GitOps Agent(如 ArgoCD Application Controller)在目标租户命名空间内使用独立的 ServiceAccount,并绑定最小权限 Role。
- 避免集群级别绑定: 除非必要(如集群管理员),否则始终使用 RoleBinding 而非 ClusterRoleBinding,将权限限制在命名空间内。
排障提示: 当 GitOps 同步失败且错误信息包含 "Forbidden" 或 "Unauthorized" 时,优先检查目标命名空间内的 RoleBinding 是否引用了正确的 ClusterRole,以及 ServiceAccount 是否匹配。
3.3 网络策略:租户间流量隔离
默认情况下,Kubernetes 集群内所有 Pod 可以互相通信。网络策略(NetworkPolicy)通过标签选择器和规则定义,实现租户间的网络隔离,防止一个租户的异常流量影响其他租户。
3.3.1 网络策略隔离模型
3.3.2 网络策略配置示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-alpha-deny-all
namespace: tenant-alpha
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-alpha-allow-frontend-to-backend
namespace: tenant-alpha
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: db
ports:
- port: 5432
注意: 网络策略由 CNI 插件(如 Calico、Cilium)强制执行。如果集群未安装支持 NetworkPolicy 的 CNI,策略将不会生效。在 GitOps 排障时,需确认 CNI 类型及策略执行状态。
3.4 资源配额:防止资源争抢
资源配额(ResourceQuota)和限制范围(LimitRange)确保单个租户不会过度消耗集群资源,从而影响其他租户的稳定性。这是多租户故障隔离中“防止噪声邻居”的关键机制。
3.4.1 ResourceQuota 核心配置
| 资源类型 | 示例配置 | 说明 |
|---|---|---|
| 计算资源 | requests.cpu: "10"requests.memory: "20Gi"limits.cpu: "20"limits.memory: "40Gi" |
限制命名空间内所有 Pod 的 CPU/内存请求和上限总和 |
| 存储资源 | requests.storage: "100Gi"persistentvolumeclaims: "10" |
限制 PVC 总容量和数量 |
| 对象数量 | pods: "50"services: "20"secrets: "30" |
限制命名空间内各类 Kubernetes 对象的最大数量 |
3.4.2 LimitRange 配置示例
apiVersion: v1
kind: LimitRange
metadata:
name: tenant-alpha-limits
namespace: tenant-alpha
spec:
limits:
- max:
cpu: "2"
memory: "4Gi"
min:
cpu: "100m"
memory: "128Mi"
default:
cpu: "500m"
memory: "1Gi"
defaultRequest:
cpu: "200m"
memory: "512Mi"
type: Container
排障要点: 当 GitOps 同步失败且 Pod 处于 Pending 状态时,使用
kubectl describe quota -n <namespace> 查看配额使用情况。如果配额已满,即使 GitOps 正确生成了 Deployment,调度器也无法创建 Pod。
3.5 多租户隔离策略对比
| 隔离维度 | Kubernetes 机制 | 故障隔离能力 | 排障关注点 |
|---|---|---|---|
| 资源命名 | 命名空间 | 防止资源名称冲突 | 确认资源是否在正确的命名空间 |
| 权限控制 | RBAC (Role/ClusterRole + Binding) | 防止越权操作 | 检查 ServiceAccount 权限和 RoleBinding 绑定 |
| 网络流量 | NetworkPolicy | 防止跨租户网络攻击和流量泄露 | 验证 CNI 支持及策略规则是否生效 |
| 资源消耗 | ResourceQuota + LimitRange | 防止单个租户耗尽集群资源 | 监控配额使用率,检查 Pod 是否因配额不足而 Pending |