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”这一统计事实。
超卖与成本分摊的关系: 超卖产生的“额外容量”是成本优化的核心来源。资源画像系统通过分析历史实际使用量,动态调整 Pod 的 Requests 值,在保证稳定性的前提下最大化超卖空间。每降低 1 核不必要的 Requests,即可释放约 1 核的调度容量,直接降低集群总成本。
3.5 资源碎片化:调度效率的隐形杀手
资源碎片化是指节点上剩余资源无法被任何待调度 Pod 使用,导致整体集群资源利用率下降的现象。碎片化主要分为两类:
- CPU 碎片: 节点剩余 CPU 核数小于 Pod 请求的 CPU 核数,但内存充足。
- 内存碎片: 节点剩余内存小于 Pod 请求的内存,但 CPU 充足。
- 组合碎片: 节点剩余 CPU 和内存均足够,但分布在不同节点上,无法满足单个 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、超卖和碎片化的相互作用,才能设计出既稳定又经济的云原生成本优化方案。下一章将深入讲解如何通过资源画像系统采集和分析实际使用数据,为成本分摊提供精准输入。