全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:通过cluster-autoscaler组件实现节点自动伸缩

更新时间:Apr 09, 2024

当集群的容量规划无法满足应用Pod调度时,您可以使用节点自动伸缩方案实现节点的自动扩缩。节点自动伸缩适用于扩容规模较小(例如开启弹性的节点池数量少于20,或对应节点池中的节点数量少于100),工作负载批次较为稳定,以单次伸缩为主等业务场景。

阅读前提示

为了让您更好地使用节点自动伸缩功能,建议您在阅读本文档前,已阅读节点伸缩概述并了解以下内容:

对节点自动伸缩的工作原理与功能特性

对哪些业务场景下,节点自动伸缩可以满足您的业务诉求

对使用节点自动伸缩前需要了解的注意事项

步骤一:开启节点自动伸缩

使用节点自动伸缩功能前,您需要在节点池页面开启并配置集群自动弹性伸缩,使节点具备伸缩能力。配置时,请选择伸缩组件为cluster-autoscaler组件,即节点自动伸缩的实现组件。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,单击集群自动弹性伸缩后面的去配置

    1.jpg

  4. 首次使用集群自动弹性伸缩功能时,按照页面提示,开通ESS服务并完成授权(如已授权,请跳过)。

    展开查看服务开通及授权步骤

    说明

    以下开通ESS服务的操作仅供参考,实际请按照界面提示操作。

    1. 单击提示对话框中弹性伸缩(Auto Scaling)链接,进入弹性伸缩服务ESS页面,根据页面提示开通ESS服务。

    2. 开通成功后,在开通完成页签,单击管理控制台,进入弹性伸缩服务ESS页面。

    3. 单击前往授权,进入云资源访问授权页面,配置对云资源的访问权限,单击同意授权

      说明
      • 如果您的集群为ACK专有集群,请根据页面引导对每个集群授权AliyunCSManagedAutoScalerRolePolicy

      • 如果您的集群为ACK托管集群,请确保kube-system命名空间下保密字典内有addon.aliyuncsmanagedautoscalerrole.token。如果没有,请提交工单

        没有Token时,ACK默认通过WorkRole实现相关能力。您可以参见如何为集群WorkerRole添加AliyunCSManagedAutoScalerRolePolicy权限?,尝试通过为集群WorkerRole添加AliyunCSManagedAutoScalerRolePolicy权限的方法来解决。

  5. 集群自动弹性伸缩配置页面,选择伸缩组件cluster-autoscaler,配置伸缩配置项,然后单击确定

    配置

    说明

    节点池扩容顺序策略

    • 随机策略:存在多个可扩容节点池时,从中任意选择一个节点池进行扩容。

    • 默认策略:存在多个可扩容节点池时,从中选择一个资源浪费最少的节点池进行扩容。

    • 优先级策略:存在多个可扩容节点池时,会按照您自定义的顺序选择优先级高的节点池进行扩容。

      需在创建开启了弹性的节点池后再操作。

    弹性灵敏度

    用于调整系统判断伸缩的间隔时间。默认值为60s。

    实施弹性伸缩时,弹性组件会基于调度情况自动触发扩容。您只需配置缩容条件。

    重要
    • ECS节点:仅当同时满足缩容阈值缩容触发时延静默时间三个条件时,弹性组件才有可能执行节点缩容。

    • GPU节点:仅当同时满足GPU 缩容阈值缩容触发时延静默时间三个条件时,弹性组件才有可能执行GPU节点缩容。

    允许缩容

    是否允许进行节点缩容。关闭时,缩容相关配置不生效。请谨慎设置。

    缩容阈值

    启用节点自动伸缩的节点池中,单个节点的请求资源(Request)与单个节点资源容量的比值。

    仅当该比值低于配置的阈值时,即节点的CPU和内存资源利用率均低于缩容阈值时,节点才有可能被缩容。

    GPU 缩容阈值

    GPU实例的缩容阈值。

    仅当该比值低于配置的阈值时,即节点的CPU、内存和GPU资源利用率均低于GPU 缩容阈值时,GPU节点才有可能被缩容。

    缩容触发时延

    从检测到有缩容需求(达到缩容阈值)到实际执行缩容操作(缩容Pod数量)之间的时间间隔。单位:分钟。默认值:10分钟。

    重要

    仅当满足缩容阈值配置,且达到缩容触发时延后,弹性组件才有可能执行节点缩容。

    静默时间

    距离最近一次扩容完成后,弹性组件不执行缩容的时间间隔。

    在静默时间内,弹性组件不会缩容节点,但仍会判断节点是否可以缩容;超过静默时间后,如果节点满足缩容阈值和缩容触发时延两个条件,弹性组件则会正常执行缩容。例如,当静默时间为10分钟,缩容触发时延为5分钟时,弹性组件在最近一次扩容后的10分钟内不会缩容节点,但会在静默的10分钟内判断节点是否符合缩容条件。等待静默时间结束,节点达到缩容阈值且时间超过缩容触发时延规定的5分钟时,弹性组件会继续执行缩容。

    查看高级配置的配置项说明

    配置项

    说明

    Pod终止超时时间

    缩容节点时等待节点上Pod终止的最长时间。单位:秒。

    Pod最小副本数

    节点排水时每个ReplicaSet中允许的Pod最小数量。

    是否开启Daemonset Pod排水

    开启Daemonset Pod排水后,节点缩容时会驱逐节点上的Daemonset Pod。

    是否跳过有kube-system Pod所在节点

    开启后,当集群执行节点自动缩容操作时,可以忽略运行在kube-system命名空间下的Pod所在的节点。

    说明

    此功能对DaemonSet Pod和Mirror Pod不生效。

