3. 资源抽象与 QoS:Requests 与 Limits 定义、Pod QoS 类别、资源超卖原理
在 Kubernetes 集群中,资源管理是容量调优的核心。理解 Requests 与 Limits 的语义差异、掌握 Pod QoS 类别 的判定逻辑,并合理运用 资源超卖 机制,是提升集群资源利用率、保障关键业务稳定性的关键。
3.1 Requests 与 Limits:资源预留与硬限制
Kubernetes 通过 resources.requests 和 resources.limits 两个字段定义容器的资源约束。Requests 用于调度决策(资源预留),Limits 用于运行时限制(硬上限)。
| 属性 | 语义 | 调度影响 | 运行时行为 |
|---|---|---|---|
| Requests | 容器保证能获得的资源下限 | Kube-scheduler 根据 Node 剩余可分配资源(Allocatable)与 Pod 所有容器 Requests 之和进行调度 | CPU 使用 CFS 配额保证;内存由 kubelet 保证,不触发 OOM 优先回收 |
| Limits | 容器允许使用的资源上限 | 不影响调度(仅用于运行时限制) | CPU 通过 CFS 配额硬限制;内存超过 Limits 时容器会被 OOM Kill |
关键原则: 当 Limits 未设置时,默认等于 Requests(部分资源插件可配置)。生产环境建议始终显式设置 Limits,避免因内存泄漏导致节点 OOM。
3.2 Pod QoS 类别:三种服务质量等级
Kubernetes 根据 Pod 内所有容器的 Requests 与 Limits 配置,自动将 Pod 归入三类 QoS 等级。该等级决定了节点资源竞争时的驱逐优先级。
3.3 QoS 类别对比与驱逐优先级
| QoS 类别 | 配置条件 | 资源保证 | OOM 优先级 | 节点压力驱逐顺序 |
|---|---|---|---|---|
| Guaranteed | 所有容器 CPU 和内存的 Requests == Limits | 完全保证,不会因超卖被抢占 | 最低(oom_score_adj = -998) | 最后被驱逐 |
| Burstable | 至少一个容器设置了 Requests 或 Limits,但不满足 Guaranteed | 部分保证,可超卖 | 中等(oom_score_adj = min(1000, 1000 - 1000 * memory_request_bytes / total_memory_bytes)) | 在 BestEffort 之后被驱逐 |
| BestEffort | 所有容器均未设置 Requests 和 Limits | 无保证,完全依赖空闲资源 | 最高(oom_score_adj = 1000) | 最先被驱逐 |
调优建议: 核心数据库、关键 API 网关等有状态服务应配置为 Guaranteed;批处理任务、离线分析作业可配置为 Burstable 或 BestEffort,以充分利用超卖资源。
3.4 资源超卖原理与实现
资源超卖(Overcommit)是指节点上所有 Pod 的 Requests 总和超过节点实际可分配资源(Allocatable)的现象。Kubernetes 允许超卖,但需要理解其风险与收益。
3.4.1 超卖模型
3.4.2 超卖控制策略
- CPU 超卖: 安全度较高。Linux CFS 调度器按权重分配时间片,超卖时仅导致 CPU 竞争和性能下降,不会导致进程死亡。建议超卖率控制在 1.5~3.0 之间。
- 内存超卖: 风险较高。当节点内存不足时,kubelet 会触发 OOM Killer 按 QoS 优先级和 oom_score_adj 驱逐 Pod。建议内存超卖率不超过 1.2~1.5。
- 磁盘/网络超卖: 通常不推荐。磁盘 IO 和网络带宽缺乏有效的硬限制机制,超卖可能导致性能抖动。
风险提示: 内存超卖是节点级故障的主要诱因。当节点内存使用接近 100% 时,系统进程(如 kubelet、dockerd)可能因 OOM 被杀死,导致节点 NotReady。建议为系统进程预留 5%~10% 的内存(通过 kubelet
--system-reserved 参数)。
3.5 超卖配置示例
以下是一个典型的 Burstable Pod 配置,允许 CPU 超卖 2 倍,内存超卖 1.5 倍:
apiVersion: v1
kind: Pod
metadata:
name: burstable-pod
spec:
containers:
- name: app
image: nginx:latest
resources:
requests:
cpu: "500m" # 预留 0.5 核
memory: "256Mi" # 预留 256 MiB
limits:
cpu: "1000m" # 上限 1 核(超卖 2 倍)
memory: "512Mi" # 上限 512 MiB(超卖 2 倍)
对应的 QoS 类别判定:
- CPU:Requests (500m) ≠ Limits (1000m) → 不满足 Guaranteed
- 内存:Requests (256Mi) ≠ Limits (512Mi) → 不满足 Guaranteed
- 至少设置了 Requests 和 Limits → Burstable
3.6 容量调优中的超卖决策
| 场景 | 推荐超卖策略 | QoS 配置建议 | 监控指标 |
|---|---|---|---|
| 在线交易系统 | 不超卖或极低超卖(CPU ≤ 1.1x,内存 ≤ 1.0x) | 全部 Guaranteed | CPU 节流率、内存 OOM 次数 |
| 微服务集群 | 适度超卖(CPU 1.5~2.0x,内存 1.2~1.5x) | 核心服务 Guaranteed,非核心 Burstable | Pod 驱逐频率、节点内存压力 |
| 离线批处理/CI | 高超卖(CPU 2.0~3.0x,内存 1.5~2.0x) | Burstable 或 BestEffort | 任务完成时间、重试率 |
| 开发/测试环境 | 极限超卖(CPU 3.0~5.0x,内存 2.0~3.0x) | BestEffort 为主 | 节点可用性、Pod 启动成功率 |
容量调优核心公式:
节点有效容量 = Allocatable × (1 + 超卖率)
安全超卖率 = min(CPU 超卖率, 内存超卖率)
实际可调度 Pod 数 = 节点有效容量 / 平均 Pod Requests
节点有效容量 = Allocatable × (1 + 超卖率)
安全超卖率 = min(CPU 超卖率, 内存超卖率)
实际可调度 Pod 数 = 节点有效容量 / 平均 Pod Requests