3、资源配额基础:Kubernetes资源配额(CPU/内存/存储)概念、Namespace级别配额、LimitRange与ResourceQuota
3.1 资源配额核心概念
在 Kubernetes 集群中,资源配额(Resource Quota)是保障多租户隔离、防止资源争抢的关键机制。对于 Velero 灾备缓存命中巡检而言,理解资源配额是分析缓存 Pod 是否因资源不足被驱逐或限流的先决条件。
Kubernetes 资源配额主要管控三类资源维度:
- 计算资源:CPU(单位:m,1000m = 1 核)、内存(单位:Mi/Gi)
- 存储资源:持久卷声明(PVC)数量、各类存储类的总请求容量
- 对象数量:Pod、Service、ConfigMap、Secret 等 API 对象的最大数量
巡检关联:Velero 缓存 Pod 的 CPU 和内存请求(requests)与限制(limits)直接影响 RPO(恢复点目标)。若配额设置过紧,缓存 Pod 在恢复高峰期可能被 OOMKill 或调度失败,导致缓存命中率骤降、RPO 恶化。
3.2 Namespace 级别配额:ResourceQuota
ResourceQuota 是 Kubernetes 内置的 API 对象,作用于 Namespace 级别。管理员通过定义 ResourceQuota 来限制一个 Namespace 内所有 Pod 的资源总和上限。
以下是一个典型的 ResourceQuota 配置示例:
apiVersion: v1
kind: ResourceQuota
metadata:
name: velero-cache-quota
namespace: velero-system
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
persistentvolumeclaims: "10"
requests.storage: "100Gi"
count/pods: "50"
关键字段说明:
| 字段 | 含义 | 对 Velero 缓存的影响 |
|---|---|---|
requests.cpu / requests.memory |
Namespace 内所有 Pod 的请求资源总和上限 | 限制缓存 Pod 的调度密度,过小会导致 Pod 无法创建 |
limits.cpu / limits.memory |
Namespace 内所有 Pod 的限制资源总和上限 | 限制缓存 Pod 的突发资源使用,过小会触发限流或 OOM |
persistentvolumeclaims |
允许创建的 PVC 最大数量 | 限制缓存卷的数量,影响缓存容量扩展 |
requests.storage |
所有 PVC 请求存储容量的总和上限 | 限制缓存数据的总存储量,直接影响缓存命中率 |
count/pods |
允许运行的 Pod 最大数量 | 限制缓存副本数,影响并发恢复能力 |
常见陷阱:ResourceQuota 只限制 总和,不限制单个 Pod 的资源规格。如果单个缓存 Pod 请求 4Gi 内存,而 Namespace 总配额只有 8Gi,则最多只能调度 2 个缓存 Pod。巡检时需同时关注配额总量与单个 Pod 规格的匹配度。
3.3 单个 Pod/容器级别约束:LimitRange
LimitRange 是 ResourceQuota 的补充机制,用于在 Pod 或容器级别设置默认资源请求/限制,以及最小/最大约束。它确保单个 Pod 不会占用过多配额,也不会因未设置资源规格而被调度器拒绝。
典型 LimitRange 配置:
apiVersion: v1
kind: LimitRange
metadata:
name: velero-cache-limits
namespace: velero-system
spec:
limits:
- max:
cpu: "2"
memory: "4Gi"
min:
cpu: "100m"
memory: "256Mi"
default:
cpu: "500m"
memory: "1Gi"
defaultRequest:
cpu: "200m"
memory: "512Mi"
type: Container
LimitRange 核心参数:
- max / min:容器资源规格的硬边界,超出则 Pod 创建失败
- default:当 Pod 未设置 limits 时,自动注入的默认限制值
- defaultRequest:当 Pod 未设置 requests 时,自动注入的默认请求值
巡检要点:Velero 缓存 Pod 的 YAML 中若未显式设置 resources,LimitRange 会自动注入默认值。巡检时需核对默认值是否与缓存工作负载的实际需求匹配——默认值过小会导致缓存性能不足,过大则可能突破 ResourceQuota 总和限制。
3.4 ResourceQuota 与 LimitRange 协同关系
两者共同构成 Kubernetes 资源配额的两层防线:
协同工作流程:
- 创建 Pod 时:LimitRange 首先校验单个容器的资源规格是否在 min/max 范围内,若未设置则注入默认值
- 调度准入:Kubernetes 准入控制器(Admission Controller)计算该 Pod 的资源请求是否会导致 Namespace 超出 ResourceQuota 总和上限
- 运行期:ResourceQuota 持续监控 Namespace 内资源使用总量,超出硬限制(hard)后拒绝新 Pod 创建
3.5 资源配额对 Velero 缓存 RPO 的影响
资源配额配置不当会直接导致 Velero 缓存命中率下降,进而拉长 RPO:
| 配额问题 | 表现 | RPO 影响 |
|---|---|---|
| ResourceQuota 内存总和过小 | 缓存 Pod 无法扩容,频繁 OOMKill | 缓存命中率下降 30%~50%,RPO 延长 2~5 倍 |
| LimitRange 默认值过小 | 缓存 Pod 自动注入低资源规格,性能不足 | 缓存写入/读取延迟增加,RPO 波动 |
| PVC 数量配额不足 | 无法创建新的缓存卷,缓存数据无法持久化 | 缓存容量受限,频繁驱逐旧数据,RPO 不稳定 |
| Pod 数量配额不足 | 缓存副本数受限,无法利用多节点并行恢复 | 恢复吞吐量下降,RPO 无法满足 SLA |
最佳实践:在 Velero 缓存 Namespace 中,建议将 ResourceQuota 设置为集群总容量的 20%~30%,并配合 LimitRange 设置合理的默认值(如 CPU 请求 500m、内存 1Gi)。巡检时使用
kubectl describe quota -n velero-system 查看当前使用量,确保 Used 不超过 Hard 的 80%。
3.6 巡检命令速查
# 查看 ResourceQuota 定义与当前使用量
kubectl get resourcequota -n velero-system -o yaml
kubectl describe quota -n velero-system
# 查看 LimitRange 定义
kubectl get limitrange -n velero-system -o yaml
# 检查 Pod 实际资源使用是否接近配额上限
kubectl top pod -n velero-system
# 查看因配额不足导致的调度失败事件
kubectl get events -n velero-system --field-selector reason=FailedCreatePodSandBox
巡检频率建议:资源配额巡检应纳入每日自动巡检脚本。重点关注 ResourceQuota 的 Used/Hard 比例,当任一资源使用率超过 85% 时触发告警,预留缓冲空间以应对恢复峰值。