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 等级:

QoS 分类决策流程 Pod 资源声明 所有容器均设置 Requests & Limits? (CPU 和 Memory 均需设置) 是 每个容器 Requests == Limits? (CPU 和 Memory 均需相等) 是 Guaranteed 最高保障,最低驱逐优先级 否 Burstable 部分保障,中等驱逐优先级 否 BestEffort 无保障,最高驱逐优先级 说明: • Guaranteed:所有容器 Requests == Limits,资源完全保障,驱逐优先级最低。 • Burstable:至少一个容器设置了 Requests 或 Limits,但不满足 Guaranteed 条件。 • BestEffort:所有容器均未设置 Requests 和 Limits,无任何资源保障。

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 配额限制其数量。