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 等级。该等级决定了节点资源竞争时的驱逐优先级。

Pod QoS 类别判定流程 Pod 定义(所有容器) 所有容器:Limits == Requests 且均设置? (CPU 和内存均需满足) 是 Guaranteed 最高优先级 否 至少一个容器设置了 Requests 或 Limits? (任意资源维度) 是 Burstable 中等优先级 否 BestEffort 最低优先级

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 超卖模型

节点资源超卖模型 节点 Allocatable(100%) 已分配 Requests(85%) 超卖 实际使用(60%) 空闲(40%) 超卖率 = 已分配 Requests / Allocatable = 85% / 100% = 0.85(未超卖) 超卖率 = 已分配 Requests / Allocatable = 120% / 100% = 1.20(超卖 20%) 实际利用率 = 实际使用 / Allocatable = 60% / 100% = 0.60

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