2. ResourceQuota 入门:对象定义、作用域与生效范围、多租户资源隔离基础
ResourceQuota 是 Kubernetes 内置的准入控制机制,用于限制命名空间(Namespace)级别的聚合资源消耗。它不直接管理单个 Pod,而是对命名空间内所有 Pod 的 资源总和 进行硬性约束。理解 ResourceQuota 的对象定义、作用域与生效范围,是实现多租户资源隔离的第一步。
2.1 ResourceQuota 对象定义
一个标准的 ResourceQuota 资源清单包含 apiVersion、kind、metadata 和 spec 四个核心字段。spec.hard 字段定义资源上限,spec.scopes 字段定义配额的作用域。
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: team-alpha
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
pods: "10"
persistentvolumeclaims: "5"
requests.storage: "50Gi"
scopes:
- NotTerminating
- BestEffort
关键字段说明:
requests.cpu / requests.memory:所有 Pod 的 request 总和上限。limits.cpu / limits.memory:所有 Pod 的 limit 总和上限。pods:命名空间内允许运行的 Pod 最大数量。persistentvolumeclaims / requests.storage:PVC 数量及存储总量上限。scopes:可选字段,用于限定配额只对特定类别的 Pod 生效。
2.2 作用域与生效范围
ResourceQuota 的生效范围由 scopes 字段控制。如果不指定 scopes,则配额对命名空间内 所有 Pod 生效。Kubernetes 内置了四种作用域,用于精细化控制配额覆盖的 Pod 类别:
| 作用域(Scope) | 含义 | 匹配的 Pod 特征 |
|---|---|---|
Terminating |
终止中 Pod | spec.activeDeadlineSeconds >= 0 |
NotTerminating |
非终止中 Pod | spec.activeDeadlineSeconds 未设置或为 nil |
BestEffort |
尽力而为 Pod | 未设置 requests 和 limits(QoS 等级为 BestEffort) |
NotBestEffort |
非尽力而为 Pod | 设置了 requests 或 limits(QoS 等级为 Burstable 或 Guaranteed) |
作用域组合规则: 一个 ResourceQuota 可以同时指定多个作用域,此时配额只对 同时满足所有作用域 的 Pod 生效。例如
scopes: [NotTerminating, BestEffort] 只限制非终止且尽力而为的 Pod。
2.3 多租户资源隔离基础
在 Kubernetes 中,多租户资源隔离的基石是 命名空间 + ResourceQuota + LimitRange 的组合。ResourceQuota 负责总量控制,LimitRange 负责单个 Pod 的边界约束。两者配合,可以防止租户(团队)之间互相抢占资源。
2.4 多租户隔离最佳实践
- 命名空间隔离: 每个租户(团队、项目)使用独立的 Namespace,配合 RBAC 控制访问权限。
- ResourceQuota 总量控制: 为每个 Namespace 设置 CPU、内存、存储、Pod 数量的硬上限,防止单个租户耗尽集群资源。
- LimitRange 边界约束: 设置单个 Pod 的最小/最大资源请求,避免租户内部出现极端资源申请。
- 作用域精细化: 使用
BestEffort和NotBestEffort作用域,对离线任务和在线服务分别设置配额。 - 监控与告警: 定期检查
kubectl describe quota输出的Used字段,当使用率超过 80% 时触发告警。
实战检查命令:
# 查看命名空间内的所有 ResourceQuota
kubectl get resourcequota -n team-alpha
# 查看配额使用详情(Used / Hard)
kubectl describe quota compute-quota -n team-alpha
# 输出示例:
# Name: compute-quota
# Namespace: team-alpha
# Resource Used Hard
# -------- --- ----
# requests.cpu 2.5 4
# requests.memory 5Gi 8Gi
# limits.cpu 4 8
# limits.memory 10Gi 16Gi
# pods 6 10
2.5 常见误区与避坑
| 误区 | 正确理解 |
|---|---|
| ResourceQuota 可以限制单个 Pod 的资源 | ResourceQuota 只限制 总和,单个 Pod 的边界由 LimitRange 控制 |
| 不指定 scopes 时配额对所有资源生效 | 不指定 scopes 时对 所有 Pod 生效,但不会影响 PVC、ConfigMap 等非 Pod 资源 |
| 配额只限制 CPU 和内存 | 配额还可以限制 pods、persistentvolumeclaims、requests.storage、configmaps、secrets 等 |
| 多个 ResourceQuota 可以叠加 | 同一命名空间可以创建多个 ResourceQuota,但 取最严格约束(所有配额的交集) |
核心原则: ResourceQuota 是 准入控制 机制,在 Pod 创建时检查配额是否超限。如果超限,API Server 会直接拒绝创建请求,并返回
403 Forbidden 错误。因此,配额变更不会影响已运行的 Pod,只影响后续的创建操作。