Resource Quota核心概念与设计原则
Kubernetes多租户场景下,Resource Quota是命名空间级别的资源配额控制机制,防止单个租户过度消耗集群资源影响其他业务。Resource Quota限制的对象包括计算资源(CPU、内存)、存储资源(PVC数量、存储容量)和对象数量(Pod、Service、ConfigMap等)。每个Namespace可以配置多个Resource Quota对象,Kubernetes在Admission阶段检查请求是否超出配额,超出则拒绝创建。
配额设计原则:一是按业务优先级分配,核心业务Namespace获得更高配额;二是预留缓冲,配额总量不超过集群容量的80-85%,留出弹性空间;三是区分requests和limits,requests决定调度和配额消耗,limits决定运行时上限。
计算资源配额配置示例
以下是一个典型的多租户Resource Quota配置:
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant-a-quota
namespace: tenant-a
spec:
hard:
requests.cpu: "32"
requests.memory: 64Gi
limits.cpu: "64"
limits.memory: 128Gi
pods: "50"
services: "10"
persistentvolumeclaims: "20"
requests.storage: "500Gi"
requests.nvidia.com/gpu: "4"
requests.nvidia.com/gpu.a100: "2"
关键配置说明:requests.cpu/memory控制调度资源预留总量,limits.cpu/memory控制运行时资源上限,pods限制最大Pod数量防止资源碎片化攻击。GPU等扩展资源通过设备插件注册后也可纳入配额管理。
LimitRange配合Resource Quota实现精细控制
Resource Quota控制Namespace总量,LimitRange控制每个Pod的资源范围。二者配合实现”总量+单实例”的双重约束:
apiVersion: v1
kind: LimitRange
metadata:
name: tenant-a-limits
namespace: tenant-a
spec:
limits:
- type: Container
max:
cpu: "8"
memory: 16Gi
min:
cpu: 100m
memory: 128Mi
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 256Mi
maxLimitRequestRatio:
cpu: "4"
memory: "3"
default和defaultRequest为未指定资源的Container设置默认值,maxLimitRequestRatio限制limits/requests比值防止过度超卖。例如CPU比值4意味着一个Container最多声明4倍于request的limit,避免低request高limit的”资源投机”行为。
PriorityClass与配额抢占机制
当集群资源紧张时,PriorityClass决定Pod的调度优先级和抢占顺序。高优先级Pod可驱逐低优先级Pod获取资源:
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000
preemptionPolicy: PreemptLowerPriority
globalDefault: false
description: "核心业务高优先级"
抢占流程:调度器发现高优先级Pod无法调度时,从候选节点上选择低优先级Pod集合,优先驱逐Priority最低且Pod数量最少的节点。被驱逐Pod进入待调度队列等待资源释放。
配额场景下的抢占策略:为核心业务Namespace设置更高的PriorityClass,同时适当降低配额总量(因为核心业务可通过抢占获取资源),为非核心业务设置足够配额但低PriorityClass。这样非核心业务在资源充足时充分利用,资源紧张时自动让出。
多租户配额审计与监控
Resource Quota使用情况需要持续监控,及时发现配额耗尽导致的应用部署失败:
1. kubectl查看:kubectl get resourcequota -n tenant-a -o yaml显示used/hard对比
2. Prometheus指标:kube-resourcequota标签暴露requests/limits使用量,Grafana面板按Namespace展示配额利用率
3. 告警规则:配额利用率超过85%触发预警,超过95%触发告警
4. 配额变更审计:Kubernetes Audit Log记录Resource Quota的创建和修改操作,配合Falco或OPA Gatekeeper在准入层拦截违规的配额修改请求,防止租户自行扩容突破资源边界。
层次化配额与VPA自动调节
企业级多租户场景需要层次化配额:部门级配额到团队级配额到项目级配额,上级配额约束下级总量。社区方案包括:
1. KubeAdmiral:字节跳动开源的多集群联邦方案,支持层次化配额管理和跨集群调度。
2. Volcano Queue:Volcano批调度器的Queue概念实现层次化资源队列,支持层级权重分配和借还机制,子队列可临时借用父队列闲置资源。
3. VPA(Vertical Pod Autoscaler):自动调整Pod的requests/limits,与Resource Quota联动。VPA Recommender分析历史资源使用率给出建议值,VPA Updater驱逐并重建Pod应用新配置。注意VPA必须配合LimitRange使用,VPA推荐的资源值不能超过LimitRange.max,否则Pod无法创建。
VPA与Resource Quota的冲突处理:VPA更新Pod requests后可能突破Namespace配额,导致Pod重建失败。解决方案是在VPA Recommender中加入配额检查逻辑,推荐值不超过配额剩余量,或在Resource Quota中预留VPA增长缓冲区。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetesresourcequota-pei-e-guan-li-yu-duo-zu-hu-zi-yuan/