2. Requests与Limits基础:Kubernetes资源模型、Requests与Limits区别、服务质量等级(QoS)分类
2.1 Kubernetes资源模型概述
Kubernetes 的资源模型围绕 Pod 这一最小调度单元展开,每个容器都可以声明其所需的计算资源。资源模型的核心设计原则是:声明式资源配额——用户告诉集群“我需要多少”,集群根据声明进行调度和限制。
资源模型包含两个关键维度:
- CPU:可压缩资源,单位为 millicores(m),1000m = 1 vCPU。当 CPU 使用超过 Limits 时,容器会被限流(throttle),但不会被杀死。
- Memory:不可压缩资源,单位为字节(Mi、Gi)。当内存使用超过 Limits 时,容器可能因 OOM(Out of Memory)被杀死。
关键概念: 资源模型中的“请求(Requests)”用于调度决策,“限制(Limits)”用于运行时约束。两者共同决定了 Pod 在节点上的资源保障与上限。
2.2 Requests与Limits的区别
Requests 和 Limits 是容器资源声明的两个独立字段,它们在调度、运行时和 QoS 分类中扮演不同角色。以下表格清晰展示了两者的核心差异:
| 对比维度 | Requests(请求) | Limits(限制) |
|---|---|---|
| 定义 | 容器运行所需的最小资源保证 | 容器允许使用的资源上限 |
| 调度影响 | 节点必须满足 Requests 总和 ≤ 节点容量,否则 Pod 无法调度 | 不影响调度决策 |
| 运行时行为 | Kubelet 保证容器至少获得 Requests 声明的资源 | 超过 Limits 时:CPU 被限流,Memory 触发 OOM Kill |
| QoS 分类依据 | 与 Limits 是否相等决定 QoS 等级 | 与 Requests 是否相等决定 QoS 等级 |
| 默认值 | 若未设置,默认等于 Limits(若 Limits 已设置) | 若未设置,默认等于 Requests(若 Requests 已设置) |
| 典型场景 | 稳定业务、需要资源保障的容器 | 突发流量、防止资源滥用 |
最佳实践: 生产环境中,建议始终同时设置 Requests 和 Limits。对于延迟敏感型服务,将 Requests 与 Limits 设置为相同值(Guaranteed QoS);对于批处理任务,可适当放宽 Limits 以利用空闲资源。
2.3 服务质量等级(QoS)分类
Kubernetes 根据 Pod 中所有容器的 Requests 和 Limits 设置情况,将 Pod 划分为三种服务质量等级(Quality of Service, QoS)。QoS 等级决定了节点资源紧张时 Pod 被驱逐的优先级。
2.3.1 三种 QoS 等级定义
| QoS 等级 | 判定条件 | 资源保障 | 驱逐优先级 |
|---|---|---|---|
| Guaranteed | 所有容器均设置 Requests 和 Limits,且每个容器的 Requests == Limits(CPU 和 Memory 均需相等) | 最高保障,节点必须满足 Requests | 最低(最后被驱逐) |
| Burstable | 至少一个容器设置了 Requests 或 Limits,但不满足 Guaranteed 条件 | 部分保障,可突发使用空闲资源 | 中等 |
| BestEffort | 所有容器均未设置 Requests 和 Limits | 无保障,完全依赖空闲资源 | 最高(最先被驱逐) |
注意: 如果 Pod 中某个容器只设置了 Limits 而未设置 Requests,Kubernetes 会自动将 Requests 设置为与 Limits 相同。这可能导致 Pod 被归类为 Guaranteed,但实际资源保障可能低于预期——因为 Requests 被隐式提升,调度时可能占用更多资源。
2.3.2 QoS 分类决策流程
以下 SVG 图展示了 Kubernetes 如何根据容器的 Requests/Limits 设置判定 Pod 的 QoS 等级:
2.4 资源模型与 QoS 的协同关系
Requests/Limits 的设置不仅影响调度和运行时,还直接决定了 Pod 的 QoS 等级,进而影响节点资源紧张时的驱逐行为。以下表格总结了不同 QoS 等级下的资源行为特征:
| QoS 等级 | CPU 超卖风险 | Memory 超卖风险 | 节点压力驱逐顺序 | 典型使用场景 |
|---|---|---|---|---|
| Guaranteed | 低(Requests == Limits,无超卖) | 低(Requests == Limits,无超卖) | 最后 | 数据库、核心微服务、延迟敏感应用 |
| Burstable | 中(Limits > Requests,允许突发) | 高(Limits > Requests,可能 OOM) | 中等 | Web 服务、批处理任务、开发环境 |
| BestEffort | 高(无限制,完全超卖) | 极高(无限制,极易 OOM) | 最先 | 临时任务、测试 Pod、低优先级作业 |
容量规划启示: 在集群容量规划时,应优先保障 Guaranteed Pod 的资源需求,将 Burstable Pod 的 Requests 总和控制在节点容量的 60%-80% 以内,并严格控制 BestEffort Pod 的数量,避免资源争抢导致核心服务受损。
2.5 实际配置示例
以下 YAML 片段展示了三种 QoS 等级的典型配置:
# Guaranteed QoS:Requests == Limits
apiVersion: v1
kind: Pod
metadata:
name: guaranteed-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "256Mi"
---
# Burstable QoS:Limits > Requests
apiVersion: v1
kind: Pod
metadata:
name: burstable-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "200m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
---
# BestEffort QoS:未设置任何资源
apiVersion: v1
kind: Pod
metadata:
name: besteffort-pod
spec:
containers:
- name: app
image: nginx
配置建议: 生产环境中,核心服务应使用 Guaranteed QoS;非核心但有资源保障需求的服务使用 Burstable QoS,且 Requests 不应低于实际运行所需的最小值;BestEffort 仅用于临时或测试 Pod,并建议通过 PodPriority 或 Namespace 配额限制其数量。