集群成本调优旨在经济高效地利用集群资源,减少不必要的开支。为了实现集群成本调优,工作负载和集群的稳定性、可靠性以及集群运维成本三者之间的平衡,本文为您汇总了相关的最佳实践,包括如何以较低成本配置集群、使用工作负载和节点的弹性能力、实时监控集群成本等。
本文使用指引
本文主要面向ACK集群的管理人员,提供降低集群成本的通用性建议。本文使用建议不区分前后顺序,您可以自行选择。建议您在阅读本文前了解Pod和容器资源、命名空间、自动伸缩(工作负载伸缩、节点伸缩)、调度等Kubernetes基础概念。
为保证集群应用的稳定运行,建议您同时搭配集群高可用架构推荐配置、工作负载推荐配置中的推荐配置使用。
如果您的集群类型为ACK集群Pro版且规模较大(通常为超过500个节点或者10,000个Pod的集群),建议您同时遵循大规模集群使用建议中的内容管理集群。
期望您阅读本文后,能在企业中构建起FinOps体系和团队,并建立清晰的FinOps战略目标。FinOps,即“Finance” + “DevOps”,是一种企业云财务管理文化和实践的结合,以实现云资源使用的成本可预测性和透明度,从而确保企业在发展和创新的同时能够控制和优化支出。更多信息,请参见人员、工具和机制是云上成本管理的关键要素、成本套件概述。
使用低成本的集群配置
在部署集群之前,您需要评估集群应用所需的资源需求,选择合适的节点实例类型、集群付费模式等,从而以更低的成本构建集群。
选择合适的ECS实例规格
选择节点池的实例类型之前,您需要结合性能、价格、工作负载等因素,做出性价比与稳定性最优的决策。通常情况下,节点池选择的ECS实例规格越高(CPU、内存配置越高)、专业程度越高(例如GPU实例、异构实例),节点成本也越高。
根据业务场景选择实例规格
您可以根据业务场景选择最具性价比的实例规格。例如,在分布式缓存场景下,应用对于内存容量要求较高。相较于其他资源配比的规格,使用内存型实例(处理器与内存配比为1:8)可以提升CPU资源利用率,从而降低成本。在深度学习训练场景下,深度学习任务通常对GPU资源有较高依赖,但同时也需要足够的CPU资源来支持数据预处理、I/O操作等任务,因此GPU与CPU的推荐配比为1:8到1:12之间。关于ECS选型的更多建议,请参见实例规格选型指导。
企业生产环境中,不推荐您使用小规格(2核 4 GB及以下规格)节点,避免网络资源受限、资源碎片化等问题。更多信息,请参见ECS实例规格配置建议。
使用共享型实例
针对个人开发者或者中小型网站应用,推荐使用共享型实例。相比企业级实例,共享型实例使用资源时可能会经历性能的波动,但成本相对来说也更低。共享型实例适用于中小型网站、Web应用程序、开发环境、轻量级数据库、轻量级企业应用等场景。
如需了解详细的共享型实例介绍和选型建议,请参见共享型。
选择合适的ECS实例付费类型
不同业务类型对资源的使用周期要求不同,您可以按需为业务选择合适的付费模式,达到成本最优的效果。
包年包月
包年包月是一种高效经济的计费模式,让您能够以更划算的价格享有持续稳定的资源使用体验。如果您的业务需求具有如下特点,更推荐您使用包年包月:
可预测的资源使用周期
稳定的业务场景
长期的资源使用需求
例如,在持续运行的Web服务、数据库服务等业务场景下,推荐您使用包年包月。
按量付费
按量付费是一种更为灵活的计费模式,允许您在使用资源后再进行付费,无需提前购买大量资源,相较于自建IDC机房节省更多的成本。如果您的业务有以下特点,更推荐您使用按量付费:
业务有周期性波动或突发流量,资源用量难以提前预测
资源需求随时变动,需要即时开通和释放
例如,在测试开发、电商促销活动、业务需要临时扩容等业务场景下,推荐您使用按量付费。
抢占式实例
抢占式实例是一种特殊的按需实例,价格随库存等因素实时变化,相对于按量付费实例最高能节省90%的成本。但抢占式实例类型的节点可能在不确定时刻到期被回收,所以仅适用于无状态、容错能力强、中断容忍度高的业务场景,例如批处理和机器学习培训工作负载、大数据ETL(例如Apache Spark)、队列处理应用和无状态API应用等。如果您的作业运行时间较长或应用对稳定性有较高要求,不推荐您使用抢占式实例。更多信息,请参见抢占式实例节点池最佳实践。
使用节省计划
如果您的业务需要长期使用ECS或ECI资源,您可以购买节省计划来获得大幅度的费用折扣。节省计划通过承诺在一定期限内(1年、3年或5年)消费一定的金额,来换取较低的按量付费折扣。更多信息,请参见什么是节省计划、购买和使用节省计划。
购买ACK集群Pro版资源包
使用ACK集群Pro版所产生的费用包括集群管理费用和涉及的云产品资源费用。ACK集群Pro版的集群管理费用支持以资源包的方式抵扣,并提供一定的价格优惠。更多信息,请参见集群管理费用。
ACK资源包提供小型包和大型包两种规格。您可以访问ACK资源包售卖页,根据使用时长和具体定价进行选择。
为集群选择合适的地域
ECS实例资源在不同的地域可能定价不同。通常情况下,流量请求距离资源所在的地域较近时,将享受更低的网络延迟和更快的访问速度。但如果您的业务对网络时延容忍度较高,您可以选择在成本较低的地域部署集群。如需了解ECS资源在不同地域的具体价格,请参见价格计算器。
使用ACK托管集群
ACK托管集群的控制面由ACK创建并托管,您只需创建Worker节点,无需管理集群控制面(Master节点)资源,也无需承担控制面的资源费用,相较于ACK专有集群更具有成本优势。
如果您希望在集群中运行大规模业务,或业务对稳定性和安全性有较高要求,推荐您使用ACK集群Pro版。ACK集群Pro版支持赔付标准的SLA,进一步增强了集群的可靠性、安全性和调度性。更多信息,请参见ACK集群Pro版概述。
优化工作负载资源配置
设置适当的资源请求和限制
您需要合理配置容器的资源Request和Limit,配置过高时容易造成资源浪费,配置不足时可能影响流量高峰期集群的稳定性。通常情况下,您可参考容器的历史利用率情况、应用的压测表现等来配置取值,同时权衡应用的稳定性和资源的利用率,还需要根据容器运行情况持续进行调整。
推荐您使用资源画像功能生成资源配置的推荐值。资源画像通过分析集群历史资源的使用数据来推荐容器的资源规格,不仅能有效降低为容器配置Request和Limit的复杂度,还能实现容器粒度的资源规格推荐,提高集群资源的利用率。更多信息,请参见资源画像。
管理命名空间与配额
在多租场景下,不同的业务或团队通常会在不同的命名空间中部署应用。您可以通过命名空间进行资源的隔离,并为命名空间设置资源配额,限制业务或团队消耗超出实际需求的资源。命名空间支持配置的配额包括CPU、内存、存储资源、Pod数量等资源的上限。具体操作,请参见管理命名空间与配额。
选择合适的弹性能力
如果您的集群业务流量波动较大,推荐您根据业务需求和策略配置自动伸缩策略,让集群自动调整弹性计算资源。自动伸缩能够在业务负载上升时快速扩容Pod副本来缓解压力,在业务负载变小时适当缩容以节省资源。您只需要为实际使用的资源支付费用,无需基于最高需求来配置和支付资源,从而达到降低集群成本的目的。
工作负载伸缩(调度层弹性):主要负责修改工作负载的调度容量变化。例如,HPA是典型的调度层弹性组件,可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。
节点伸缩(资源层弹性):在集群的容量规划不能满足集群调度容量时,会扩容节点资源,进行调度容量的补充。
工作负载伸缩
方案 | 说明 |
基于CPU使用率、内存使用率或其他自定义指标实现Pod的自动扩缩,在业务负载上升时扩容Pod来缓解压力,在业务负载下降时缩容以节省资源。HPA适用于服务波动较大、服务数量多且需要频繁扩缩容的业务场景。 在为应用配置HPA时,为保证应用的稳定运行,建议您同时遵循以下做法:
| |
通过类似于Crontab的策略配置Pod的定时扩缩容,适用于业务流量有明显高峰时段、应用程序需要在特定时间执行任务等场景。 在为应用配置CronHPA时,为保证应用的稳定运行,建议您同时遵循以下做法:
| |
根据Pod的历史资源消耗推荐CPU和内存的配置,并在适当的情况下自动进行调整,适用于依赖稳定资源配置的有状态工作负载。 在为应用配置VPA时,为保证应用的稳定运行,建议您同时遵循以下做法:
| |
通过对应用的历史资源数据进行学习和分析,自动识别弹性周期并对容量进行预测,并动态调整Pod的数量,确保在业务高峰到来时提前完成资源扩容,以及在预测到业务低谷时适时缩容。 与HPA类似,在为应用配置AHPA时,为保证应用的稳定运行,建议您同时遵循以下做法:
| |
提供事件驱动的弹性能力,支持配置Kafka、MySQL、PostgreSQL、RabbitMQ、MongoDB等事件源,从事件源中进行数据的周期性消费,主要适用于音视频离线转码、事件驱动作业、流式数据处理等场景。 在为应用配置KEDA时,为保证应用的稳定运行,建议您同时遵循以下做法:
|
节点伸缩
在使用工作负载伸缩的同时,为避免新扩容的Pod由于节点资源不足而调度失败,建议您同时启用节点伸缩。关于节点自动伸缩和节点即时弹性的方案选型,请参见弹性方案:节点自动伸缩与节点即时弹性。
方案 | 说明 |
当集群的容量规划无法满足应用Pod调度时,您可以使用节点自动伸缩方案实现节点的自动扩缩。节点自动伸缩适用于扩容规模较小(例如开启弹性的节点池数量少于20,或对应节点池中的节点数量少于100),工作负载批次较为稳定,以单次伸缩为主等业务场景。 在配置节点自动伸缩时,为保证应用的稳定运行,建议您同时遵循以下做法:
| |
如果您的集群规模较大(例如弹性节点池中节点数大于100,或弹性节点池数大于20)、对资源交付速度有更高要求、期望灵活实现多实例规格和跨可用区自动伸缩,那么节点自动伸缩可能无法满足您扩缩容的需求,推荐您使用节点即时弹性功能。节点即时弹性降低了开发者的使用门槛并提高了弹性效率,同时降低了运维人员维护成本。 但节点即时弹性存在一些使用限制,请参见节点即时弹性的使用限制。 | |
当您需要在短时间内快速创建大量Pod时,ECS节点扩容速度可能无法满足要求,而预留额外的ECS节点又会产生资源浪费。借助ACK虚拟节点可以将Pod快速地调度到弹性容器实例ECI上运行,且无需购买和管理ECS节点。更多信息,请参见虚拟节点调度方案对比及介绍、通过虚拟节点将Pod调度到ECI上运行。 |
优化应用调度
使用动态资源超卖
如果集群中同时部署了Guaranteed和Burstable两类Pod,可以通过动态资源超卖功能充分利用集群中已分配但未使用的资源。
在ACK集群中,为了应对上下游链路波动,应用管理员提交了不同QoS等级的Pod(例如Guaranteed和Burstable)时一般需要为应用配置相当数量的资源Buffer,导致应用实际资源使用量远低于资源申请量。为了充分利用集群中已分配但未使用的资源,您可以使用动态资源超卖功能,提升集群资源利用率。
动态资源超卖可以定义节点的安全冗余水位,将安全冗余水位外的资源作为可动态超卖的资源。节点可超卖的资源量基于实际资源用量动态更新,您可以调度低优先级的BestEffort任务到该节点上。更多信息,请参见启用动态资源超卖。
例如,在离线混部场景下,您会在集群或节点上同时部署延迟敏感的在线类型和资源消耗高的离线类型的应用。此时,在满足在线应用服务质量的同时,推荐您为离线应用提供超卖的资源,实现CPU、内存等维度的精细化管理,从而提升集群整体资源利用率。具体操作,请参见快速入门。
使用GPU共享调度
如果期望让多个容器运行在同一个GPU设备,降低GPU资源的使用成本,您可以使用GPU共享调度能力。
GPU的共享方式包括单卡共享和多卡共享,单卡共享指一个Pod只申请一张GPU卡,占用该GPU的部分资源,常用于模型推理场景;多卡共享指一个Pod申请多张GPU卡,每张GPU提供等量的部分资源,常用于支持分布式模型训练代码的开发。您还可以灵活配置GPU共享和隔离的策略,例如配置多个Pod优先集中使用同一GPU卡或尽量分散使用不同GPU卡。更多信息,请参见共享GPU调度概述。
建立资源和成本监控
通过成本洞察功能查看部门或应用成本
对于企业IT成本管理人员,一般需要从不同维度了解集群资源使用量及成本分布,获取成本节约建议,从而提升集群资源利用率。您可以启用ACK集群提供的成本洞察功能,查看指定财务治理周期内,指定集群、部门、应用的成本和资源使用情况。更多信息,请参见成本洞察。
在ACK集群中,Pod作为最小的可部署单元,是衡量集群成本的关键因素。但不同Pod可能有不同的资源配置、调度策略和生命周期,导致其成本估算较为复杂。成本洞察基于成本数据模型实现,能够帮助您准确估算Pod的成本及占比,并将集群总费用分摊到不同业务单元。您也可以结合多维度的成本大盘,分析历史资源趋势和成本明细,定位业务成本异常根因。
定期扫描集群闲置资源
您可以定期扫描并释放ACK集群中的闲置资源,例如CPU、内存、存储、网络资源等,减少不必要的开销。
您可以启用成本洞察功能查看Pod的闲置资源情况,从而分析资源浪费的原因,有针对性地设计资源优化策略。更多信息,请参见付费策略及Pod用量。
ACK集群还提供闲置资源优化功能,可以扫描出与集群相关但未被使用的资源(包括ECS、块存储、CLB、EIP等),供您判断是否需要对这类闲置资源进行处理。更多信息,请参见闲置资源优化。