2. Kubernetes 资源模型基础:Pod 与 Container 的资源请求与限制

在 Kubernetes 集群中,资源管理是性能调优与成本分摊的基石。每个 Pod 和 Container 都可以声明其所需的计算资源(CPU 和内存),集群调度器根据这些声明做出调度决策,kubelet 则依据这些声明对容器进行资源隔离与限制。理解资源模型是掌握 QoS 类别和后续成本分摊的前提。

2.1 资源请求(Request)与限制(Limit)

Kubernetes 为每个容器定义了两种资源规格:Request(请求)和 Limit(限制)。

  • Request:容器启动时保证获得的最小资源量。调度器依据所有容器的 Request 总和判断节点是否满足 Pod 运行需求。
  • Limit:容器运行时允许使用的资源上限。当容器试图使用超过 Limit 的资源时,系统会进行限流(CPU)或直接终止(内存)。

CPU 资源以 cores(核)或 millicores(毫核,1000m = 1 core)为单位;内存资源以 bytes(字节)为单位,常用 Mi、Gi 等后缀。

关键原则:Request ≤ Limit。如果只设置 Limit 而未设置 Request,则 Request 默认等于 Limit;如果只设置 Request 而未设置 Limit,则 Limit 默认为节点容量上限(无硬限制)。

2.2 资源模型对比表

属性 CPU 内存
Request 含义 保证的最小 CPU 时间片 保证的最小内存分配
Limit 含义 CPU 使用上限(可突发) 内存使用硬上限(OOM 风险)
超限行为 CPU 被限流(throttle) 容器被 OOM Kill
调度依据 Request 总和 Request 总和
计费依据 通常按 Request 计费 通常按 Request 计费

2.3 QoS 类别:三种服务质量等级

Kubernetes 根据 Pod 内所有容器的 Request 和 Limit 设置情况,将 Pod 划分为三种 QoS(Quality of Service) 类别。当节点资源紧张时,kubelet 按照 QoS 优先级驱逐 Pod:BestEffort 最先被驱逐,Burstable 次之,Guaranteed 最后被驱逐。

调优启示:核心业务 Pod 应配置为 Guaranteed 类别,以获得最高的稳定性保障;批处理或低优先级任务可配置为 BestEffort 以降低成本。

2.3.1 Guaranteed(保证型)

  • 条件:Pod 内每个容器都设置了 CPU 和内存的 Request 与 Limit,且 Request == Limit。
  • 行为:调度器保证资源,kubelet 优先保护,几乎不会被驱逐。
  • 适用场景:数据库、关键微服务、有状态应用。

2.3.2 Burstable(可突发型)

  • 条件:Pod 内至少有一个容器设置了 Request 或 Limit,且不满足 Guaranteed 条件(即 Request < Limit 或只设置了 Request)。
  • 行为:容器在资源空闲时可突发使用超出 Request 的资源,但不超过 Limit。
  • 适用场景:Web 服务、API 网关、有流量波动的应用。

2.3.3 BestEffort(尽力型)

  • 条件:Pod 内所有容器都没有设置任何 Request 和 Limit。
  • 行为:无资源保证,可占用空闲资源,但节点压力大时最先被驱逐。
  • 适用场景:开发测试、批处理、非关键任务。

2.4 QoS 类别决策流程(SVG 图)

Kubernetes QoS 类别决策流程 QoS 类别决策流程 Pod 创建 所有容器都设置了 Request 和 Limit? 每个容器 Request == Limit? Guaranteed Burstable 有容器设置 Request/Limit? Burstable BestEffort 说明:Guaranteed 优先级最高,BestEffort 优先级最低;节点资源紧张时按此顺序驱逐 Pod

2.5 资源模型与成本分摊的关系

在云原生成本分摊实践中,Request 是计费的核心依据,而非 Limit。这是因为 Request 代表了集群为 Pod 预留的、不可被其他 Pod 抢占的资源量。即使 Pod 实际使用量低于 Request,集群仍然为该 Pod 保留了这部分资源。

常见误区:不要将 Limit 设置为远大于 Request 的值来“预留”资源。这会导致节点资源利用率虚低,成本分摊失真,且可能引发调度失败。合理的做法是:根据实际负载曲线设置 Request,将 Limit 设置为 Request 的 1.2~2 倍以应对突发流量。

2.6 资源模型配置示例

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "256Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "1000m"

上述示例中:

  • 容器保证获得 256Mi 内存和 0.5 核 CPU(Request)。
  • 容器最多可使用 512Mi 内存和 1 核 CPU(Limit)。
  • 由于 Request < Limit,该 Pod 属于 Burstable 类别。
  • 成本分摊时,按 256Mi 内存和 500m CPU 的 Request 值进行计费。

2.7 三种 QoS 类别对比总结

QoS 类别 配置条件 资源保证 驱逐优先级 典型场景
Guaranteed 所有容器 Request == Limit 完全保证 最低(最后被驱逐) 数据库、核心微服务
Burstable 部分容器设置 Request/Limit,且不满足 Guaranteed 部分保证 中等 Web 服务、API 网关
BestEffort 所有容器未设置 Request 和 Limit 无保证 最高(最先被驱逐) 开发测试、批处理

2.8 资源模型与成本分摊协同(SVG 图)

资源模型与成本分摊协同关系 资源模型与成本分摊协同关系 Kubernetes 资源模型 Request(预留保证) Limit(上限约束) QoS 类别 调度决策 驱逐优先级 核心:Request 决定 资源预留量 成本分摊模型 按 Request 计费 按 Namespace 聚合 按 Label 分摊 资源利用率分析 成本优化建议 核心:Request 作为 计费基准 协同要点:Request 既是资源调度的保证量,也是成本分摊的计费基准;合理设置 Request 可同时优化性能和成本

2.9 实践建议

  1. 核心服务使用 Guaranteed:将关键业务 Pod 的 Request 和 Limit 设置为相同值,确保资源独占性和稳定性。
  2. 弹性服务使用 Burstable:为有流量波动的服务设置合理的 Request(基线负载)和 Limit(峰值上限),兼顾成本与弹性。
  3. 非关键任务使用 BestEffort:开发测试、CI/CD 等任务不设置资源规格,利用集群空闲资源运行。
  4. 定期审计 Request 合理性:通过监控工具(如 Prometheus)分析实际资源使用率,调整 Request 以匹配真实负载,避免资源浪费。
  5. 成本分摊以 Request 为准:在成本报表中,统一使用 Request 值作为计费基准,确保分摊逻辑透明、可审计。