Kubernetes 早已成为容器编排引擎的事实标准,而随着 Kubernetes 环境的复杂性持续增长,成本也在不断攀升。CNCF 发布的调查报告《Kubernetes 的 FinOps》显示,68%的受访者表示 Kubernetes 开销正在上涨,并且一半的人所在的组织经历了每年超过20%的开销增长。
因此,Kubernetes 成本管理和优化亟需得到系统管理员的重视。本文我们将了解6个优化 Kubernetes 成本的策略和方法。
1、合理调整 Pod 和节点
降低成本最简单的方式之一是管理 Pod 和节点使用的资源。尽管通常的建议是留有足够的机动空间,但过度配置或允许应用程序无限制地使用资源会带来灾难性的后果。例如,假设一个Pod由于应用程序的错误而消耗了节点的所有可用内存,不必要地利用了资源,这会导致其他 Pod 完全没有资源可用。
为避免这一情况的发生,用户可以在命名空间级别用 Kubernetes 资源配额和限制区间来限制资源利用率。此外,还可以在容器层面上指定资源请求和限制,强制执行容器可以请求多少资源以及资源的最大限制。
节点的大小取决于 Pod 所使用的资源。如果你的工作负载只利用了节点中50%的资源,并且短期内资源使用量不会激增,那么用户可以适当缩小节点的规模以降低成本。
另一个考虑因素是调整在单个节点上可以运行的 Pod 数量。即便在没有硬性限制的情况下,在单个节点上运行大量的 Pod 也会导致资源利用效率低下。鉴于这类情况,一部分K8S的托管服务提供商已经限制了单个节点上可以运行 Pod 的数量。
2、监控集群和基础设施
合理监控集群环境,包括底层或依赖项资源,有助于管理成本。无论你是使用托管的 Kubernetes 集群还是自建的集群,监控资源利用率和总体成本都是降低成本的第一步,这能够让用户一目了然地了解计算、存储、网络利用率等情况,以及成本在它们之间的分布情况。
云厂商通常能够提供内置工具和基本的监控功能。而利用 Prometheus、Kubecost 等工具可以让用户获得更为全面的洞察。近日发布的应用统一部署与管理平台 Seal AppManager 中也内置了成本管理视图,提供 Kubernetes 的资源开销、共享费用(如空闲费用、管理费用)的成本汇算和分摊,并内置多维度成本分析视图为用户提供成本洞察。另外,用户也可以依据集群、项目、应用等维度自定义成本视图。
3、配置弹性伸缩
Kubernetes 支持3类弹性伸缩:
- HPA:自动水平伸缩
- VPA:垂直自动伸缩
- 集群自动伸缩
自动充分利用 Kubernetes 弹性伸缩的特性可以帮助用户以一种简单、高效的方式降低整体 Kubernetes 成本。
HPA 可以监控 Pod 的使用情况,自动调整大小,以保持预期的使用水平。VPA 则可以调整集群中的资源请求和容器限制。自动伸缩会根据需求自动从 Kubernetes 集群中添加或删除节点,它有助于确保工作负载总是有足够的基础设施资源来完成它们的工作,但又不至于让用户最终为闲置的基础设施付费。
现阶段而言,并非所有的 Kubernetes 服务或发行版都支持自动伸缩。但是,如果你所采用的服务支持,那么它可以帮助你大幅降低 Kubernetes 成本。
4、为 K8s 工作负载选择不同的购买策略
对于 AWS 或者 GCP 来说,按需实例是最昂贵的选项。因此,我们应该充分利用预留的实例甚至是 Spot instances(竞价型实例)。
相较于按需价格,Spot instances 最高可获得90%的折扣(即1折)。它们是短期工作或无状态服务的最佳选择,可以快速重新调度,同时不会丢失数据。为避免中断,用户可以使用工作负载管理工具,将 Spot 实例保留在某个固定时段内。
为每个节点都规划购买策略,并在可能的情况下优先使用 Spot 实例,以充分利用购买折扣。如果 Spot 实例不适合你的工作负载,比如你的容器正在运行数据库,那么可以购买具备稳定可用性的节点。在任何情况下,尽量减少使用按需资源。
5、Kubernetes 调度
调整 Pod 和节点的大小和规模后,需要确保 pod 被调度到了正确的节点上。K8s 调度流程将 Pod 与节点相匹配,并且调度器的默认行为可以自定义。假设你想把具有关键业务功能的容器放在一个高性能的节点上,而把其他不太关键的组件放在相对较低性能的节点上。默认情况下,即便在不同性能层上配置节点,K8s 也无法匹配正确的节点。
如果一个非关键的pod被安排在一个高性能的节点上,会导致性能浪费并最终提高成本。Kubernetes 提供诸如 nodeSelector、亲和性以及污点和容忍等特性以解决此类问题并优化调度。它们可以用来完全配置Kubernetes的调度过程,以满足用户的需求,从而使用户能够有效地使用整个节点的可用资源。
6、简化开发
尽管容器化的浪潮愈演愈烈,但并不意味着一切都需要容器化。一些开发团队试图为了容器化而容器化应用程序或工作负载,这可能会导致在 Kubernetes 集群上运行不必要的工作负载。这类工作负载在其他技术上也可以轻松运行,并且成本会更低。譬如,可以将无服务器技术用于基于事件的特性,而主要将 Kubernetes 用于高可用性和关键任务的功能。
总结
成本管理并不总是开发人员的最高优先级,但是确实是必须考虑的方面。正确的解决方案可以使Kubernetes的成本管理变得及时、经济和毫不费力,使企业能够在成本和性能之间实现完美的平衡。
利用不同的云供应商建立多云环境可以使用户从每个平台提供的折扣中获益,甚至可以在平台之间迁移工作负载以选择最优惠的选项,同时不会出现服务中断或服务质量下降的情况。另外,也可以选择使用不同的技术,将功能卸载到最符合要求的技术或服务上。这种选择可以在有效管理整个应用程序的同时,更深度地管理成本。