
# 集群成本管理最佳实践
集群成本优化的核心在于如何最大化地利用集群资源，减少集群中不必要的成本开销。同时，成本优化并不局限在降低资源规模，而是需要在集群成本优化与可靠性之间进行平衡。本文汇总了集群成本优化的最佳实践，希望可以帮助您有效地进行集群成本优化，助力企业降本增效。
#### 使用合适的集群配置
在部署集群之前，您需要评估集群应用所需的资源需求，选择合适的集群类型、节点实例类型、集群付费模式等，从而以更低的成本构建集群。
#### 集群类型选择
CCE提供了不同种类的集群类型，需要您结合自身业务特点，选择适合的集群类型。各种集群类型差异如下：
| 类型对比 | CCE Standard                   | CCE Turbo                    | CCE Autopilot             |
|:---|:---|:---|:---|
| 说明   | 企业级Kubernetes容器服务              | 软硬协同，计算、网络、存储全方位升级           | Serverless容器，K8s生态，K8s全兼容 |
| 管理   | 管理集群、节点和业务                     | 管理集群、节点和业务                   | 集群节点全托管，聚焦业务              |
| 集群   | 区分规格档位，档位自主调整                  | 区分规格档位，档位自主调整                | 灵活规格档位，档位自动调整             |
| 节点   | 多种固定规格，节点自主创删                  | 多种固定规格，节点自主创删                | 无需感知节点，直接部署容器，容器资源灵活配比    |
| 算力   | 支持X86、ARM、NPU等多种异构算力           | 支持X86、ARM、NPU等多种异构算力         | 支持X86、ARM、NPU等多种异构算力      |
| 调度   | 自研Volcano调度器，提供丰富调度策略，提升任务执行效率 | 调度器+智能混合调度，提升集群资源利用率         | 智能调度，容器秒级启动，负载自动调优        |
| 网络   | VPC网络叠加容器网络（两层）                | VPC网络和容器网络融合，性能无损耗（一层）       | VPC网络和容器网络融合，性能无损耗（一层）    |
| 安全   | 基于NetworkPolicy提供容器维度的网络访问控制   | Kata安全容器，给容器提供类似虚拟机级别的安全隔离能力 | 云原生专属OS，漏洞自动修复            |
   