步骤二:配置开启弹性的节点池

节点自动伸缩的扩缩对象为开启自动伸缩节点池的节点。因此,配置节点自动伸缩后,您还需要配置至少一个开启了弹性的节点池。您可以新建一个开启自动弹性伸缩的节点池,也可以配置已有节点池,为其开启自动弹性伸缩功能。

下表介绍主要配置项,其中“节点池”均指“开启弹性的节点池”。更多信息,请参见创建节点池编辑节点池

配置

说明

自动伸缩

是否开启自动伸缩。该功能可根据业务需求和策略,经济地自动调整弹性计算资源的管理服务。更多信息,请参见弹性伸缩概述。开启前,请先配置节点池的自动弹性伸缩能力,操作步骤可参考步骤一:开启节点自动伸缩

实例规格

节点池内实例的规格。单一规格的ECS实例库存容量波动较大,建议配置多种同规格的实例类型,以提高节点伸缩成功率。

如果您选择的实例均为GPU服务器,您可以按需开启共享 GPU 调度。更多信息,请参见共享GPU调度概述

实例数量

节点池所包含的实例数量(不包含您已有的实例)。

默认情况下,实例数最少为0。超过0时,集群会默认向节点池中添加实例,并将实例加入到节点池对应的ACK集群中。

操作系统

在开启自动伸缩时,支持选择Alibaba Cloud Linux、Windows镜像、Windows Core镜像。

当所选镜像是Windows镜像或Windows Core镜像时,系统将自动配置污点(Taints){ effect: 'NoSchedule', key: 'os', value: 'windows' }

节点标签

在集群中添加节点标签(Label)后,会自动添加到弹性伸缩扩容出的节点上。

重要

当节点标签和污点配置映射到节点池Tag后,自动伸缩才可识别,且节点池Tag存在数量上限。因此,请将开启自动伸缩的节点池配置的ECS标签、污点和节点标签的总数控制在12个之内。

扩缩容策略

  • 优先级策略:根据以上配置的虚拟交换机的优先级进行扩缩容(选择的虚拟交换机的顺序,由上到下优先级递减)。当优先级较高的虚拟交换机所在可用区无法创建ECS实例时,自动使用下一优先级的虚拟交换机创建ECS实例。

  • 成本优化策略:按vCPU单价从低到高尝试创建。当伸缩配置已设置抢占式计费方式的多实例规格时,优先创建对应抢占式计费实例。当抢占式计费实例规格由于库存等原因无法创建时,自动尝试以按量付费的方式创建。

    付费类型抢占式实例时,还可配置以下参数:

    • 按量实例所占比例%:节点池实例中按量实例应占的比例,取值范围为[0,100]。

    • 开启抢占式实例补偿:开启后,当收到抢占式实例将被回收的系统消息时(即抢占式实例被回收前5分钟左右),伸缩组将尝试创建新的实例,替换掉将被回收的抢占式实例。

    • 允许按量实例补偿:开启后,如果因价格或库存等原因无法创建足够的抢占式实例,伸缩组将自动尝试创建按量实例,以满足ECS实例数量要求。

  • 均衡分布策略:只有设置多个专有网络交换机时,均衡分布策略才能生效。在伸缩组指定的多可用区(即指定多个专有网络交换机)之间均匀分配ECS实例。如果由于库存不足等原因造成可用区之间不平衡,您可以再次进行均衡操作,以平衡资源的可用区分布。

重要

节点池创建完成后,扩缩容策略不支持编辑。

伸缩模式

