4. 租户隔离策略:命名空间隔离、RBAC权限隔离、资源配额(ResourceQuota)、网络策略(NetworkPolicy)
在控制平面升级过程中,租户隔离是保障多团队或多业务线互不干扰的核心机制。Kubernetes 原生提供了四层隔离策略:命名空间(Namespace)作为逻辑边界,RBAC 控制操作权限,ResourceQuota 限制资源消耗,NetworkPolicy 管控网络流量。四者协同构成“逻辑边界 → 操作权限 → 资源上限 → 网络隔离”的纵深防御体系。
4.1 四层隔离策略概述
下表对比了四种隔离策略的作用域、核心对象与性能影响点:
| 策略类型 | 作用域 | 核心 API 对象 | 控制平面性能影响 |
|---|---|---|---|
| 命名空间隔离 | 集群级逻辑分区 | Namespace | 低(仅元数据存储) |
| RBAC 权限隔离 | 命名空间 / 集群 | Role, ClusterRole, RoleBinding, ClusterRoleBinding | 中(鉴权缓存命中率关键) |
| 资源配额 | 命名空间 | ResourceQuota, LimitRange | 中(准入控制器拦截) |
| 网络策略 | 命名空间 / Pod | NetworkPolicy | 高(CNI 插件规则同步) |
4.2 命名空间隔离:逻辑边界与资源分组
命名空间是 Kubernetes 租户隔离的基础单元。每个命名空间拥有独立的资源视图,但默认情况下 Pod 之间可以跨命名空间通信。命名空间本身不提供安全隔离,仅作为资源分组和配额绑定的逻辑边界。
# 创建命名空间并绑定资源配额
apiVersion: v1
kind: Namespace
metadata:
name: tenant-alpha
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: alpha-quota
namespace: tenant-alpha
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
persistentvolumeclaims: "5"
pods: "20"
4.3 RBAC 权限隔离:最小权限原则
RBAC 通过 Role/ClusterRole 定义权限集合,再通过 RoleBinding/ClusterRoleBinding 将权限授予用户或 ServiceAccount。在控制平面升级场景中,RBAC 鉴权请求量会显著上升,因为升级工具(如 kubeadm、Cluster API)需要频繁校验操作权限。
RBAC 性能调优的关键指标:
- 鉴权缓存命中率:kube-apiserver 内置 RBAC 缓存,默认每 5 秒同步一次。升级期间建议将
--authorization-webhook-cache-authorized-ttl适当调大(如 30s),减少重复鉴权。 - RoleBinding 数量:每个命名空间超过 100 个 RoleBinding 会导致鉴权延迟增加。建议使用聚合 ClusterRole 减少绑定数量。
- SubjectAccessReview 并发:升级工具可能发起大量 SubjectAccessReview 请求,需监控 apiserver 的
--max-mutating-requests-inflight参数。
# 聚合 ClusterRole 示例:减少 RoleBinding 数量
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: tenant-admin-aggregate
aggregationRule:
clusterRoleSelectors:
- matchLabels:
rbac.example.com/aggregate-to-tenant-admin: "true"
rules: [] # 规则由子 ClusterRole 提供
4.4 资源配额(ResourceQuota):硬性资源边界
ResourceQuota 在准入控制器阶段拦截资源创建请求,确保命名空间内的资源消耗不超过预设上限。在控制平面升级期间,ResourceQuota 的评估逻辑会占用 apiserver 的 CPU 时间,尤其是当配额对象数量多且更新频繁时。
性能调优建议:
- 合并配额对象:每个命名空间只创建一个 ResourceQuota,而非按资源类型拆分多个。
- 避免频繁更新:升级期间不要动态调整配额值,减少准入控制器的重新计算。
- 监控配额评估延迟:通过 apiserver 指标
apiserver_admission_controller_admission_duration_seconds观察 ResourceQuota 插件的耗时。
kubectl describe quota -A 检查所有命名空间的配额使用率,将接近上限的命名空间提前扩容,避免升级过程中因配额不足导致关键组件启动失败。
4.5 网络策略(NetworkPolicy):细粒度流量控制
NetworkPolicy 通过标签选择器定义 Pod 之间的入站和出站规则。与前三层隔离不同,网络策略的执行不在 apiserver 层面,而是由 CNI 插件(如 Calico、Cilium、Antrea)在数据平面实现。控制平面升级时,CNI 控制器需要重新同步所有 NetworkPolicy 规则,这一过程可能造成网络中断或延迟。
网络策略性能影响分析:
| CNI 插件 | 策略同步方式 | 升级期间风险 | 推荐优化 |
|---|---|---|---|
| Calico | Felix 监听 apiserver | 策略更新延迟 5-30s | 启用 Typha 减少 apiserver 连接数 |
| Cilium | KVStore 或 CRD 模式 | CRD 模式下 etcd 压力大 | 升级前切换为 KVStore 模式 |
| Antrea | Agent 监听 apiserver | 大规模集群策略同步慢 | 调整 resync 间隔为 60s |
# 网络策略示例:隔离 tenant-alpha 命名空间
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: tenant-alpha
spec:
podSelector: {}
policyTypes:
- Ingress
ingress: [] # 拒绝所有入站流量
--sync-period 调整为 120s,避免同步风暴。
4.6 四层隔离协同架构
下图展示了四层隔离策略在控制平面与数据平面的协同关系:
4.7 升级期间隔离策略的调优清单
在控制平面升级前,建议按以下清单检查并优化租户隔离配置:
- 命名空间清理:删除不再使用的命名空间,减少 etcd 存储压力。
- RBAC 缓存预热:通过
kubectl auth can-i模拟关键操作,触发鉴权缓存填充。 - ResourceQuota 检查:确保所有命名空间配额使用率低于 80%,预留升级缓冲。
- NetworkPolicy 评估:统计每个命名空间的策略数量,超过 50 条的建议合并或简化。
- CNI 插件配置:调整策略同步间隔,避免升级期间全量重同步。
- 监控指标采集:重点关注
apiserver_request_duration_seconds和etcd_request_duration_seconds。
kubectl get namespace --show-labels — 检查命名空间标签kubectl describe quota -A — 查看所有配额使用情况kubectl get networkpolicy -A — 统计网络策略数量kubectl get rolebinding,clusterrolebinding -A | wc -l — 评估 RBAC 绑定规模