详情请参见[集群类型对比](https://support.huaweicloud.com/usermanual-cce/cce_10_0342.html)。
#### 节点规格选择
不同类型ECS规格实例提供不同的计算能力和存储能力。通常情况下，配置的规格越高（CPU、内存配置越高）、专业程度越高（例如：GPU、NPU等），节点成本越高。需要您结合自身业务特点，配置出稳定、性价比高的ECS实例。
#### 节点付费类型选择
不同的业务类型对资源的使用周期、稳定性需求不同，您可以结合业务特点选择合适的付费类型，以达到成本最优的效果。
| 计费类型  | 说明                                                                                                                                                                                                                                                                                                                   |
|:---|:---|
| 包年/包月 | 一种预付费模式，即先付费再使用，按照订单的购买周期进行结算。购买周期越长，享受的折扣越大。 一般适用于设备需求量长期稳定的成熟业务。                                                                                                                                                                                                           |
| 按需计费  | 一种后付费模式，即先使用再付费，按照云服务器实际使用时长计费，秒级计费，按小时结算。按需计费模式允许您根据实际业务需求灵活地调整资源使用，无需提前预置资源，从而降低预置过多或不足的风险。 一般适用于电商抢购等设备需求量瞬间大幅波动的场景。                                                                                                                                                    |
| 竞价计费  | 一种后付费模式，即先使用再付费，按照随市场供需关系实时变化的折扣以及云服务器实际使用时长计费，秒级计费，按小时结算。 购买竞价实例需设定"价格上限"，即您愿意为云服务器支付的最高价格。当库存资源紧张或市场价格高于您设置的价格上限时，竞价实例将被中断回收。 须知： 竞价计费型实例存在中断机制，实例生命周期不可控，请勿使用竞价计费型实例运行需长时间作业、或稳定性要求极高的服务。 |
   
详情请参见[ECS计费项](https://support.huaweicloud.com/price-ecs/ecs_billing_3000.html)。
#### 及时清理闲置资源
及时识别并清理集群中闲置的云服务或者资源，比如未被使用的ECS、EVS、OBS、ELB、EIP等资源。
#### 工作负载资源配置优化
资源请求和限制配置过高会导致资源浪费，配置过低又会影响负载的稳定性。配置合适的资源请求和限制值，提高集群资源利用效率，对集群成本的节省至关重要。
#### 设置合适的资源请求和限制
您需要为工作负载配置合适的Request和Limit资源限制，在保证负载有充足资源的同时，也要避免资源申请过大导致的资源浪费。
对您现有的应用进行配置优化，可以使用CCE提供的应用资源规格推荐功能。该功能使用CCE Volcano调度器，通过对工作负载的历史CPU、内存资源使用数据进行分析，得出工作负载资源申请量（Request）的推荐值。您可以直接将该推荐值应用到环境上。当您对配置进行修改时，Request默认为推荐值，Limit值取Max(Request\*1.2, 当前Limit值)，您可以在此基础上添加冗余配置。
注意：推荐结果基于工作负载历史运行数据生成，可能存在偏差，仅做参考。需要您结合业务实际运行情况调整资源Request、Limit配置。
#### 对命名空间进行配额管理
配额管理实现多团队或多用户在共享集群资源的情况下限制团队、用户可以使用的资源总量，包括限制命名空间下创建某一类型对象的数量以及对象消耗计算资源（CPU、内存）的总量。
通过命名空间配额管理，您可以对业务或者团队进行资源限制，减少不必要的资源开销。
详情请参见[设置资源配额及限制](https://support.huaweicloud.com/usermanual-cce/cce_10_0287.html)。
#### 使用集群弹性伸缩能力
云容器引擎提供秒级弹性伸缩能力，可根据用户的业务需求预设策略自动调整计算资源，使云服务器或容器数量自动随业务负载增长而增加，随业务负载降低而减少，保证业务平稳健康运行的同时，增加集群资源使用效率，进而达到节省成本的效果。
详情请参见[工作负载伸缩](https://support.huaweicloud.com/usermanual-cce/cce_10_0290.html)。
#### 应用弹性伸缩
提供应用粒度的伸缩能力，为有突发性流量或者有周期性波峰、波谷特征业务的应用提供自动调整弹性计算资源的能力。
**应用按需弹性（HPA）**
应用弹性伸缩是根据业务需求和策略，自动调整弹性计算资源。以有效地在业务高峰时快速扩容，业务低谷时快速缩容。以此达到最大化资源使用效率与节约成本的目的。
CCE支持多种工作负载伸缩方式，策略如下：
| 策略名称                                                        | 说明                                                                                                                                                                                                                                                                                     |
|:---|:---|
| 容器水平伸缩（HPA）                                                 | HPA即[Horizontal Pod Autoscaling](https://kubernetes.io/zh-cn/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/)，基于指标（CPU利用率、内存利用率），对无状态工作负载进行弹性扩缩容。在Kubernetes社区HPA功能的基础上，增加了应用级别的冷却时间窗和扩缩容阈值等功能。 HPA适用于服务波动较大、服务数量多且需要频繁扩缩容的业务场景。 |
| 容器定时水平伸缩 （CronHPA） | CronHPA基于周期（每天、每周、每月或每年的具体时间点），对无状态工作负载进行弹性扩缩容。 CronHPA适用于应用资源使用率存在周期性变化的场景。                                                                                                                                                                    |
   
**突发弹性能力（对接CCI）**
在短时高负载场景下，除了通过HPA水平伸缩实现弹性扩容，还可以将集群中的Pod弹性创建到云容器实例CCI服务上。该方案无需新建节点资源，可以进一步减少扩容带来的资源消耗。集群中需要安装CCE突发弹性引擎（对接CCI）插件，详情请参见[CCE容器实例弹性伸缩到CCI服务](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0133.html)。
#### 节点弹性伸缩
应用的弹性伸缩，可以根据负载指标动态调整副本数量，但是如果集群的资源不足，新的副本无法运行的情况下，就需要对集群进行扩容。
详情请参见[节点伸缩](https://support.huaweicloud.com/usermanual-cce/cce_10_0296.html)。
您可以选择的弹性伸缩策略如下：
| 策略名称  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|
| 手动扩缩容 | 可以对节点池手动进行节点扩缩容。当选择的节点规格资源不足或配额不足时，会导致扩容失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| 弹性扩缩容 | 使用CCE集群弹性引擎插件（CCE Cluster Autoscaler），可根据Pod调度状态及资源使用情况对集群的节点进行自动扩容缩容，同时支持多可用区、多实例规格、指标触发和周期触发等多种伸缩模式，满足不同的节点伸缩场景。 - 扩容流程：Autoscaler会每隔10s检查一次所有未调度的Pod，根据用户设置的策略，选择出一个符合要求的节点池进行扩容。  - 缩容流程：Autoscaler每隔10s会扫描一次所有的Node，如果该Node上所有的Pod Requests少于用户定义的缩容百分比时，Autoscaler会模拟将该节点上的Pod是否能迁移到其他节点。   |
   
#### 应用调度优化
在业务云原生化过程中，需要根据业务的部署方案、架构，寻找性能和服务质量的平衡点。可以根据您的业务场景，选择以下合适的调度方案帮助您提升资源利用率，以进行有效的成本控制。
#### 使用云原生混部能力
如果您的业务满足如下场景，推荐您使用该能力：
- 集群规划粒度过细，节点分布过散：集群规划粒度过细，节点分布在多个不同的集群中，使得计算资源无法共享，计算资源碎片数量增加。
- 节点规格没有跟随应用迭代而变化，资源分配率低：初期节点规格与应用规格匹配度较好，资源分配率较高；随着应用版本迭代，应用申请资源发生变化，与节点规格比例差异较大，使节点分配率降低，计算资源碎片数量增加。
- 业务"潮汐"特性明显，预留资源较多：在线业务具有明显日级别波峰、波谷特性，用户为保证服务的性能和稳定性按照波峰申请资源，集群的大部分资源处于闲置状态。
- 在线和离线作业分布不同集群，资源无法分时复用：用户为在线和离线作业划分不同的K8s集群中，在线业务在波谷时，无法部署离线作业使用这部分资源。
在上述场景下，帮助用户提升资源利用率，实现降本增效的云原生混部解决方案如：
| 功能            | 说明                                                                                                                                                                                                      |
|:---|:---|
| 动态资源超卖        | 根据在线作业和离线作业类型，通过Volcano调度将集群中申请而未使用的资源（即申请量与使用量的差值）利用起来，实现资源超卖和混合部署，提升集群资源利用率。 详情请参见[动态资源超卖](https://support.huaweicloud.com/usermanual-cce/cce_10_0384.html)。 |
| CPU Burst弹性限流 | 提供一种可以短暂突破CPU Limit值的弹性限流机制，以降低业务长尾响应时间，可以有效提升时延敏感型业务的服务质量。 详情请参见[CPU Burst弹性限流](https://support.huaweicloud.com/usermanual-cce/cce_10_0700.html)。              |
| 出口网络带宽保障      | 平衡在线业务与离线业务对出口网络带宽的使用，保证在线业务有足够的网络带宽。 详情请参见[出口网络带宽保障](https://support.huaweicloud.com/usermanual-cce/cce_10_0701.html)。                                          |
   
#### 资源利用率优化调度
借助CCE Volcano调度器提升集群中资源的使用效率，包括装箱调度（Binpack）、重调度（Descheduler）、节点池亲和性调度、负载感知调度等调度方案。
| 调度策略             | 说明                                                                                                                                                                                                                            |
|:---|:---|
| 装箱调度（Binpack）    | 装箱调度是一种优化算法，以降低集群资源碎片为目标。在集群工作负载的调度过程中设置该策略，调度器会优先将Pod调度到资源消耗较多的节点，减少各节点空闲资源碎片，提高集群资源利用率。 详情请参见[装箱调度（Binpack）](https://support.huaweicloud.com/usermanual-cce/cce_10_0773.html)。     |
| 重调度（Descheduler） | Volcano调度器可以根据设置的策略，驱逐不符合配置策略的Pod，让其重新进行调度，达到均衡集群负载、减少资源碎片化的目的。 详情请参见[重调度（Descheduler）](https://support.huaweicloud.com/usermanual-cce/cce_10_0766.html)。                             |
| 节点池亲和性调度         | 在替换节点池、节点滚动升级等场景中，需要使用新节点池替换旧节点池。在这些场景下，为做到业务不感知，可以在业务触发变更时，将业务的Pod软亲和调度到新的节点池上。 详情请参见[节点池亲和性调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0767.html)。                    |
| 负载感知调度           | 提供节点CPU、Memory的负载感知调度能力，感知集群内节点CPU、Memory的负载情况，将Pod优先调度到负载较低的节点，实现节点负载均衡，避免出现因单个节点负载过高而导致的应用程序或节点故障。 详情请参见[负载感知调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0789.html)。 |
   
#### 优先级调度与抢占
优先级表示一个作业相对于其他作业的重要性，Volcano兼容Kubernetes中的Pod优先级定义。启用该能力后，调度器将优先保障高优先级业务调度。集群资源不足时，调度器主动驱逐低优先级业务，保障调度高优先级业务可以正常调度。详情请参见[优先级调度与抢占](https://support.huaweicloud.com/usermanual-cce/cce_10_0775.html)。
优先级调度与抢占调度类型：
| 调度类型      | 说明                                                     |
|:---|:---|
| 基于优先级调度   | 调度器优先保障高优先级业务运行，但不会主动驱逐已运行的低优先级业务。基于优先级调度配置默认开启，不支持关闭。 |
| 基于优先级抢占调度 | 当集群资源不足时，调度器主动驱逐低优先级业务，保障高优先级业务正常调度。                   |
   
#### 共享使用GPU资源
使用GPU虚拟化能力实现算力和显存隔离，高效利用GPU设备资源。CCE GPU虚拟化采用自研xGPU虚拟化技术，能够动态对GPU设备显存与算力进行划分，相对于静态分配来说，虚拟化的方案更加灵活，最大程度保证业务稳定的前提下，可以完全由用户自己定义使用的GPU量，提高GPU利用率。
详情请参见[GPU虚拟化概述](https://support.huaweicloud.com/usermanual-cce/cce_10_0644.html)。
#### AI任务性能增强调度
针对AI、大数据协作调度场景，可使用Volcano公平调度（DRF）、组调度（Gang）来提升训练性能，提高资源使用效率。
**公平调度（DRF）**
DRF（Dominant Resource Fairness）是主资源公平调度策略，应用于大批量提交AI训练和大数据作业的场景，可增强集群业务的吞吐量，整体缩短业务执行时间，提高训练性能。详情请参见[公平调度（DRF）](https://support.huaweicloud.com/usermanual-cce/cce_10_0777.html)。
在实际业务中，经常会遇到将集群稀缺资源分配给多个用户的情况，每个用户获得资源的权利都相同，但是需求数却可能不同，如何公平地将资源分配给每个用户是一项非常有意义的事情。调度层面有一种常用的方法为最大最小化公平分配算法（max-min fairness share），尽量满足用户中的最小的需求，然后将剩余的资源公平分配给剩下的用户。形式化定义如下：
- 资源分配以需求递增的方式进行分配
- 每个用户获得的资源不超过其需求
- 未得到满足的用户等价平分剩下的资源
**组调度（Gang）**
组调度（Gang）满足了调度过程中"All or nothing"的调度需求，避免Pod的任意调度导致集群资源的浪费，主要应用于AI、大数据等多任务协作场景。启用该能力后，可以解决分布式训练任务之间的资源忙等待和死锁等痛点问题，大幅度提升整体训练性能。详情请参见[组调度（Gang）](https://support.huaweicloud.com/usermanual-cce/cce_10_0778.html)。
组调度的具体算法是，观察Job下的Pod已调度数量是否满足了最小运行数量，当Job的最小运行数量得到满足时，为Job下的所有Pod执行调度动作，否则，不执行。
主要适用于需要多进程协作的场景：
- AI场景往往包含复杂的流程，Data Ingestion、Data Analysts、Data Splitting、Trainer、Serving、Logging等，需要一组容器进行协同工作，就很适合基于容器组的Gang调度策略。
- MPI计算框架下的多线程并行计算通信场景，由于需要主从进程协同工作，也非常适合使用Gang调度策略。
- 容器组下的容器高度相关也可能存在资源争抢，整体调度分配，能够有效解决死锁。 在集群资源不足的场景下，Gang的调度策略对于集群资源的利用率的提升是非常明显的。
  
 
#### NUMA亲和性调度
在云原生环境中，对于高性能计算（HPC）、实时应用和内存密集型工作负载等需要CPU间通信频繁的场景下，跨NUMA（Non-uniform memory access）节点访问会导致增加延迟和开销，从而降低系统性能。为此，volcano实现了NUMA亲和性调度策略，尽可能把Pod调度到需要跨NUMA节点最少的工作节点上，这种调度策略能够降低数据传输开销，优化资源利用率，从而增强系统的整体性能。
Volcano的目标是解决调度程序NUMA拓扑感知的限制，以便实现以下目标：
- 避免将Pod调度到NUMA拓扑不匹配的节点。
- 将Pod调度到NUMA拓扑的最佳节点。
详情请参见[NUMA亲和性调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0425.html)。
#### 应用扩缩容优先级策略
通过应用扩缩容优先级策略，您可以精细控制不同类型节点上的Pod扩缩容优先级，实现资源管理的最优化。应用扩缩容优先级策略包括两个方面：
- 针对扩容：集群中新建的Pod，Volcano会按照设定的节点优先级进行调度。
- 针对缩容：指定工作负载时，Volcano会按照设定的节点优先级对其进行打分，用于缩容时决定Pod删除顺序。
在使用默认扩缩容优先级策略的情况下，扩容过程中Pod优先被调度到包周期的节点，其次被调度到按需计费的节点，最后被调度到virtual-kubelet节点（弹性至CCI）；缩容过程中优先删除virtual-kubelet节点（弹性至CCI）的Pod，其次删除按需计费节点上的Pod，最后删除包周期节点上的Pod。您可以根据自身业务场景调整扩缩容优先策略。详情请参见[应用扩缩容优先级策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0746.html)。
#### 建立资源和成本监控
成本洞察基于真实账单和集群资源用量统计数据，通过自研的成本画像算法进行成本拆分，提供以部门、集群、命名空间、应用等维度的成本画像。成本洞察能够帮助您分析集群成本开销、资源使用状况，识别资源浪费，为持续的成本优化提供输入。详情请参见[成本洞察概述](https://support.huaweicloud.com/usermanual-cce/cce_10_0875.html)。