支持标准模式极速模式

  • 标准模式:根据资源申请值的使用量,通过创建、释放ECS实例的方式进行伸缩。

  • 极速模式:通过创建、停机、启动的方式进行伸缩,提高再次伸缩的速度。

    重要
    • 极速弹出模式在节点进入停机回收状态时,节点将停机,并处在NotReady状态。当再次伸缩弹出时,节点状态会变为Ready。极速模式实例停机再次启动时,如果启动失败,系统不会自动释放实例,请按需手动释放。

    • 极速弹出模式的节点处在停机回收状态时,只收取磁盘的费用,不收取计算费用(不包含拥有本地盘的机型系列,例如ecs.d1ne.2xlarge),在库存充裕的前提下可以极速启动。

污点 (Taints)

添加污点后,集群将不会将Pod调度到该节点上。

创建开启了弹性的节点池后,您可以参照步骤一:开启节点自动伸缩选择是否配置优先级策略。优先级取值范围为[1,100],必须为正整数。

步骤三:(可选)结果验证

完成如上操作后,您便可以使用节点自动伸缩功能。此时,节点池将显示已开始自动伸缩且集群已自动安装cluster-autoscaler组件

节点池已开启自动伸缩

节点池页面,显示已开启自动伸缩的节点池。

image

已安装cluster-autoscaler组件

  1. 在集群管理页左侧导航栏,选择工作负载 > 无状态

  2. 选择kube-system命名空间,显示cluster-autoscaler组件

常见问题

为什么节点自动伸缩组件无法弹出节点?

请检查是否存在如下几种场景:

  • 配置开启了弹性的节点池中的实例类型无法满足Pod的请求资源(Request)。ECS实例规格给出的资源大小是实例的售卖规格,实际运行时ACK需要占用一定的节点资源来为kube组件和system进程预留资源,从而保证OS内核和系统服务、Kubernetes守护进程的正常运行。这会导致节点的资源总数Capacity与可分配的资源数Allocatable之间存在差异。详细信息,请参见节点资源预留策略

    另外,默认节点会安装系统组件,Pod的申请资源要小于实例的规格。

  • 对可用区有约束的Pod,无法触发配置了多可用区的节点池扩容。

  • 是否完整按照步骤执行了授权操作。授权操作是集群维度的,需要每个集群操作一次。关于授权,请参见步骤一:开启节点自动伸缩

  • 开启自动伸缩的节点池中出现如下异常情况。

    • 实例未加入到集群且超时。

    • 节点未ready且超时。

    为保证后续扩缩准确性,弹性组件以阻尼方式处理异常情况,在处理完异常情况节点前,不进行扩缩容。

为什么节点自动伸缩组件无法缩容节点?

请检查是否存在如下几种场景:

  • 节点Pod的请求资源(Request)阈值高于设置的缩容阈值。

  • 节点上运行了kube-system命名空间的Pod。

  • 节点上的Pod包含强制的调度策略,导致其他节点无法运行此Pod。

  • 节点上的Pod拥有PodDisruptionBudget,且达到了PodDisruptionBudget的最小值。

您可以在开源社区得到更多关于节点自动伸缩组件的常见问题与解答。

弹性伸缩时,如何在多个开启弹性的节点池之间选择?

在Pod无法调度时,会触发弹性伸缩组件的模拟调度逻辑,根据节点池配置的标签、污点以及实例规格等信息进行判断。当配置的节点池可以模拟调度Pod的时候,会选择进行节点弹出。当有多个节点池同时满足模拟调度条件的时候,默认采用最少浪费(least-waste)原则,即根据模拟弹出后节点上剩余的资源最小进行抉择。

什么类型的Pod可以阻止CA移除节点?

cluster-autoscaler使用了哪些调度策略来判断不可调度Pod能否调度到开启自动伸缩节点池?

使用的调度策略如下所示。

  • PodFitsResources

  • GeneralPredicates

  • PodToleratesNodeTaints

  • MaxGCEPDVolumeCount

  • NoDiskConflict

  • CheckNodeCondition

  • CheckNodeDiskPressure

  • CheckNodeMemoryPressure

  • CheckNodePIDPressure

  • CheckVolumeBinding

  • MaxAzureDiskVolumeCount

  • MaxEBSVolumeCount

  • ready

  • MatchInterPodAffinity

  • NoVolumeZoneConflict

如何为集群WorkerRole添加AliyunCSManagedAutoScalerRolePolicy权限?

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 单击集群资源页签,然后单击Worker RAM 角色后面的链接。

  3. RAM控制台,单击精确授权

  4. 精确授权面板,默认选择系统策略,输入系统策略名称为AliyunCSManagedAutoScalerRolePolicy,然后单击确定

  5. 精确授权面板,单击关闭。刷新页面,可以看到新增的权限。

  6. 手动重启kube-system命名空间下的deployment cluster-autoscaler,以便权限立即生效。