4. 容量规划基础:资源需求、资源限制、请求与限制的关系、QoS等级

在 Kubernetes 集群中进行容量规划,核心前提是理解 Pod 如何声明和消耗计算资源。资源需求(Requests)与资源限制(Limits)是调度与隔离的基石,而服务质量等级(QoS)则决定了 Pod 在节点资源竞争时的生存优先级。本节将逐一拆解这些概念,并建立它们与容量规划的直接关联。

4.1 资源需求(Requests)与资源限制(Limits)

每个容器都可以在 Pod 规范中声明两类资源参数:

  • Requests(需求):容器保证能获得的最小资源量。Kubernetes 调度器依据 Requests 总和来选择节点,确保节点容量满足所有 Pod 的“最低保障”。
  • Limits(限制):容器允许使用的资源上限。当容器试图超过 Limits 时,CPU 会被节流(Throttle),内存不足(OOM)时会被杀死。
容量规划关键点: 集群的总容量规划应基于 Requests 而非 Limits。因为调度决策只认 Requests,超卖(Overcommit)正是通过设置 Limits > Requests 来实现的。

4.1.1 典型配置示例

apiVersion: v1
kind: Pod
metadata:
  name: capacity-demo
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "256Mi"
        cpu: "250m"
      limits:
        memory: "512Mi"
        cpu: "500m"

4.2 请求与限制的关系:三种配置模式

Requests 与 Limits 的组合关系直接决定了 Pod 的资源行为与 QoS 等级。下表总结了三种核心模式:

配置模式 Requests Limits 典型场景
Guaranteed(保证) 等于 Limits 等于 Requests 延迟敏感型服务(数据库、核心 API)
Burstable(可爆发) 小于 Limits 大于 Requests Web 服务、批处理任务(允许临时超卖)
BestEffort(尽力而为) 未设置 未设置 低优先级、可中断的测试或缓存任务
容量规划建议: 在 Argo CD 多集群部署中,建议为生产集群的“核心工作负载”统一使用 Guaranteed 模式,以消除节点资源争用;为“弹性工作负载”使用 Burstable 模式,提高整体资源利用率。

4.3 QoS 等级(服务质量等级)

Kubernetes 根据 Pod 内所有容器的 Requests 与 Limits 设置,自动为每个 Pod 分配一个 QoS 等级。当节点资源不足时,kubelet 会按以下优先级驱逐 Pod:

  1. BestEffort(最低优先级)—— 最先被驱逐
  2. Burstable(中等优先级)—— 当资源压力持续时被驱逐
  3. Guaranteed(最高优先级)—— 最后被驱逐,仅当节点资源严重耗尽时
常见误区: 即使 Pod 设置了 Limits,但如果未设置 Requests,Kubernetes 会将 Requests 默认等于 Limits,从而自动归入 Guaranteed 等级。这可能导致容量规划时低估实际资源需求,造成节点过载。

4.4 资源关系与 QoS 决策流程

下图展示了从资源声明到 QoS 等级分配的完整决策路径,帮助容量规划者快速判断 Pod 的优先级行为:

资源请求、限制与 QoS 等级决策流程 资源声明 → QoS 等级决策流程 Pod 资源声明 是否同时设置了 Requests 和 Limits? Requests 和 Limits 均未设置 仅设置了 Limits Requests 和 Limits 都设置 Requests == Limits ? QoS: BestEffort QoS: Burstable QoS: Guaranteed

4.5 容量规划中的资源模型总结

将上述概念映射到多集群容量规划,可归纳为以下核心公式与策略:

  • 节点可调度容量 = 节点总容量 - 系统预留 - kubelet 预留 - 已分配 Requests 总和
  • 超卖比 = 集群 Limits 总和 / 集群 Requests 总和。建议生产集群控制在 1.5~2.0 之间。
  • QoS 分布策略:核心服务(Guaranteed)占比 40%~50%,弹性服务(Burstable)占比 40%~50%,BestEffort 占比不超过 10%。
Argo CD 多集群实践提示: 在 ApplicationSet 的模板中,可以通过 resources.requests 和 resources.limits 参数为不同集群环境(prod/staging/dev)设置差异化的资源声明,从而实现集群级别的容量策略统一管理。