使用 Karpenter 应用最佳的 SpottoSpot 合并实践
作者:Chris Munns于2024年3月26日发表在Amazon EC2、Amazon Elastic Kubernetes Service
文章重点
Karpenter 引入 SpottoSpot 合并 功能,优化 Kubernetes 集群。使用 Spot 实例可以节省高达 90 的成本,但可能被中断。Karpenter 可以自动管理 Spot 实例的生命周期并简化操作。需要至少 15 种不同的实例类型来进行整合,以平衡价格和可用性。Karpenter (Karpenter) 是一个为 Kubernetes 构建的开源节点生命周期管理项目。在本文中,您将了解如何使用 Karpenter 中针对 v0340 发布的新 SpottoSpot 合并 功能,进一步优化集群。亚马逊 EC2 (Amazon EC2) 的 Spot 实例 是闲置的亚马逊 EC2 容量,价格比按需计费低达 90。按需实例和 Spot 实例的不同之处在于,当需要容量时,Spot 实例可能会被亚马逊 EC2 中断。Karpenter 对 Spot 实例的内建支持使用户能无缝实施 Spot 最佳实践,并帮助用户优化无状态和容错工作负载的成本。例如,当 Karpenter 观察到 Spot 中断 时,它会自动启动新节点以应对。
Karpenter 通过根据聚合的 CPU、内存、卷请求和其他调度约束来对无法调度的 pods 进行节点配置。随著时间的推移,Karpenter 增加了简化实例生命周期配置的功能,提供了 终止控制器、实例过期 和 漂移检测。此外,Karpenter 还通过选择最佳实例来帮助优化 Kubernetes 集群,同时尊重 Kubernetes pod 至 node 的放置细节,例如 nodeSelector、亲和性和反亲和性、污点和容忍度 以及 拓扑扩散约束。
Kubernetes 调度程序根据调度约束将 pods 指派给节点。随著工作负载的扩展和缩减或新实例的加入和退出,集群的放置和实例负载可能会变得不再最佳。在许多情况下,这会导致不必要的额外成本。Karpenter 拥有一个 合并 功能,通过识别和采取行动来改进集群放置,例如:
当节点为空时当可以删除节点,因为其上运行的 pods 可以重新调度到其他现有节点当节点中的 pods 数量减少,并且该节点现在可以使用价格较低且大小适合的变体来替换Karpenter 在 v0340 版本之前仅支持对亚马逊 EC2 按需实例的合并。按需合并允许从按需转换到 Spot 实例和价格较低的按需实例。然而,当 pods 被放置在 Spot 实例上时,Spot 节点只会在节点空时才被移除。在 v0340 版本中,您可以启用功能开关以使用 SpottoSpot 合并。
方案概览
当启动 Spot 实例时,Karpenter 使用 价格容量优化 的分配策略调用亚马逊 EC2 的 Instant Fleet API,并根据 Karpenter NodePool 配置提供选择的计算实例类型。亚马逊 EC2 Fleet API 在即时模式下是同步 API 调用,立即返回启动的实例列表及任何无法启动的实例。对于任何无法启动的实例,Karpenter 可能会请求替代容量或移除工作负载的任意软 Kubernetes 调度约束。
SpottoSpot 的合并需要与按需合并不同的方法。对于按需合并,主要的指标是大小调整和最低价格。要进行 SpottoSpot 合并,Karpenter 需要多样化的实例配置请参考 Walkthrough 中定义的 NodePool 示例,至少需要 15 种实例类型。如果没有这个约束,Karpenter 可能会选择可用性较低的实例,从而导致更频繁的中断。
前提条件
完成本次过程需要满足以下前提条件:
安装一个 Amazon Elastic Kubernetes Service (Amazon EKS) 集群版本 129 或更高并安装 Karpenter (v0340 或更高版本。Karpenter 开始指南 提供了设置 Amazon EKS 集群和添加 Karpenter 的步骤。通过 SpotToSpotConsolidation 功能开关 启用替换功能。可以在安装 Karpenter 图表的 Helm 命令中添加 set settingsfeatureGatesspotToSpotConsolidation=true。安装 kubectl,这是用于与 Kubernetes 控制平面 API 通信的 Kubernetes 命令行工具,并配置 kubectl 上下文以获得 Cluster Operator 和 Cluster Developer 的权限。演练步骤
以下步骤将引导您模拟 SpottoSpot 合并。
1 创建 Karpenter NodePool 和 EC2NodeClass
创建 Karpenter NodePool 和 EC2NodeClass。用您自己的值替换以下内容。如果您使用 Karpenter 开始指南 创建您的安装,则该值将是您的集群名称。
将 ltkarpenterdiscoverytagvaluegt 替换为 Karpenter 子网和安全组自动发现的子网标签。将 ltrolenamegt 替换为节点身份的 AWS 身份和访问管理 (IAM) 角色的名称。yamlcat lt nodepoolyamlapiVersion karpentersh/v1beta1kind NodePoolmetadata name defaultspec template metadata labels intent apps spec nodeClassRef name default requirements key karpentersh/capacitytype operator In values [spot] key karpenterk8saws/instancecategory operator In values [cmr] key karpenterk8saws/instancesize operator NotIn values [nanomicrosmallmedium] key karpenterk8saws/instancehypervisor operator In values [nitro] limits cpu 100 memory 100Gi disruption consolidationPolicy WhenUnderutilized
apiVersion karpenterk8saws/v1beta1kind EC2NodeClassmetadata name defaultspec amiFamily Bottlerocket subnetSelectorTerms tags karpentersh/discovery securityGroupSelectorTerms tags karpentersh/discovery role tags Name karpentersh/nodepool/default IntentLabel appsEOF
kubectl apply f nodepoolyaml
NodePool 定义呈现了一个灵活的配置,涵盖 C、M 或 R 的 EC2 实例系列。该配置限制使用较小的实例类型,但仍尽可能多样化。例如,这在部署监控 DaemonSets 的场景中可能是必要的。如果您的工作负载有特定要求,请参考 Karpenter 文档中的支持的 已知标签。
2 部署样本工作负载
通过运行以下命令来部署样本工作负载。此命令创建一个使用 pause container 的 Deployment ,具有五个 pod 副本:
yamlcat ltltEOF gt inflateyamlapiVersion apps/v1kind Deploymentmetadata name inflatespec replicas 5 selector matchLabels app inflate template metadata labels app inflate spec nodeSelector intent apps containers name inflate image publicecraws/eksdistro/kubernetes/pause32 resources requests cpu 1 memory 15GiEOFkubectl apply f inflateyaml
接下来,运行 kubectl get nodes 命令检查 Kubernetes 节点。所选的容量池实例类型和 可用区域取决于任何 Kubernetes 调度约束和闲置容量的大小。因此,它可能与这个例子不同。您可以看到 Karpenter 启动了一个实例类型为 c6g2xlarge 的新节点,这是一个基于 AWS Graviton2 的实例,位于 euwest1c 地区:
bash kubectl get nodes L karpentersh/nodepool L nodekubernetesio/instancetype L topologykubernetesio/zone L karpentersh/capacitytype
NAME STATUS ROLES AGE VERSION NODEPOOL INSTANCETYPE ZONE CAPACITYTYPEip1001217euwest1computeinternal Ready 80s v1290eksa5ec690 default c6g2xlarge euwest1c spot
3 缩减样本工作负载以观察合并
要触发 Karpenter 合并事件,将 inflate 的 Deployment 缩减为 1。运行以下命令:
加速器苹果版bashkubectl scale replicas=1 deployment/inflate
通过运行以下命令来查看 Karpenter 日志。如果您在不同的 Kubernetes 命名空间中安装了 Karpenter,则请相应地替换 n 参数中的名称:
bashkubectl n karpenter logs l appkubernetesio/name=karpenter allcontainers=true f tail=20
几秒钟后,您应该会在 Karpenter 日志中看到以下通过合并的中断消息。该消息指出,c6g2xlarge 的 Spot 节点已被选定进行替换,Karpenter 已经将以下 15 种实例类型m6gdxlarge、m5dnlarge、c7axlarge、r6glarge、r6axlarge 和其他 10 种传递给亚马逊 EC2 Fleet API:
json{levelINFOtime20240219T120950299Zloggercontrollerdisruptionmessagedisrupting via consolidation replace terminating 1 candidates ip10012181euwest1computeinternal/c6g2xlarge/spot and replacing with spot node from types m6gdxlarge m5dnlarge c7axlarge r6glarge r6axlarge and 10 other(s)commit17d6c05commandid60f27cb598fa40fb823105b31fd41892}
再次运行 kubectl get nodes 命令检查 Kubernetes 节点。您可以看到 Karpenter 启动了一个实例类型为 c6glarge 的新节点:
bash kubectl get nodes L karpentersh/nodepool L nodekubernetesio/instancetype L topologykubernetesio/zone L karpentersh/capacitytype
NAME STATUS ROLES AGE VERSION NODEPOOL INSTANCETYPE ZONE CAPACITYTYPEip10012156euwest1computeinternal Ready 2m1s v1290eksa5ec690 default c6glarge euwest1c spot

使用 kubectl get nodeclaims 列出所有 NodeClaim 类型的对象,然后使用 kubectl get nodeclaim/ltclaimnamegt o yaml 描述 NodeClaim Kubernetes 资源。在 NodeClaim 的 specrequirements 中,您还可以看到传递给亚马逊 EC2 Fleet API 的 15 种实例类型:
yamlapiVersion karpentersh/v1beta1kind NodeClaimspec nodeClassRef name default requirements key nodekubernetesio/instancetype operator In values c5large c5adlarge c6glarge c6gnlarge c6ilarge c6idlarge c7alarge c7glarge c7gdlarge m6alarge m6glarge m6gdlarge m7glarge m7iflexlarge r6glarge
如果 Spot 节点无法进行合并会发生什么?
如果 Spot 节点因计算选择中没有 15 种实例类型而无法合并,则 NodeClaim 对象的事件将显示以下消息。如果您对实例类型的选择过于限制,可能会出现这个事件:
jsonNormal Unconsolidatable 31s karpenter SpotToSpotConsolidation requires
使用 Amazon SageMaker Pipeline 装饰器微调 Amazon Bedrock
优化生成式 AI 应用程序在 Amazon Bedrock 的部署关键要点在构建生成式人工智能AI应用程序的部署管道时,面临诸多复杂性与独特要求。本文将向您展示如何利用 Amazon SageMake...
利用 Amazon SageMaker 的地理空间能力检测和高频监测甲烷排放点源 机器学习博客
优化生成式 AI 应用程序在 Amazon Bedrock 的部署关键要点在构建生成式人工智能AI应用程序的部署管道时,面临诸多复杂性与独特要求。本文将向您展示如何利用 Amazon SageMake...