审校 | 重楼
本文讲述降低Kubernetes成本的10种策略。我们将其细分为部署前、部署后和正在进行中的成本优化技术,旨在为处于云计算部署各个阶段——开始、中期以及已完全采用云计算的组织提供指导。
部署前策略
这些预部署策略适用于那些刚刚起步的用户。其中一些策略将更适合刚开始云计算部署的团队;而另一些则适用于现有环境中尚未部署Kubernetes的用户。
1.选择单个(而非多个)云计算提供商
虽然多云架构通常提供了很大的灵活性,但当涉及到Kubernetes时,它们通常会产生更高的成本。这与提供Kubernetes的不同方式有关。
在AWS上,EKS是用户访问Kubernetes的主要方式;而在Azure上,访问Kubernetes的主要方式又变成了AKS。它们每个都构建在Kubernetes核心架构之上,但利用方式又截然不同。
云计算提供商都有自己的实现、扩展、最佳实践和独特的功能,这意味着在EKS上可以很好地进行成本优化的功能在AKS上就不起作用了(或者根本不是一个选项)。更不用说通过多个服务管理Kubernetes的运营成本,以及需要了解多云环境所带来的成本优化问题。
因此,鉴于成本和复杂性等问题,建议最好选择单个提供商。
2.选择正确的架构
对于那些处于云计算和Kubernetes之旅初期的用户来说,云计算成本(以及其他一切)将受到你选择的架构类型的显著影响。当涉及到Kubernetes时,下面有一些需要格外留心的注意事项。
你可能知道,如果你更普遍地使用Kubernetes集群或容器,基于微服务的架构将十分适用。而单体式应用程序(Monolithic Applications)将无法充分利用容器化的优势。
然而,还有其他不为人所知的考虑因素。例如,有状态应用程序(Stateful Applications,如SQL数据库)不太适合容器。同样地,需要定制硬件的应用程序(如大量使用的AI/ML)也不是Kubernetes的理想选择。
因此,在选择云提供商之后,最好考虑一下采用Kubernetes和容器的程度,然后对架构做出明智的选择。
部署后策略
这些策略适用于那些已经在使用Kubernetes并正在寻找新方法以达到最高成本效率的组织。
3.设置正确的资源限制和配额,以及适当的扩展方法
资源限制和配额能够限制你的消费方式,没有这些,任何Kubernetes集群都会以不可预测的方式运行。如果不为集群中的任何pod设置限制,那么一个pod很容易耗尽内存和CPU。
例如,如果你有一个前端pod,那么用户流量的峰值将意味着消费的峰值。虽然你不希望应用程序崩溃,但无限制地消耗资源并不是解决问题的办法。
相反地,你需要合理的资源限制和其他策略来处理大量使用的情况。此时,优化应用程序的性能将是确保满足客户需求而不产生额外成本的更好方法。
配额也是如此,尽管它们应用于名称空间级别和其他类型的资源。但从本质上讲,它基于谨慎的设置限制,并通过其他适当的方法来确保你的交付。
4.设置智能自动扩展规则
当谈到Kubernetes中的自动扩展时,你有两种选择:水平扩展和垂直扩展。你将使用基于规则的系统来决定在什么条件下执行哪些操作。
水平扩展意味着增加pod的总数,而垂直扩展意味着在不增加总数的情况下增加pod的内存和CPU容量。当涉及到理想的资源使用和避免不必要的成本时,每种方法都有其优势。
当你需要快速扩展时,水平扩展是更好的选择。此外,由于你拥有的pod越多,单点故障导致崩溃的可能性就越小,因此在分配大量流量时,水平扩展是可取的。在运行无状态应用程序时,它也是更好的选择,因为额外的pod能够更好地处理多个并发请求。
垂直扩展对有状态应用程序更有利,因为通过向pod中添加资源来保持状态比在新pod中传播状态更容易。当你在扩展方面有其他限制时,例如有限的IP地址空间或许可证所施加的节点数量限制,垂直扩展也是可取的。
在定义扩展规则时,你需要了解每个规则的用例、应用程序的特性以及可能满足的扩展需求类型。
5.使用Rightsizing
Rightsizing说起来并不复杂,就是把资源的规格调整为它实际需要用到的规格。在Kubernetes情境中,它意味着确保Kubernetes环境中每个pod和节点的适当资源利用率(CPU和内存)。如果没有正确调整大小,可能会发生一些影响应用程序性能和成本优化工作的事情。
在过度配置的情况下,付费的CPU和内存可能会未被使用,成为闲置资源;在供应不足的情况下,虽然它不会直接影响Kubernetes的成本,但它会造成性能问题,最终导致成本下降。
当涉及到Rightsizing时,有一些方法可用。它可以由工程师手动完成,也可以使用工具完全自动化。总之,Rightsizing是一个持续的过程,需要动态调整,但如果做得好,它是成本优化策略的重要组成部分。
6.充分利用Spot实例
Spot实例非常适合某些情况。如果你的应用程序可以处理不可预测性,那么你可以在有限的时间内获得实例的巨大折扣(在AWS上高达90%)。然而可能会有一些额外的配置。
例如,你将需要调整pod分发预算并设置就绪探针(Readiness Probes),以便为突然删除实例准备Kubernetes集群。
节点管理也是如此——你需要使实例类型和pod多样化,以应对中断。
简单地说,Spot实例是降低应用程序成本的好方法,但是将这种不可预测性集成到Kubernetes中需要具备专业知识。
7.战略性地利用区域资源来减少流量
一个经常被忽视的成本优化策略是减少不同地理区域之间的流量。当节点覆盖多个区域时,数据传输费用可能会迅速增加,因为你将使用公共互联网发送和接收数据。在这里,AWS Private Link和Azure Private Link等工具可以通过提供替代路由来帮助你优化成本。
集群的区域分布和数据传输策略可能是一项复杂的工作,有些人会使用工具来完成该操作,但一旦完成,这是减少每月账单的好方法。
持续改进策略
这些Kubernetes成本优化技术适用于那些可能已经解决了最常见问题,并希望实现持续改进的组织。如果你非常了解自动扩展和Rightsizing等实践,那么这里有一些面向更有经验的Kubernetes用户的实用成本管理技术。
8.利用监控成本提高效率
Kubernetes、EKS、AKS和GKE都提供了自己的成本监控和优化功能。但要获得真正细致的见解,通常最好投资于第三方工具。有很多Kubernetes成本优化工具可供选择。市面上有一些通用的云成本管理工具,它们可以很好地与Kubernetes基础设施配合使用。
一般来说,当你选择一个工具时,应该优先考虑一下自己最缺的是什么。有些工具最适合产生洞察力;有些则专注于人工智能,这意味着更少的控制和用户输入,这对于缺乏人力资源的团队来说是件好事。
简而言之,考虑Kubernetes成本优化过程中缺少什么,并根据需求选择合适的工具。
9.将成本控制集成到CI/CD管道中
如果你的组织将DevOps与Kubernetes结合使用,你可以在不同的点上将Kubernetes成本监控和控制构建到CI/CD管道中。
例如,当正确集成时,Kubecost可用于在部署之前预测更改的成本。它还可以用于自动化与成本相关的控制,如果预测的成本太高,甚至会导致构建失败。更广泛地说,集成Kubecost(或具有类似功能的脚本)可以使Kubernetes覆盖一个可监控的数据点,以便为未来的CI/CD决策提供数据。
因此,如果你正在使用Kubernetes,并且你的组织已经采用了DevOps,则可以将成本优化构建到流程的核心。
10.建立一个通过工具和文化来实现成本优化的环境
尽管这涉及到云计算的总体成本,但还是值得花时间列出一些关键点。
首先,如果你已经做了一些部署后和正在进行的工作,那么在整个组织中采用正确的心态将会更容易,这需要数据。因此,拥有正确的成本监控和优化工具是一个良好的开端,Kubefed、CAST AI或Densify都是不错的选择。
其次,这些数据需要对多个利益相关者是可访问且有意义的。如果你已经采用了DevOps,那么这应该没有那么困难。但如果你没有,你可能会遇到一点阻力。像Apptio Cloudability这样的工具可以帮助实现这一点,提供清晰的成本洞察,并特别关注将非技术利益相关者与关键统计数据联系起来。
最后,无论你是想削减Kubernetes还是云计算的成本,都需要营造一个激励持续改进的环境。当团队在整个业务中有明确的目标时,当每个成员都获取到成就感时,团队就会成功。
原文10 Kubernetes Cost Optimization Techniques,作者:Andromeda Booth