1. K8s 资源模型基础:Pod 资源请求与限制、CPU 与内存的计量单位、服务质量 QoS 等级分类

Kubernetes 的资源管理模型是调度与稳定运行的基石。每个 Pod 在创建时都需要声明其资源需求,集群据此决定调度位置、分配资源并保障服务质量。本章从三个核心维度展开:资源请求与限制、CPU 与内存的计量单位、QoS 等级分类。

1.1 Pod 资源请求与限制

在 Pod 的每个容器定义中,通过 resources.requests 和 resources.limits 字段声明资源需求:

  • Requests(请求):容器启动时保证获得的最小资源量。调度器依据所有容器的 requests 总和判断节点是否满足资源容量。
  • Limits(限制):容器运行时允许使用的资源上限。当容器试图使用超过 limits 的资源时,系统会触发限流或 OOM Kill。
关键原则:Limits 必须 ≥ Requests。如果只设置 Limits 而未设置 Requests,则 Requests 默认等于 Limits。

以下是一个包含资源声明的 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"

1.2 CPU 与内存的计量单位

Kubernetes 使用标准化的单位体系来量化资源,确保跨平台一致性。

资源类型 单位 说明 示例
CPU 核(Core) 1 核 = 1 个物理核心或 vCPU。支持小数与毫核(m) 1、0.5、500m
内存 字节(Byte) 使用二进制单位(Ki、Mi、Gi)或十进制单位(k、M、G) 256Mi、1Gi、512M
临时存储 字节(Byte) 与内存单位体系一致,用于 emptyDir 等本地存储 10Gi、500Mi
单位换算速记:1 核 = 1000m(毫核);1Gi = 1024Mi = 1024 × 1024Ki。注意:Kubernetes 中内存的 M 表示 1000×1000 字节(十进制),而 Mi 表示 1024×1024 字节(二进制),生产环境推荐使用二进制单位(Mi、Gi)避免精度误差。

1.3 服务质量 QoS 等级分类

Kubernetes 根据 Pod 中所有容器的 Requests 与 Limits 设置,自动将 Pod 划分为三个 QoS 等级。该等级决定了节点资源紧张时 Pod 被驱逐的优先级。

QoS 等级 判定条件 驱逐优先级 典型场景
Guaranteed 每个容器都设置了 Requests 和 Limits,且 Requests == Limits 最低(最晚被驱逐) 数据库、核心中间件、有状态服务
Burstable 至少一个容器设置了 Requests,且 Requests < Limits(或未设置 Limits) 中等 Web 应用、API 网关、批处理任务
BestEffort 所有容器均未设置 Requests 和 Limits 最高(最先被驱逐) 开发调试、低优先级批处理、临时任务
重要提醒:BestEffort Pod 在节点资源耗尽时会被立即驱逐,且不保证任何资源份额。生产环境中应避免将关键业务部署为 BestEffort 等级。

1.4 资源模型与 QoS 关系图

下图展示了 Pod 资源声明与 QoS 等级之间的映射关系:

Pod 资源声明 → QoS 等级映射 资源声明方式 ① Requests == Limits ② Requests < Limits ③ 仅设置 Requests ④ 未设置任何资源 (所有容器均满足条件) QoS 等级 Guaranteed Burstable Burstable BestEffort 等级特征 • 最稳定,资源独占 • 驱逐优先级最低 • 可突发使用空闲资源 • 驱逐优先级中等 • 无资源保障 • 驱逐优先级最高 • 适合临时/调试任务

1.5 资源模型核心概念总结

下表汇总了资源模型中的关键概念及其作用:

概念 作用域 调度影响 运行时影响
Requests 容器级别 决定节点能否调度 保证最小资源分配
Limits 容器级别 不影响调度 限制资源使用上限
QoS 等级 Pod 级别 间接影响调度策略 决定驱逐优先级
资源单位 全局 统一计量标准 确保跨平台一致性
最佳实践:为生产环境的 Pod 始终设置明确的 Requests 和 Limits,并尽量使 Requests == Limits(Guaranteed 等级),以获得最稳定的调度行为和最低的驱逐风险。对于可弹性伸缩的微服务,可适当设置 Requests < Limits 以提升资源利用率。