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。
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,前者导致稳定性差,后者造成资源浪费。
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 总和,评估突发场景下的资源争抢风险。