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 资源配额的两层防线:

ResourceQuota 与 LimitRange 协同关系 Namespace: velero-system ResourceQuota(总和限制) CPU 请求总和 ≤ 4 核 内存请求总和 ≤ 8 Gi PVC 数量 ≤ 10 个 存储请求总和 ≤ 100 Gi Pod 数量 ≤ 50 个 LimitRange(单容器约束) CPU 最小 100m / 最大 2 核 内存最小 256Mi / 最大 4Gi 默认 CPU 请求 200m / 限制 500m 默认内存请求 512Mi / 限制 1Gi 协同约束 缓存 Pod(受两层约束) requests: cpu=200m, memory=512Mi limits: cpu=500m, memory=1Gi

协同工作流程:

  1. 创建 Pod 时:LimitRange 首先校验单个容器的资源规格是否在 min/max 范围内,若未设置则注入默认值
  2. 调度准入:Kubernetes 准入控制器(Admission Controller)计算该 Pod 的资源请求是否会导致 Namespace 超出 ResourceQuota 总和上限
  3. 运行期: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% 时触发告警,预留缓冲空间以应对恢复峰值。