优化 Kubernetes 成本的 9 个办法
Kubernetes统治着容器市场。根据CNCF的一项调查,到2020年,Kubernetes在生产环境中的使用率为93%,高于2019年的78%。
由于DevOps团队采用了Kubernetes,并且在开源社区的鼓励下,这一数字可能还会增长,如果还是以目前的花费来维持,将会有加大网络,存储,监控等成本的开销。
运行Kubernetes可能会非常昂贵,尤其当组织首次使用Kubernetes时,他们通常会使用没有经过优化的架构和设置,这将会慢慢加大组织的网络,存储,监控等成本的开销。为了节省很多不必要的成本,我们需要从一开始就养成良好的习惯。
在本文中,我们将介绍9种控制和降低Kubernetes成本的方法。
一、Kubernetes成本监控
成本监控:应该向你展示有关Kubernetes的支出。这是有效地管理Kubernetes成本的最合乎逻辑的步骤。
云供应商提供帐单信息,但是,它们通常仅是一个简单的概述,这虽然对多租户的Kubernetes集群有用,但是在私有云中不可访问。因此,我们需要使用外部软件来监控Kubernetes的使用。Prometheus,Kubecost,Microtica和Replex是该领域中的一些有用工具。
选择你将要使用的工具以及如何监控Kubernetes成本。然后,为Kubernetes成本优化实施更具体的措施。
二、限制资源
有效的资源约束,能够确保Kubernetes系统的资源使用不会超出成本预算。
容器使用的资源不能超过你设置的资源限制。当容器中的进程尝试使用超出允许范围的内存时,系统内核会因内存不足(OOM)错误而中止该进程。
限制资源至关重要,尤其是在许多开发人员可以直接访问Kubernetes的情况下。它们确保公平共享可用资源,从而减小整个集群的大小。如果没有限制,一个人可能会消耗所有资源,这将影响其他人的正常工作,从而导致总体上需要更多的计算资源。
但是,请注意不要无限制地限制你的资源。如果资源限制太低,工程师和软件将无法正常运行。一些Kubernetes成本优化工具,例如Prometheus和Kubecost,可以帮助你实现资源的平衡。
要了解限制容器资源的更多信息,请查看Kubernetes文档。
三、自动扩缩
自动扩展意味着为你所需的东西付费。你可以允许Kubernetes自动扩缩以适应快速变化。
水平和垂直自动扩缩是可用的两种自动扩缩类型。简而言之,水平自动扩缩涉及根据负载是高于还是低于指定水平来新增和移除Pod。各个Pod的比例与垂直自动扩缩比例保持平衡。
两种自动扩缩方法都可使用计算能力动态地适应你的实际需求。但是,此方法不一定理想,因为它不适用于所有用例。
四、选择合适的实例
举例:AWS Kubernetes的成本,受到管理AWS实例的直接影响。实例以多种不同形式出现,具有不同的内存和计算资源组合。虽然Kubernetes Pod的使用方式相同,但资源分配不同。控制AWS Kubernetes成本的关键是确保Pod在你的AWS实例上有效增减。AWS实例应与你的pod的大小匹配。
Pod的规模,数量和历史资源利用率趋势在决定使用哪个AWS实例时都发挥着作用。应用程序可能具有不同的存储或CPU要求,这会影响要使用的实例的类型。
确保Kubernetes Pod的资源消耗与其所使用的AWS实例上的CPU和内存消耗相关联,这对于优化资源使用和降低AWS成本至关重要。
可以在此处检查Amazon EC2实例类型,然后选择最适合你需求的一种。
五、AWS中使用Spot 实例
目前,AWS实例有3种形式:按需实例,预留实例和Spot 实例。按需实例成本最高,但灵活性最高。与按需实例的价格相比,使用 Spot 实例最高可以享受 90% 的折扣。你还可以在一定时间内获取预留实例,以节省成本。因此,实例形式的选择直接影响在AWS上运行Kubernetes的成本。
你可以将 Spot 实例用于各种无状态、容错或者灵活的应用程序,例如大数据、容器化工作负载、CI/CD、Web 服务器、高性能计算 (HPC) 以及测试和开发工作负载。
六、设定睡眠时间表
无论你是在按需实例,保留实例还是Spot 实例上运行Kubernetes集群,确保集群的充分利用对于成本管理都是至关重要的。你可以按配置它们的时间段计算AWS EC2的费用。
简而言之,如果开发团队使用基于云的Kubernetes环境,则他们仅在工作时间内使用它。如果他们每周工作40个小时,而在其余时间中环境仍然正常工作,那么在不用时无需为剩余的128个小时付费。当然,并不是每个团队都这样,特别是如果他们的工作时间灵活,但是在没有人工作的情况下关闭环境可以极大地提高Kubernetes的成本优化。
开发人员可以通过自动设置睡眠计划并仅在需要时唤醒环境来。设置此计划意味着系统将自动缩减未使用的资源。这样可以确保环境条件得以保存。此外,当工程师再次需要时,环境将轻松,自动地“唤醒”,这意味着工作流不会中断。
七、定期进行Kubernetes清理
如果让工程师有权按需构建命名空间,或者有权构建CI/CD流水线,则最终可能会产生许多未使用的对象或集群,但这些仍然在花费金钱。即使你的睡眠模式能够减少计算资源的消耗,那么它仅适用于暂时不活动的资源。
因此,当你发现某些资源长时间处于非活动状态时,删除它们将是一件很明智的事情。
八、确定你的Kubernetes集群的大小
在不同情况下,管理Kubernetes集群的方法也是不同的。作为程序员,在构建集群之前,你需要经常考虑将在集群上运行的应用程序的规范。
在设计可扩展应用程序时,正确调整节点大小非常重要。大量的小节点和少量的大节点是两个截然不同的事物。最好的方法是在这两个之间找到适当的平衡。
但是,你的应用程序的不同要求需要不同数量和大小的节点。具体可以参考《调整Kubernetes集群大小的技巧》,以了解各种应用所需的大小和数量。
九、标记资源
在任何环境中,无论是云,还是本地器,标记资源都是一个明智的主意。组织在有多个测试,开发和生产环境中,更应使用标记来确保所有服务均受到控制。
AWS提供了一种强大的标记方案,可用于标记属于Kubernetes的服务。有效的标记使你可以轻松地分类管理哪些是未使用的服务。在AWS Billing仪表板中启用这些标签后,你将能够分配成本并查看各种服务的费用明细。
结论
Kubernetes成本优化的第一步是监控它们。然后,为避免计算资源的过度使用,你可以设置限制,这将使成本更易于管理。
确定最佳资源的大小以及自动扩展功能,也对降低成本有所帮助。如果使用AWS,则可以检查其价格较低的选项,例如Spot 实例。删除空闲资源的方法,包括自动休眠计划和清理未使用的Kubernetes资源。最后,调整容器大小并实施资源标记,以实现更好的Kubernetes成本优化。
- END -
往期推荐:
Kubernetes Ingress-Nginx 实现蓝绿、灰度发布
订阅,一起成长
K8s生态圈
点在看,K8s一年不出问题 👇