adidas通过多管齐下的方法降低Kubernetes集群成本
在最近的一篇Medium文章中,平台工程师Iya Lang分享了adidas如何在AWS上将运行Kubernetes集群的成本降低了高达50%。这一多管齐下的方法对其他组织的平台工程团队也具有一定的参考价值,尤其是在CNCF报告指出Kubernetes导致49%的受访者云支出增加的情况下。
降低EC2实例成本
adidas团队首先通过引入Karpenter来降低EC2实例成本。Karpenter是AWS开发的一个集群自动扩展工具,能够根据应用需求动态调整节点数量。其主要功能包括:
- 根据实时的Pod调度需求动态分配计算资源(EC2实例),确保集群在正确的时间拥有合适的节点来处理工作负载。
- 通过启动必要的实例类型、移除未充分利用的节点、替换高成本实例为更具成本效益的选项等方式优化集群资源利用率。
- 利用Spot实例(AWS以较低成本提供的未使用计算资源),识别风险最小的最便宜选项。
- 将工作负载整合到更高效的计算资源上。
- 与现有的Kubernetes工作流无缝集成,允许配置EC2实例类型、节点配置的启动模板规范以及资源分配的扩展策略。
尽管Karpenter目前仅支持AWS,但未来计划扩展到其他云提供商。
自动创建垂直Pod自动扩展器(VPA)
adidas团队还通过自动创建垂直Pod自动扩展器(VPA)来提高资源利用率。团队使用Kyverno这一通常用于应用安全的策略工具,自动为开发和预发布集群中的所有工作负载生成默认的VPA。Kyverno作为Kubernetes集群内的动态准入控制器,处理来自Kubernetes API服务器的验证和变异准入Webhook HTTP回调,应用相关策略以允许或拒绝准入请求。
Kyverno的策略可以基于资源类型、名称、标签选择器等标准进行目标定位,并通过覆盖或JSON Patch格式进行变异策略的指定,验证策略则使用覆盖语法并支持模式匹配和条件逻辑。策略执行结果记录为Kubernetes事件,并为允许的请求或早于Kyverno策略实施的请求生成策略报告。
团队配置Kyverno策略以检查资源是否具有水平Pod自动扩展器(HPA)或VPA,并验证是否允许为该资源及其命名空间自动创建VPA。
设置默认VPA值
在缺乏对应用程序的深入了解的情况下配置VPA是一个挑战。adidas团队决定仅控制资源请求,以防止在应用使用高峰期发生中断。他们将最低允许值设置为非常低的水平(如10毫核CPU和32MB内存),并根据原始请求或限制设置最大值以确保稳定性。对于具有多个容器的应用,团队避免使用maxAllowed值以防止潜在问题。
实施默认VPA后,开发和预发布集群的CPU和内存使用量减少了30%。然而,也存在一些限制,如VPA无法与使用资源指标的HPA一起工作,旧版Java应用可能无法受益,某些应用需要不间断运行,因此需要提供选择退出选项。
非办公时间资源缩减
为了减少碳足迹并节省成本,团队在非办公时间使用kube-downscaler工具缩减资源。该工具根据预定义的时间表调整副本数,允许为特定应用进行自定义。
解决未充分利用节点的问题
实施上述措施后,团队面临未充分利用节点的问题。为此,他们实施了Kyverno策略,防止阻碍节点移除的问题性Pod中断预算(PDB)配置,并建立了定期清理无效PDB的策略。
实施结果与关键考虑
adidas团队在非生产集群中实施了这些成本优化措施,并将PDB策略应用于所有环境,使得开发和预发布集群的月成本减少了50%。对于生产集群,他们采用了选择加入模型,允许应用团队选择自己的工具和配置。
团队还分享了一些成功进行成本优化的关键考虑:
- 确保足够的节点容量以处理增加的Pod密度。
- 设置适当的VPA配置值以平衡成本节约和应用性能。
- 通知用户有关变更,以防止与事件相关的中断。
- 保持全面的监控以衡量影响。
团队承认成本优化是一个需要持续调整的持续过程。
其他案例与资源
其他组织也在尝试降低云成本,例如Reddit上的“Reducing Cloud Costs on Kubernetes Dev Envs by Over 95%”和“How to reduce the AWS costs?”等讨论。
应用优化也可以降低云成本并提高可持续性。Erik Peterson在QCon SF上提供了相关指导,并在InfoQ上发表了文章“Million Dollar Lines of Code—an Engineering Perspective on Cloud Cost Optimization”。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。