4. Pod 资源请求与限制:Requests 与 Limits 的语义、QoS 分类及其对调度的影响

在 Kubernetes 集群中,Pod 是调度的最小单元,而资源管理是保障集群稳定性和利用率的核心手段。每个容器都可以声明其所需的计算资源(CPU 和内存),这些声明直接影响调度决策、节点压力以及 Pod 的生命周期。本章将深入解析 requests 与 limits 的语义、三种 QoS 分类及其对调度行为的影响。

4.1 Requests 与 Limits 的语义

Kubernetes 通过两个关键字段定义容器的资源约束:

  • Requests(请求):容器启动时保证获得的最小资源量。调度器依据 Pod 中所有容器 requests 的总和来选择满足条件的节点。
  • Limits(限制):容器可以使用的资源上限。当容器尝试使用超过 limits 的资源时,系统会进行限制(CPU 节流)或终止(内存 OOM)。
关键区别: Requests 用于调度和资源预留,Limits 用于运行时约束和突发控制。未设置 Limits 时,容器可以无限使用节点空闲资源,但可能被其他 Pod 抢占。
资源类型 Requests 语义 Limits 语义 超限后果
CPU 调度保证,CFS 配额分配 硬上限,CFS 周期内节流 CPU 节流(Throttling),性能下降
Memory 调度保证,内存预留 硬上限,OOM Killer 触发 容器被终止(OOMKilled)
Ephemeral Storage 调度保证,本地磁盘预留 硬上限,驱逐阈值 Pod 被驱逐(Eviction)

4.2 QoS 分类:三种服务质量等级

Kubernetes 根据 Pod 中所有容器的 requests 和 limits 配置,将 Pod 划分为三种 QoS(Quality of Service)类别。这一分类决定了节点资源紧张时 Pod 被驱逐的优先级。

QoS 分类规则:
  • Guaranteed:每个容器都设置了 requests 和 limits,且两者相等(CPU 和内存均需满足)。
  • Burstable:至少有一个容器设置了 requests 或 limits,但不满足 Guaranteed 条件。
  • BestEffort:所有容器均未设置 requests 和 limits。
Pod QoS 分类决策流程 Pod 创建/更新 所有容器都设置了 requests 和 limits? 是 所有资源 requests == limits? 是 Guaranteed 否 否 Burstable 所有容器均未设置 requests 和 limits? 是 BestEffort 说明:Guaranteed 优先级最高,BestEffort 优先级最低。节点资源不足时,驱逐顺序为 BestEffort → Burstable → Guaranteed。

4.3 QoS 对调度与驱逐的影响

4.3.1 调度决策

调度器在节点选择时,主要依据 Pod 的 requests 总和,而非 limits。这意味着:

  • Guaranteed Pod:调度器为其预留了与 limits 相等的资源,节点上其他 Pod 无法抢占这部分资源。
  • Burstable Pod:调度器只保证 requests 部分,limits 部分属于“尽力而为”的突发能力。
  • BestEffort Pod:调度器不预留任何资源,仅当节点有空闲资源时才能运行。
常见误区: 设置过高的 limits 而 requests 很低,会导致调度器低估实际资源需求,造成节点过载和性能抖动。

4.3.2 节点压力驱逐(Eviction)

当节点内存或磁盘资源不足时,kubelet 会根据 QoS 等级和资源使用量决定驱逐顺序:

QoS 等级 驱逐优先级 典型场景 恢复行为
BestEffort 最高(最先被驱逐) 批处理任务、日志采集 sidecar 可能被重新调度到其他节点
Burstable 中等 Web 服务、API 网关 根据 requests 重新调度
Guaranteed 最低(最后被驱逐) 数据库、关键业务服务 仅当节点完全不可用时才迁移

4.4 最佳实践与配置建议

生产环境资源配额建议:
  • 关键服务(数据库、核心 API):使用 Guaranteed QoS,requests = limits,确保资源独占性。
  • 普通微服务:使用 Burstable QoS,requests 设为基线负载的 70-80%,limits 设为峰值负载的 120-150%。
  • 批处理/离线任务:使用 BestEffort QoS,充分利用节点空闲资源,允许被优先驱逐。
  • 避免:所有 Pod 都使用 BestEffort 或所有 Pod 都使用 Guaranteed,前者导致稳定性差,后者造成资源浪费。
不同 QoS 等级的资源使用模式对比 Guaranteed requests = limits 资源独占,无突发 CPU 不节流 内存不 OOM 驱逐优先级:最低 Burstable requests < limits 基线保证 + 突发能力 CPU 可能节流 内存可能 OOM 驱逐优先级:中等 BestEffort 无 requests/limits 无资源保证 完全依赖空闲资源 随时可能被驱逐 驱逐优先级:最高 建议:混合使用三种 QoS 等级,关键服务用 Guaranteed,普通服务用 Burstable,离线任务用 BestEffort,实现资源利用率与稳定性的平衡。

4.5 常见配置示例

apiVersion: v1
kind: Pod
metadata:
  name: guaranteed-pod
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "512Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "500m"
apiVersion: v1
kind: Pod
metadata:
  name: burstable-pod
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "256Mi"
        cpu: "250m"
      limits:
        memory: "1Gi"
        cpu: "1"
apiVersion: v1
kind: Pod
metadata:
  name: besteffort-pod
spec:
  containers:
  - name: app
    image: busybox
    command: ["sleep", "3600"]
  # 未设置 resources 字段
容量规划提示: 在集群维度统计所有 Pod 的 requests 总和,确保节点可分配资源(Allocatable)大于等于该总和。同时监控 limits 总和,评估突发场景下的资源争抢风险。