Resource Quota

资源配额(Resource Quotas)是用来限制用户资源用量的一种机制。

它的工作原理为

  • 资源配额应用在 Namespace 上,并且每个 Namespace 最多只能有一个 ResourceQuota 对象

  • 开启计算资源配额后,创建容器时必须配置计算资源请求或限制(也可以用 LimitRange 设置默认值)

  • 用户超额后禁止创建新的资源

开启资源配额功能

  • 首先,在 API Server 启动时配置准入控制 --admission-control=ResourceQuota

  • 然后,在 namespace 中创建一个 ResourceQuota 对象

资源配额的类型

  • 计算资源,包括 cpu 和 memory

    • cpu, limits.cpu, requests.cpu

    • memory, limits.memory, requests.memory

  • 存储资源,包括存储资源的总量以及指定 storage class 的总量

    • requests.storage:存储资源总量,如 500Gi

    • persistentvolumeclaims:pvc 的个数

    • .storageclass.storage.k8s.io/requests.storage

    • .storageclass.storage.k8s.io/persistentvolumeclaims

    • requests.ephemeral-storage 和 limits.ephemeral-storage (需要 v1.8+)

  • 对象数,即可创建的对象的个数

    • pods, replicationcontrollers, configmaps, secrets

    • resourcequotas, persistentvolumeclaims

    • services, services.loadbalancers, services.nodeports

计算资源示例

对象个数示例

LimitRange

默认情况下,Kubernetes 中所有容器都没有任何 CPU 和内存限制。LimitRange 用来给 Namespace 增加一个资源限制,包括最小、最大和默认资源。比如

配额范围

每个配额在创建时可以指定一系列的范围

范围
说明

Terminating

podSpec.ActiveDeadlineSeconds>=0 的 Pod

NotTerminating

podSpec.activeDeadlineSeconds=nil 的 Pod

BestEffort

所有容器的 requests 和 limits 都没有设置的 Pod(Best-Effort)

NotBestEffort

与 BestEffort 相反

原地 Pod 资源调整与配额管理

从 Kubernetes v1.33 开始,原地 Pod 资源调整功能升级为 Beta 版本,这给资源配额管理带来了新的考量因素。

配额验证机制

当执行原地资源调整时,Kubernetes 会验证调整后的资源是否超出命名空间的配额限制:

配额检查时机

原地资源调整时的配额验证流程:

  1. 调整前验证:检查目标资源是否会超出配额

  2. 原子性操作:确保配额更新与资源调整的原子性

  3. 回滚机制:调整失败时自动恢复配额计数

动态配额管理示例

弹性配额配置

配额监控和告警

监控原地调整对配额的影响:

配额最佳实践

1. 预留缓冲区

为原地调整预留配额缓冲区:

2. 分层配额管理

针对不同优先级的工作负载设置分层配额:

3. 配额使用情况查看

监控配额使用和原地调整的影响:

故障排查

配额相关的调整失败

常见问题和解决方案:

  1. 配额不足导致调整失败

  2. 配额计算错误

  3. 配额策略冲突

与其他功能的集成

与 VPA 集成

配置支持 VPA 原地调整的配额:

与多租户环境集成

在多租户环境中合理分配原地调整能力:

最后更新于