AWS Karpenter 中 On-Demand Capacity Reservations 的设计与实现
概述
在 AWS 环境中,On-Demand Capacity Reservations (ODCR) 是一项关键功能,它允许用户预先保留计算容量,确保在需要时能够获得所需的 EC2 实例资源。本文将深入探讨 AWS Karpenter 项目中如何实现对 ODCR 的支持,帮助用户更好地管理集群资源。
什么是 Capacity Reservations
Capacity Reservations 是 AWS EC2 提供的一种容量预留机制,主要特点包括:
- 预留属性:每个预留都定义了特定的可用区、实例数量、实例类型、租户模式和操作系统平台
- 匹配标准:
- Targeted:仅接受完全匹配属性且明确针对该预留的实例
- Open:接受所有匹配属性的实例
- 预留类型:
- Default:标准容量预留,可以任意数量预留按需实例容量
- Capacity Block:以特定块大小预留的容量,仅分配特定时间段(最长14天或28天)
设计目标
Karpenter 对 ODCR 的支持设计主要围绕以下核心目标:
- 支持选择 targeted 和 open 类型的 ODCR
- 允许单个 NodePool 选择多个 ODCR
- 确保仅在应用需要时才使用 ODCR 容量
- 优先使用 ODCR 容量而非标准按需或 Spot 容量
- 在 ODCR 容量可用时,将标准按需和 Spot 实例整合到 ODCR 容量
- 当有更小/更便宜的 ODCR 可用时,支持在 ODCR 之间进行整合
- 允许用户限制 NodePool 仅使用 ODCR 容量
- 支持从 ODCR 回退到 Spot 容量或标准按需容量
- 当容量预留过期或取消时,避免自动漂移到新容量
API 设计
EC2NodeClass API 扩展
在 EC2NodeClass 中新增 capacityReservationSelectorTerms
字段,用于定义要使用的容量预留:
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
spec:
capacityReservationSelectorTerms:
- id: "cr-1234567890abcdef0" # 容量预留ID
ownerID: "123456789012" # 拥有者AWS账号ID
tags: # 用于选择容量预留的标签
Environment: "production"
NodePool API 扩展
新增 karpenter.sh/capacity-type: reserved
标签值,支持三种使用模式:
- 仅使用 ODCR 实例:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["reserved"]
- 使用 ODCR 实例并回退到按需:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand", "reserved"]
- 使用 ODCR 实例并回退到 Spot 和按需(默认行为):
requirements: []
调度实现
ODCR 优先调度
Karpenter 采用"首次适应降序"装箱算法进行调度。为了优先使用 ODCR 容量:
- 将 ODCR 容量视为"免费"资源
- 当调度即将移除最后一个 ODCR 供应时,会创建新节点而非继续在当前节点上调度
- 确保 ODCR 供应在调度模拟中被优先考虑
实例类型供应表示
ODCR 容量作为附加供应附加到每个实例类型:
name: c5.large
offerings:
- price: 0.0001 # ODCR 供应价格接近0
available: 10 # 可用实例数量
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["reserved"]
- key: topology.kubernetes.io/zone
operator: In
values: ["us-west-2a"]
容量管理与整合
容量预留过期/取消处理
当容量预留过期或被取消时:
- 不会自动将实例漂移到新容量
- 现有实例继续运行,直到被显式终止
- 新调度请求将考虑其他可用容量
整合策略
-
整合到容量预留实例:
- 当 ODCR 容量可用时,优先将标准按需和 Spot 实例整合到 ODCR 容量
-
容量预留间整合:
- 当发现更小或更便宜的 ODCR 时,支持在 ODCR 之间进行实例整合
实际应用场景
- 季节性流量高峰:提前预留容量应对预期流量增长
- 稀缺实例类型保障:确保能够获得如 p5.48xlarge 等大型 GPU 实例
- 关键业务保障:为生产环境关键工作负载提供容量保证
- 成本优化:充分利用已付费的预留容量,减少额外支出
总结
AWS Karpenter 对 On-Demand Capacity Reservations 的支持为用户提供了更精细的容量管理能力。通过合理的 API 设计和调度优化,既保证了关键工作负载的资源可用性,又实现了成本效益的最大化。这一功能特别适合对资源保障有严格要求的企业级应用场景。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考