4. 租户边界定义:Namespace隔离、RBAC绑定、ResourceQuota、NetworkPolicy在快照中的边界标记
在多集群拓扑中,租户边界是保障安全与资源公平性的第一道防线。KubeConfig 快照不仅要记录集群连接信息,还必须将 Namespace 隔离、RBAC 绑定、ResourceQuota 和 NetworkPolicy 这四层边界标记为可回退的“租户契约”。本章将逐一拆解每层边界的快照标记方法,并给出完整的边界标记结构。
4.1 四层租户边界模型
租户边界从下到上分为四个层次,每一层解决不同的隔离与管控问题:
| 层次 | 边界类型 | 快照标记字段 | 回退验证要点 |
|---|---|---|---|
| L1 | Namespace 隔离 | tenant.namespace |
Namespace 是否存在、标签是否匹配 |
| L2 | RBAC 绑定 | tenant.rbac.roleRef + subjects |
Role/ClusterRole 权限范围、Subject 身份 |
| L3 | ResourceQuota | tenant.quota |
配额数值、作用域、是否超限 |
| L4 | NetworkPolicy | tenant.networkPolicy |
入站/出站规则、PodSelector 匹配 |
关键原则:快照中的租户边界标记必须采用“四层全量 + 差异增量”策略——首次快照记录完整边界,后续快照仅记录与基线不同的增量,减少存储开销并提升回退速度。
4.2 Namespace 隔离:快照中的第一道门
Namespace 是 Kubernetes 中最基础的租户隔离单元。在快照中,我们使用 tenant.namespace 字段记录以下信息:
- Namespace 名称:直接对应集群中的 Namespace 资源名。
- 标签集:用于标识租户归属,例如
tenant: alpha、environment: staging。 - 注解:可选,记录租户描述、联系人、创建时间等元数据。
# 快照片段:Namespace 边界标记
tenant:
namespace:
name: "team-alpha"
labels:
tenant: "alpha"
environment: "staging"
annotations:
description: "Alpha team production namespace"
回退演练提示:当回退 Namespace 时,快照工具应自动检查目标集群是否已存在同名 Namespace。若存在,则对比标签与注解是否一致;若不一致,需弹出警告并允许用户选择“覆盖”或“跳过”。
4.3 RBAC 绑定:权限边界的快照标记
RBAC 绑定决定了租户在 Namespace 内能执行的操作。快照中需要记录 RoleRef(角色引用)和 Subjects(主体列表)两个核心部分:
| 字段 | 说明 | 示例值 |
|---|---|---|
roleRef.kind |
角色类型:Role 或 ClusterRole | Role |
roleRef.name |
角色名称 | namespace-admin |
subjects[].kind |
主体类型:User、Group、ServiceAccount | ServiceAccount |
subjects[].name |
主体名称 | alpha-sa |
subjects[].namespace |
主体所在 Namespace(仅 ServiceAccount 需要) | team-alpha |
# 快照片段:RBAC 边界标记
tenant:
rbac:
roleRef:
kind: "Role"
name: "namespace-admin"
subjects:
- kind: "ServiceAccount"
name: "alpha-sa"
namespace: "team-alpha"
- kind: "User"
name: "alice@example.com"
常见陷阱:ClusterRole 绑定(ClusterRoleBinding)是集群范围的,快照中必须显式标记
scope: cluster,否则回退时可能误将集群角色绑定到 Namespace 级别,导致权限泄露。
4.4 ResourceQuota:资源边界的快照标记
ResourceQuota 限制了租户在 Namespace 内可消耗的 CPU、内存、存储等资源总量。快照标记需要包含:
- 配额硬限制(hard):资源上限,如
cpu: "10"、memory: 20Gi。 - 作用域(scopes):可选,限制配额生效范围,如
BestEffort、NotTerminating。 - 当前使用量(status.used):快照时刻的实际使用量,用于回退时判断是否超限。
# 快照片段:ResourceQuota 边界标记
tenant:
quota:
name: "alpha-quota"
hard:
cpu: "10"
memory: "20Gi"
persistentvolumeclaims: "5"
scopes:
- "NotTerminating"
status:
used:
cpu: "6.5"
memory: "12Gi"
persistentvolumeclaims: "3"
回退策略:若回退时目标集群的当前使用量已超过快照中的配额硬限制,快照工具应自动拒绝回退并提示“资源超限,请扩容或清理后重试”。这是防止回退导致 Pod 驱逐的关键保护。
4.5 NetworkPolicy:网络边界的快照标记
NetworkPolicy 定义了 Pod 级别的网络访问规则。快照中需要记录 入站(ingress) 和 出站(egress) 规则,以及 PodSelector 和 策略类型:
| 字段 | 说明 | 示例值 |
|---|---|---|
podSelector |
匹配目标 Pod 的标签选择器 | app: frontend |
policyTypes |
策略类型:Ingress、Egress 或两者 | ["Ingress", "Egress"] |
ingress[].from |
入站来源:ipBlock、namespaceSelector、podSelector | namespaceSelector: { matchLabels: { tenant: alpha } } |
egress[].to |
出站目标:同上 | ipBlock: { cidr: 10.0.0.0/8 } |
# 快照片段:NetworkPolicy 边界标记
tenant:
networkPolicy:
- name: "alpha-ingress"
podSelector:
matchLabels:
app: "frontend"
policyTypes:
- "Ingress"
ingress:
- from:
- namespaceSelector:
matchLabels:
tenant: "alpha"
ports:
- port: 8080
protocol: "TCP"
- name: "alpha-egress"
podSelector:
matchLabels:
app: "backend"
policyTypes:
- "Egress"
egress:
- to:
- ipBlock:
cidr: "10.0.0.0/8"
except:
- "10.96.0.0/12"
4.6 四层边界标记的完整快照结构
以下 SVG 图展示了四层租户边界在快照中的完整标记结构,以及各层之间的依赖关系:
4.7 边界标记的版本化与差异快照
在实际多集群场景中,租户边界会频繁调整。快照工具应支持 版本化标记,每次变更生成一个增量快照:
# 快照版本化示例
snapshot:
version: "v2025-04-01-001"
baseVersion: "v2025-03-15-001"
tenant:
namespace:
labels:
+: { "cost-center": "cc-123" } # 新增标签
-: ["environment"] # 删除标签
quota:
hard:
cpu: "12" # 从 10 改为 12
最佳实践:建议将租户边界快照存储在 Git 仓库中,每次变更触发 CI/CD 流水线自动验证边界一致性。回退时直接从 Git 历史中检出目标版本,实现“声明式回退”。
4.8 本章小结
租户边界定义是 KubeConfig 快照的核心能力之一。通过将 Namespace 隔离、RBAC 绑定、ResourceQuota 和 NetworkPolicy 四层边界标记为结构化快照字段,我们实现了:
- 可审计:每次边界变更都有完整记录。
- 可回退:支持按版本逆序恢复边界状态。
- 可验证:回退前自动检查资源冲突与权限泄露。
- 可增量:仅存储差异,降低快照存储成本。