2. Kubernetes 资源模型基础:Pod 的 Request 与 Limit、QoS 类别、资源单位换算

2.1 资源模型核心概念:Request 与 Limit

Kubernetes 的资源模型是调度与隔离的基石。每个 Pod 中的容器都可以声明两类资源约束:Request 和 Limit。理解这两者的区别,是进行节点资源画像和误差预算计算的前提。

属性 定义 调度器视角 kubelet 视角
Request 容器保证能获得的最小资源量 作为调度决策的依据(节点剩余可分配资源 ≥ 所有 Pod Request 之和) CPU 使用 CFS 配额保证;内存由 OOM 评分机制保障
Limit 容器允许使用的最大资源量 不参与调度决策 CPU 通过 CFS 配额限制;内存超过 Limit 时触发 OOM Kill
关键认知:Request 是“承诺”,Limit 是“上限”。在容量规划中,Request 总和决定了节点的“逻辑容量”,而 Limit 总和决定了节点的“风险敞口”。

2.2 资源单位换算

Kubernetes 使用两种资源类型:CPU(可压缩资源)和 Memory(不可压缩资源)。单位换算必须精确,否则会导致配置错误或容量估算偏差。

2.2.1 CPU 单位

  • 1 CPU = 1 个 vCPU / 1 个 Hyperthread(AWS vCPU、GCP Core、Azure vCore)
  • 最小单位:m(millicores),1 CPU = 1000m
  • 常见表示:500m、1.5、250m
  • 调度器按 m 累加,节点总 CPU 容量也以 m 为单位

2.2.2 内存单位

  • 基础单位:字节(Byte)
  • 支持两种后缀体系:
    • 十进制(SI):E、P、T、G、M、K → 1000 进制
    • 二进制(IEC):Ei、Pi、Ti、Gi、Mi、Ki → 1024 进制
  • Kubernetes 内部统一使用 二进制(IEC) 进行计算
单位 全称 字节数 常见场景
1 Mi Mebibyte 1,048,576 (1024²) 容器内存 Request/Limit
1 Gi Gibibyte 1,073,741,824 (1024³) 节点总内存、大内存应用
1 M Megabyte 1,000,000 (1000²) 部分监控系统(需注意转换)
1 G Gigabyte 1,000,000,000 (1000³) 云厂商实例规格描述
常见陷阱:云厂商实例规格(如 4GB 内存)使用的是十进制 G,而 Kubernetes 内部使用二进制 Gi。4GB ≈ 3.73Gi。在容量规划时,务必统一使用 二进制单位 进行计算,否则会产生约 7% 的容量误差。

2.3 QoS 类别:资源保障的等级体系

Kubernetes 根据 Pod 中所有容器的 Request 与 Limit 配置,自动将 Pod 划分为三种 QoS(服务质量) 类别。QoS 类别决定了节点资源紧张时 Pod 被驱逐的优先级。

Kubernetes QoS 类别与驱逐优先级 Guaranteed CPU: request == limit Mem: request == limit 驱逐优先级:最低 Burstable 至少一个容器 request < limit 驱逐优先级:中等 BestEffort 所有容器 均未设置 request/limit 驱逐优先级:最高 节点资源耗尽时的驱逐顺序 1. BestEffort(无资源保障) 2. Burstable(超出 Request 部分) 3. Guaranteed(仅当节点内存/磁盘严重不足) QoS 类别由 Pod 内所有容器的 Request/Limit 配置共同决定

2.4 QoS 类别判定规则

判定逻辑遵循“最严格原则”:只要有一个容器不满足条件,整个 Pod 的 QoS 就会降级。

QoS 类别 判定条件 典型配置示例 容量规划影响
Guaranteed 所有容器:CPU 和 Memory 的 request == limit,且均不为 0
resources:
  requests:
    cpu: "1"
    memory: "2Gi"
  limits:
    cpu: "1"
    memory: "2Gi"
资源行为可预测,适合核心应用;误差预算计算最稳定
Burstable 至少一个容器:request < limit,或仅设置了 request
resources:
  requests:
    cpu: "500m"
    memory: "1Gi"
  limits:
    cpu: "1"
    memory: "2Gi"
允许突发使用空闲资源;需关注超卖比例,是容量规划的主要变量
BestEffort 所有容器:均未设置 request 和 limit
resources: {}
无资源保障,驱逐时最先被清理;生产环境应避免

2.5 资源模型与容量规划的关联

核心公式:节点可调度资源 = 节点总容量 - 系统预留(kubelet/kube-proxy/OS) - eviction-hard 阈值

误差预算计算基础:节点资源利用率 = (所有 Pod 实际使用量) / (节点可调度资源)

超卖比(Overcommit Ratio): = (所有 Pod Limit 总和) / (节点可调度资源)
超卖比越高,节点资源利用率可能越高,但 OOM 和驱逐风险也越大。

2.6 实践建议:配置规范

  1. 生产核心服务:必须使用 Guaranteed QoS,request == limit,确保资源保障和驱逐优先级最低。
  2. 批处理/离线任务:可使用 Burstable,设置合理的 request,limit 可适当放大以利用空闲资源。
  3. 禁止 BestEffort:在容量规划严格的集群中,应通过 准入控制器(如 LimitRange) 强制所有 Pod 至少设置 request。
  4. 单位一致性:所有容量规划文档、监控面板、自动化脚本统一使用 二进制单位(Mi/Gi),避免换算错误。
  5. 文档化超卖策略:在误差预算台账中明确记录每个节点池的 目标超卖比,并定期审计实际超卖情况。
容量规划小技巧:在 Prometheus 中,使用 kube_pod_resource_request 和 kube_pod_resource_limit 指标,可以实时计算集群的 Request 利用率和 Limit 超卖比,为误差预算提供数据支撑。