AWS Karpenter 中 On-Demand Capacity Reservations 的设计与实现

AWS Karpenter 中 On-Demand Capacity Reservations 的设计与实现

karpenter-provider-aws Karpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity. karpenter-provider-aws 项目地址: https://gitcode.com/gh_mirrors/ka/karpenter-provider-aws

概述

在 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 的支持设计主要围绕以下核心目标:

  1. 支持选择 targeted 和 open 类型的 ODCR
  2. 允许单个 NodePool 选择多个 ODCR
  3. 确保仅在应用需要时才使用 ODCR 容量
  4. 优先使用 ODCR 容量而非标准按需或 Spot 容量
  5. 在 ODCR 容量可用时,将标准按需和 Spot 实例整合到 ODCR 容量
  6. 当有更小/更便宜的 ODCR 可用时,支持在 ODCR 之间进行整合
  7. 允许用户限制 NodePool 仅使用 ODCR 容量
  8. 支持从 ODCR 回退到 Spot 容量或标准按需容量
  9. 当容量预留过期或取消时,避免自动漂移到新容量

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 标签值,支持三种使用模式:

  1. 仅使用 ODCR 实例
requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values: ["reserved"]
  1. 使用 ODCR 实例并回退到按需
requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values: ["on-demand", "reserved"]
  1. 使用 ODCR 实例并回退到 Spot 和按需(默认行为):
requirements: []

调度实现

ODCR 优先调度

Karpenter 采用"首次适应降序"装箱算法进行调度。为了优先使用 ODCR 容量:

  1. 将 ODCR 容量视为"免费"资源
  2. 当调度即将移除最后一个 ODCR 供应时,会创建新节点而非继续在当前节点上调度
  3. 确保 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"]

容量管理与整合

容量预留过期/取消处理

当容量预留过期或被取消时:

  1. 不会自动将实例漂移到新容量
  2. 现有实例继续运行,直到被显式终止
  3. 新调度请求将考虑其他可用容量

整合策略

  1. 整合到容量预留实例

    • 当 ODCR 容量可用时,优先将标准按需和 Spot 实例整合到 ODCR 容量
  2. 容量预留间整合

    • 当发现更小或更便宜的 ODCR 时,支持在 ODCR 之间进行实例整合

实际应用场景

  1. 季节性流量高峰:提前预留容量应对预期流量增长
  2. 稀缺实例类型保障:确保能够获得如 p5.48xlarge 等大型 GPU 实例
  3. 关键业务保障:为生产环境关键工作负载提供容量保证
  4. 成本优化:充分利用已付费的预留容量,减少额外支出

总结

AWS Karpenter 对 On-Demand Capacity Reservations 的支持为用户提供了更精细的容量管理能力。通过合理的 API 设计和调度优化,既保证了关键工作负载的资源可用性,又实现了成本效益的最大化。这一功能特别适合对资源保障有严格要求的企业级应用场景。

karpenter-provider-aws Karpenter is a Kubernetes Node Autoscaler built for flexibility, performance, and simplicity. karpenter-provider-aws 项目地址: https://gitcode.com/gh_mirrors/ka/karpenter-provider-aws

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樊声嘉Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值