Kubernetes 资源模型基础:Request、Limit、QoS 与资源配额

在 Kubernetes 集群中,资源管理是容量规划与稳定性治理的基石。理解 Request、Limit、QoS(服务质量) 以及 ResourceQuota(资源配额) 这四个核心概念,是后续治理版本漂移和实现精细化容量控制的前提。本节将系统梳理这些概念的定义、作用机制以及它们之间的关联。

2.1 资源请求(Request)与资源限制(Limit)

每个 Pod 中的容器都可以声明两类资源参数:CPU 和 内存。Kubernetes 通过这两个参数决定 Pod 的调度位置与运行时的资源边界。

参数 含义 调度依据 运行时行为
Request 容器保证能获得的最小资源量 kube-scheduler 根据所有 Node 上已分配 Request 之和进行调度 CPU 使用受 CFS 配额保障;内存不足时可能触发 OOM Kill
Limit 容器允许使用的资源上限 不参与调度决策 CPU 会被 throttled(节流);内存超过 Limit 时容器会被 OOM Kill
实践要点:Request 必须 ≤ Limit。如果未设置 Limit,则默认等于 Request(取决于集群配置或 LimitRange)。生产环境中建议始终显式设置两者,避免资源争抢与突发流量导致的节点过载。

2.2 服务质量(QoS)等级

Kubernetes 根据 Pod 中所有容器的 Request 与 Limit 设置,自动为每个 Pod 分配一个 QoS 等级。该等级决定了节点资源紧张时 Pod 被驱逐的优先级。

Kubernetes QoS 等级判定流程 Pod 中所有容器的 Request / Limit 所有容器 Request == Limit? 是 否 Guaranteed Burstable BestEffort:所有容器均未设置 Request 和 Limit 驱逐优先级(从低到高) Guaranteed(最不易被驱逐)→ Burstable → BestEffort(最易被驱逐) 节点资源不足时,kubelet 按此顺序驱逐 Pod
QoS 等级速查表:
  • Guaranteed:所有容器均设置 Request == Limit,且不为 0。最高优先级,最稳定。
  • Burstable:至少一个容器设置了 Request 或 Limit,但不满足 Guaranteed 条件。中等优先级。
  • BestEffort:所有容器均未设置 Request 和 Limit。最低优先级,节点压力下最先被驱逐。

2.3 资源配额(ResourceQuota)

ResourceQuota 是命名空间级别的资源约束机制,用于限制一个命名空间内所有 Pod 的资源总和,防止单个团队或应用过度消耗集群资源。

以下是一个典型的 ResourceQuota 配置示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-team-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "20"
    persistentvolumeclaims: "5"
    configmaps: "10"
    services: "10"
注意:ResourceQuota 仅限制 命名空间级别 的资源总量,不限制单个 Pod 的资源声明。若需要限制单个 Pod 或容器的资源范围,应配合使用 LimitRange 策略。

2.4 Request、Limit、QoS 与 ResourceQuota 的协同关系

这四个概念共同构成了 Kubernetes 资源管理的核心闭环:

  • Request/Limit 定义单个容器的资源边界。
  • QoS 根据 Request/Limit 自动派生,决定 Pod 在节点压力下的驱逐优先级。
  • ResourceQuota 在命名空间层面汇总所有 Pod 的 Request/Limit,实施总量控制。

在容量规划实践中,团队应首先为每个工作负载设定合理的 Request 与 Limit,然后通过 ResourceQuota 为每个命名空间划定资源上限,最后利用 QoS 等级保障关键业务 Pod 的稳定性。这种分层治理模型是后续使用 Kyverno 策略自动化治理版本漂移的基础。