3. Kubernetes 资源模型:Pod、Container、Node 的资源请求与限制、QoS 类别、资源超卖与碎片化问题

在云原生成本分摊与资源画像的协同优化中,理解 Kubernetes 底层资源模型是第一步。资源模型定义了工作负载如何声明需求、调度器如何分配节点资源、以及运行时如何保障服务质量。错误的资源设定会导致成本黑洞或稳定性风险。

3.1 核心资源语义:Requests 与 Limits

每个 Container 可以声明两类资源(CPU / 内存):

  • Requests(请求):容器启动时保证获得的最小资源量,调度器依据此值选择节点。
  • Limits(限制):容器运行时不能超过的资源上限,用于限制突发行为。
资源类型 CPU 单位 内存单位 调度依据 运行时行为
Requests 核数(如 0.5、1000m) 字节(如 256Mi、1Gi) 节点必须满足 sum(requests) ≤ node allocatable CPU 按权重分配;内存保证分配
Limits 核数(如 1、2000m) 字节(如 512Mi、2Gi) 不参与调度决策 CPU 限流(CFS quota);内存 OOM Kill
成本分摊关键点: 资源画像系统通常以 Requests 作为成本分摊基准,因为它代表集群承诺给工作负载的“预留容量”。Limits 仅用于控制突发,不应作为长期成本核算依据。

3.2 Pod 与 Container 的资源聚合

Pod 的资源请求/限制是其所有 Container 对应值的总和。调度器只看 Pod 级别的总 Requests,而非单个 Container。

# 示例:一个包含两个容器的 Pod
apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        cpu: "500m"
        memory: "256Mi"
      limits:
        cpu: "1"
        memory: "512Mi"
  - name: sidecar
    image: envoy
    resources:
      requests:
        cpu: "200m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"
  # Pod 总 Requests: cpu=700m, memory=384Mi
  # Pod 总 Limits:   cpu=1.5,   memory=768Mi
实践建议: 在成本分摊模型中,建议将 Pod 级别的总 Requests 作为最小分摊单元。对于多容器 Pod,可按每个 Container 的 Requests 占比进行二次拆分,以支持更精细的部门或项目成本归属。

3.3 QoS 类别:服务质量分级

Kubernetes 根据 Pod 内所有 Container 的 Requests 与 Limits 设置组合,自动划分三个 QoS 类别。类别决定了节点资源竞争时的驱逐优先级。

QoS 类别 条件 驱逐优先级 典型场景
Guaranteed 每个 Container 的 Requests == Limits(CPU 和内存均相等) 最低(最后被驱逐) 数据库、关键中间件、有状态服务
Burstable 至少一个 Container 的 Requests < Limits,且所有 Container 都设置了 Requests 中等 Web 服务、API 网关、批处理任务
BestEffort 所有 Container 均未设置 Requests 和 Limits 最高(最先被驱逐) 低优先级离线任务、测试负载
成本与稳定性权衡: Guaranteed Pod 资源利用率通常较低(因为 Requests == Limits,无法超卖),但稳定性最高。BestEffort Pod 资源利用率高但风险极大,在节点压力下会被优先杀死。FinOps 实践中,建议将核心生产负载设为 Burstable(适度超卖),将非关键任务设为 BestEffort 以提升整体资源效率。

3.4 资源超卖:提升利用率的核心手段

资源超卖是指节点上所有 Pod 的 Requests 总和超过节点实际可分配资源(Allocatable)。超卖依赖“大部分 Pod 实际使用量远低于其 Requests”这一统计事实。

资源超卖原理示意图 节点总容量(Allocatable):32 CPU / 128 Gi 内存 已分配 Requests 总和:28 CPU / 100 Gi(87.5%) 实际使用量:16 CPU / 60 Gi(50%) 超卖空间:12 CPU / 40 Gi 超卖率 = (已分配 Requests - 实际使用量) / 实际使用量 本例超卖率 = (28 - 16) / 16 = 75%
超卖与成本分摊的关系: 超卖产生的“额外容量”是成本优化的核心来源。资源画像系统通过分析历史实际使用量,动态调整 Pod 的 Requests 值,在保证稳定性的前提下最大化超卖空间。每降低 1 核不必要的 Requests,即可释放约 1 核的调度容量,直接降低集群总成本。

3.5 资源碎片化:调度效率的隐形杀手

资源碎片化是指节点上剩余资源无法被任何待调度 Pod 使用,导致整体集群资源利用率下降的现象。碎片化主要分为两类:

  • CPU 碎片: 节点剩余 CPU 核数小于 Pod 请求的 CPU 核数,但内存充足。
  • 内存碎片: 节点剩余内存小于 Pod 请求的内存,但 CPU 充足。
  • 组合碎片: 节点剩余 CPU 和内存均足够,但分布在不同节点上,无法满足单个 Pod 的完整需求。
资源碎片化示例:三个节点上的剩余资源 Node 1 剩余 CPU: 0.8 核 剩余内存: 4.0 Gi CPU 不足(需 1.0 核) Node 2 剩余 CPU: 2.5 核 剩余内存: 1.2 Gi 内存不足(需 2.0 Gi) Node 3 剩余 CPU: 1.5 核 剩余内存: 3.0 Gi 资源充足 ✓ 待调度 Pod:需要 CPU 1.0 核 + 内存 2.0 Gi 只能调度到 Node 3,Node 1 和 Node 2 存在碎片 碎片化导致集群整体利用率下降。Node 1 和 Node 2 的剩余资源总和足够,但无法被单个 Pod 利用。 资源画像通过规整化 Requests 和 Pod 装箱优化,可显著降低碎片率。

3.6 资源画像对碎片化的缓解策略

策略 描述 效果
Requests 规整化 将 Pod 的 Requests 值对齐到标准规格(如 0.5、1、2 核),减少碎片 降低 CPU 碎片 15-30%
Pod 装箱优化 根据实际使用量调整 Requests,使 Pod 更紧凑地放置 提升节点利用率 10-25%
节点池异构化 按工作负载类型(CPU 密集型 / 内存密集型)划分不同规格节点池 减少组合碎片 20-40%
动态超卖 基于历史实际使用量动态调整超卖比例,避免过度承诺 平衡利用率与稳定性
实战经验: 某大型电商平台通过资源画像系统将 Pod Requests 规整化后,集群碎片率从 32% 降至 18%,每年节省约 200 万元人民币的云资源费用。核心做法是将所有微服务的 CPU Requests 对齐到 0.5 核的整数倍,内存对齐到 256Mi 的整数倍。

3.7 资源模型与成本分摊的映射关系

在 FinOps 实践中,资源模型各要素与成本分摊的映射关系如下:

  • Requests → 成本基准: 按 Pod 的 CPU & 内存 Requests 占比分摊节点总成本。
  • Limits → 成本风险: Limits 过高可能导致资源浪费,需通过资源画像持续优化。
  • QoS → 成本优先级: Guaranteed Pod 成本最高但最稳定;BestEffort Pod 成本最低但风险最高。
  • 超卖 → 成本节省: 超卖空间是成本优化的直接来源,但需监控驱逐风险。
  • 碎片 → 成本浪费: 碎片化直接导致集群规模膨胀,增加不必要的节点成本。
核心结论: 资源模型是成本分摊与资源画像的底层数据基础。只有准确理解 Requests/Limits、QoS、超卖和碎片化的相互作用,才能设计出既稳定又经济的云原生成本优化方案。下一章将深入讲解如何通过资源画像系统采集和分析实际使用数据,为成本分摊提供精准输入。