我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
CoStar 如何使用 Karpenter 来优化他们的亚马逊 EKS 资源
简介
众所周知,CoStar是商业房地产数据的市场领导者,但他们也经营着主要的房屋、租赁和公寓网站,包括ap
挑战
CoStar面临的最大挑战一直是从数百个来源收集数据,用重要的见解来丰富这些数据,并在一个有意义且用户友好的系统中提供这些数据。CoStar Suite的商业地产、公寓和房屋都有不同的数据源,这些数据源在不同的时间更新,数据量也不同。支持这种数据采集和数据源更新的系统必须快速、准确,并且能够向上和向下扩展以使其负担得起。这些系统中有许多正在从传统数据中心迁移到CoStar的亚马逊云科技环境中,因此必须在并行和可互操作的系统上运行它们,以避免工程支持的大量重复。这些需求都指向在本地和亚马逊云科技中运行Kubernetes,并具有容器集群的扩展能力,以应对使用量的增加和减少。经过数月的成功测试和生产,CoStar 决定进一步优化其工程堆栈,同时尽可能多地保持并行本地 Kubernetes 管理。
在 Kubernetes 集群架构中,控制平面及其组件负责管理集群操作(即调度容器、管理应用程序可用性以及存储集群数据以及其他关键任务)和工作节点,以托管运行容器化应用程序工作负载的 Pod。亚马逊弹性 Kubernetes 服务(
预置工作节点的默认方法是利用 Amazon EKS 管理的节点组,这些节点组使用 Amazon EC2 Auto Scaling 组自动配置和生命周期管理底层 Amazon EC2 实例。为了动态调整 Amazon EC2 实例,可以将 Amazon EKS 管理的节点组功能与集群自动扩缩器解决方案配对。这种自动扩展解决方案会监视等待计算容量的待处理 Pod 以及任何未充分利用的工作节点。当容器由于资源不足而处于待定状态时,集群自动扩缩器会增加 Amazon EC2 Auto Scaling 组中所需的实例数量,该组会预置新的工作节点,从而允许调度和运行这些容器。集群自动扩缩器会根据某些因素终止未充分利用或未使用的节点。
对于在 Amazon EKS 上运行的 CoStar 工作负载,目标是最大限度地提高可用性和性能,同时成为一种高效的资源。尽管 Cluster Autoscaler 解决方案提供了一定程度的动态计算配置和成本效益,但仍有许多注意事项和限制,使其难以使用,甚至受到限制。也就是说,给定节点组的 Amazon EC2 实例类型必须具有相似的中央处理器 (CPU)、内存和图形处理单元 (GPU) 规格,以最大限度地减少不良行为。这是因为它使用节点组策略中指定的第一个实例类型来模拟 Pod 的调度。如果该策略有其他规格更高的实例类型,则在扩展后可能会浪费节点资源,因为它只会根据第一个实例类型的大小来调度 Pod。如果该策略有其他规格较低的实例类型,则由于节点资源限制,Pod 可能无法在这些节点上调度。为了使实例大小多样化以适应 CoStar 不同的 Pod 资源需求,他们需要使用相似的指定实例类型创建多个节点组。此外,Cluster Autoscaler 仅取消配置未充分利用的节点,但没有根据工作负载的变化将其替换为更便宜的实例类型。此外,对于 CoStar 的无状态工作负载,使用节点组实现比按需更高的折扣更高的 Spot 计算容量非常麻烦。
解决方案概述
为什么选择 Karpenter
CoStar 需要一种更有效的方法来配置节点,以满足其不同的工作负载需求,而无需承担管理多个节点组的开销。这个问题已使用开源
下图说明了 Karpenter 如何观察非定时 Pod 的聚合资源请求,从而做出启动新节点的决定,并终止这些节点以降低基础设施成本:
为了使 CoStar 的无状态工作负载和较低环境实现成本效益,CoStar 团队将 Karpenter Provisioner 配置为首选 Spot 容量,仅在没有可用竞价容量的情况下才配置按需容量。Karpenter 使用价格容量优化的现货容量分配策略,该策略平衡了成本并降低了短期内中断的可能性。对于生产集群中的有状态工作负载,Karpenter Provisioner 定义了一系列按需运行的计算和存储优化实例系列,其中大部分由计算储蓄计划和预留实例承保以获得折扣。为了进一步优化,CoStar启用了整合功能,这使Karpenter能够通过监控节点的利用率并检查现有工作负载是否可以在其他节点上运行或被更便宜的变体所取代来主动降低集群成本。通过评估多个因素,例如正在运行的 Pod 的数量、配置的节点过期时间、优先级较低的 Pod 的使用以及现有的 Pod 中断预算 (PDB),整合操作以最大限度地减少工作负载中断。
先决条件
要执行本文中的示例,你需要设置以下内容:
- 在 亚马逊云科技 中预置 Kubernetes 集群
- 安装 Karpenter 以实现集群自动扩展
-
安装亚马逊弹性 Kubernetes 服务 (亚马逊 EKS) 节点查看器
演练
在本节中,我们将简单演示替换机制,这是 Karpenter 整合能力的一部分。以下 Karpenter Provisioner 和节点模板配置代码限制为多种容量类型为按需计算的实例类型:
以下是我们用来演示整合行为的应用程序部署清单:
使用
让我们假设在非工作时间内的交通负荷较低。你可以使用
有 30 个副本,总体资源需求要低得多。Karpenter 使用更便宜的变体(在本例中为 c6a.4xlarge)预置替换节点,并封锁原始节点,如以下屏幕截图所示。
在替换节点上重新调度 Pod 后,先前的节点将终止。
从我们的示例中可以看出,随着非工作时间资源需求的减少,Karpenter 通过配置 c6a.4xlarge,让 CoStar 能够高效扩展和优化成本。
正在清理
为避免产生额外的运营成本,请记住销毁您为本文中的示例创建的所有基础架构。
结论
在评估我们的容器解决方案时,亚马逊云科技 上有许多用例和选项。对于 CoStar,Karpenter 整合了他们在开发和测试环境中运行的 Amazon EC2 Spot 容量,并将工作负载转移到成本最低的实例类型,同时仍能有效运行其工作负载。专注于在迁移期间保持平等、继续使用对 Kubernetes 进行深入而有效的投资并寻求经过验证的解决方案来专注于成本优化的客户应考虑使用 Amazon EKS 和 Karpenter。对于已经在使用 Amazon EK
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。