2、资源模型核心概念:Pod资源请求与限制、服务质量等级(QoS)、资源单位换算
Kubernetes 调度器在决定 Pod 放置位置时,最核心的输入就是 Pod 的资源模型。资源模型定义了 Pod 中每个容器对 CPU、内存等计算资源的声明方式,并由此衍生出 Pod 的服务质量等级(QoS)。理解资源模型是掌握调度优化的第一步。
2.1 资源请求(Requests)与限制(Limits)
每个容器在 Pod 的 spec 中都可以声明两类资源参数:
- Requests(请求):容器启动时保证获得的最小资源量。调度器依据所有容器的 requests 之和判断节点是否满足 Pod 运行条件。
- Limits(限制):容器运行时允许使用的资源上限。当容器试图使用超过 limits 的资源时,系统会进行限流或强制终止。
关键原则:Requests 用于调度决策,Limits 用于运行时约束。两者可以相等,也可以不等。当 Limits 未设置时,默认等于 Requests。
以下是一个典型的 Pod 资源声明示例:
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "500m" # 0.5 个 CPU 核心
memory: "256Mi" # 256 Mebibytes
limits:
cpu: "1" # 1 个 CPU 核心
memory: "512Mi" # 512 Mebibytes
2.2 资源单位换算
Kubernetes 使用两种资源类型:可压缩资源(CPU)和不可压缩资源(内存)。它们的单位换算规则不同。
| 资源类型 | 基础单位 | 常用后缀 | 换算关系 | 说明 |
|---|---|---|---|---|
| CPU | 核心(core) | m(millicores) | 1 core = 1000m | 100m 表示 0.1 个 CPU 核心 |
| 内存 | 字节(byte) | Ki、Mi、Gi | 1 Gi = 1024 Mi | 二进制单位,1 Mi = 1024 Ki |
| 内存 | 字节(byte) | K、M、G | 1 G = 1000 M | 十进制单位,1 M = 1000 K |
避坑提示:内存单位区分大小写。
Mi 是二进制(Mebibyte),M 是十进制(Megabyte)。生产环境中推荐使用二进制单位(Ki、Mi、Gi)以避免精度误差。
2.3 服务质量等级(QoS)
Kubernetes 根据 Pod 中所有容器的 requests 和 limits 设置,将 Pod 划分为三种服务质量等级(Quality of Service, QoS)。当节点资源紧张时,kubelet 按照 QoS 等级从低到高优先驱逐 Pod。
2.4 QoS 等级判定规则
判定一个 Pod 属于哪个 QoS 等级,遵循以下逻辑:
- Guaranteed:Pod 中所有容器都必须同时设置 CPU 和内存的 requests 与 limits,且每个资源的 requests 必须等于 limits。
- BestEffort:Pod 中所有容器都未设置任何 requests 和 limits。
- Burstable:既不是 Guaranteed 也不是 BestEffort 的 Pod,即至少有一个容器设置了 requests 或 limits,但不满足 Guaranteed 的严格条件。
常见误区:如果一个 Pod 中部分容器设置了 requests/limits,部分容器没有设置,整个 Pod 的 QoS 等级是 Burstable,而不是 BestEffort。BestEffort 要求所有容器都不设置任何资源字段。
2.5 QoS 对调度与驱逐的影响
| QoS 等级 | 调度优先级 | 节点资源超卖容忍度 | 驱逐优先级(低→高) | 典型使用场景 |
|---|---|---|---|---|
| Guaranteed | 最高 | 不允许超卖 | 3(最后驱逐) | 数据库、核心中间件 |
| Burstable | 中等 | 允许适度超卖 | 2 | 无状态微服务、Web 应用 |
| BestEffort | 最低 | 允许大量超卖 | 1(最先驱逐) | 批处理、CI/CD 任务 |
调度优化启示:对于延迟敏感的关键业务 Pod,应设置为 Guaranteed 等级,确保调度器为其预留独占资源,避免因节点资源竞争导致性能抖动。对于弹性伸缩的微服务,Burstable 等级可以在保证基础资源的同时利用空闲资源提升吞吐。
2.6 资源模型与拓扑感知的关联
资源模型是拓扑感知部署的基础输入。调度器在计算拓扑分布时,需要精确知道每个 Pod 的 requests 值,才能判断节点或拓扑域(如 NUMA 节点、可用区)是否还有足够的剩余容量。QoS 等级则影响调度器在资源竞争时的决策倾向——Guaranteed Pod 会优先获得最优拓扑位置。