Kubernetes 资源管理基础:Pod 资源请求与限制、QoS 类别、资源配额与 LimitRange

在 Kubernetes 集群中,资源管理是保障应用稳定性与集群效率的核心。本章将系统讲解 Pod 级别的资源请求与限制、由此衍生的 QoS 类别,以及命名空间级别的 ResourceQuota 和 LimitRange 机制。理解这些概念是后续通过 OPA Gatekeeper 实现自动化容量巡检的前提。

2.1 Pod 资源请求与限制

每个容器在 Pod 定义中都可以声明两类资源参数:requests(请求)和 limits(限制)。

  • Requests:调度器保证的最小资源量,用于节点选择与资源预留。
  • Limits:容器可以使用的资源上限,防止单个容器耗尽节点资源。

Kubernetes 目前主要管理两种可压缩资源(CPU)和一种不可压缩资源(内存)。

资源类型 Requests 语义 Limits 语义 超限行为
CPU 调度保证,CFS 配额分配 CPU 时间上限(CFS 周期) 限流(throttle),不会杀死容器
Memory 调度保证,节点内存预留 容器 cgroup memory.max OOM Kill(如果超过 limits)
Ephemeral Storage 调度保证,节点磁盘预留 本地临时存储上限 Pod 驱逐(如果超过 limits)
最佳实践:生产环境中建议始终设置 requests 与 limits。对于 CPU,可设置 requests = limits 避免 CPU 竞争抖动;对于内存,建议 limits 略高于 requests 以应对突发,但不可超过节点容量。

以下是一个包含资源声明的 Pod 示例:

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx:1.25
    resources:
      requests:
        memory: "256Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "1000m"

2.2 QoS 类别:服务质量分级

Kubernetes 根据 Pod 中所有容器的资源请求与限制设置,自动为每个 Pod 分配一个 QoS(Quality of Service)类别。该类别决定了节点资源紧张时 Pod 被驱逐的优先级。

QoS 类别分为三种:

QoS 类别 判定条件 驱逐优先级 典型场景
Guaranteed 所有容器 requests == limits(CPU 和内存) 最低(最不易被驱逐) 关键业务、数据库、有状态服务
Burstable 至少一个容器 requests < limits,且未满足 Guaranteed 中等 Web 服务、批处理任务
BestEffort 所有容器均未设置 requests 和 limits 最高(最先被驱逐) 开发测试、非关键辅助任务
容量规划要点:BestEffort Pod 在节点内存压力下会被优先杀死,且无法保证 CPU 时间。在容量规划中,应严格控制 BestEffort Pod 的数量,避免关键业务受到影响。

下图展示了 QoS 类别的判定流程与驱逐优先级关系:

QoS 类别判定流程与驱逐优先级 Pod 资源定义 所有容器 requests==limits? 是 Guaranteed 否 存在 requests 或 limits? 是 Burstable 否 BestEffort 驱逐优先级(由低到高) Guaranteed(最安全) → Burstable(中等) → BestEffort(最先被驱逐)

2.3 ResourceQuota:命名空间资源配额

ResourceQuota 是命名空间级别的资源总量限制机制。它能够限制一个命名空间内所有 Pod 的资源请求总和与限制总和,防止单个团队或项目过度占用集群资源。

一个典型的 ResourceQuota 示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    persistentvolumeclaims: "5"
    pods: "20"

ResourceQuota 支持的主要资源维度:

资源字段 含义 示例值
requests.cpu 所有 Pod CPU 请求总和上限 "4"(4 核)
requests.memory 所有 Pod 内存请求总和上限 "8Gi"
limits.cpu 所有 Pod CPU 限制总和上限 "8"
limits.memory 所有 Pod 内存限制总和上限 "16Gi"
pods 命名空间中 Pod 总数上限 "20"
persistentvolumeclaims PVC 数量上限 "5"
count/deployments.apps 特定资源对象数量上限 "10"
容量规划关联:ResourceQuota 是容量规划的“硬边界”。在 OPA Gatekeeper 巡检中,我们可以检查 ResourceQuota 的配置是否与集群实际容量匹配,以及是否所有命名空间都已配置合理的配额。

2.4 LimitRange:容器资源默认值与约束

LimitRange 在命名空间级别为容器设置资源请求与限制的默认值以及最小/最大值约束。它解决了两个问题:

  • 为未显式设置资源的 Pod 提供默认值,避免产生 BestEffort Pod。
  • 限制单个容器能申请的资源范围,防止“超大 Pod”挤占配额。

LimitRange 示例:

apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: team-a
spec:
  limits:
  - max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    type: Container

LimitRange 关键字段说明:

字段 作用 说明
max 容器资源上限 单个容器不能超过此值
min 容器资源下限 单个容器不能低于此值
default 容器 limits 默认值 当容器未设置 limits 时使用
defaultRequest 容器 requests 默认值 当容器未设置 requests 时使用

下图展示了 ResourceQuota 与 LimitRange 在命名空间中的协同作用:

命名空间资源管控:ResourceQuota + LimitRange 协同 Namespace: team-a ResourceQuota 总量硬限制 requests.cpu ≤ 4 requests.memory ≤ 8Gi LimitRange 容器级约束 min: 100m CPU / 128Mi Mem max: 2 CPU / 4Gi Mem Pod A (Guaranteed) Pod B (Burstable) Pod C (BestEffort) ResourceQuota 控制总量上限,LimitRange 控制单个容器边界,两者共同保障命名空间资源健康

2.5 资源管理四层模型总结

Kubernetes 的资源管理从 Pod 到集群分为四个层次,每一层解决不同的问题:

层次 作用范围 核心机制 容量规划关注点
容器级别 单个容器 requests / limits 避免 BestEffort,合理设置比例
Pod 级别 Pod 内所有容器 QoS 类别(自动推导) 关键业务使用 Guaranteed
命名空间级别 命名空间 ResourceQuota 总量上限与集群容量匹配
容器约束级别 命名空间 LimitRange 默认值与边界约束
OPA Gatekeeper 巡检切入点:在后续章节中,我们将利用 Gatekeeper 的 ConstraintTemplate 自动检查:① 所有 Pod 是否设置了 requests/limits;② 是否存在 BestEffort Pod;③ ResourceQuota 是否覆盖了关键资源维度;④ LimitRange 是否配置了合理的默认值。这些巡检规则将直接服务于容量规划。