更新时间:2024-01-26 GMT+08:00

CCE Cluster Autoscaler

插件简介

CCE集群弹性引擎(autoscaler)是Kubernetes中非常重要的一个Controller,它提供了微服务的弹性能力,并且和Serverless密切相关。

弹性伸缩是很好理解的一个概念,当微服务负载高(CPU/内存使用率过高)时水平扩容,增加pod的数量以降低负载,当负载降低时减少pod的数量,减少资源的消耗,通过这种方式使得微服务始终稳定在一个理想的状态。

云容器引擎简化了Kubernetes集群的创建、升级和手动扩缩容,而集群中应用的负载本身是会随着时间动态变化的,为了更好的平衡资源使用率以及性能,Kubernetes引入了autoscaler插件,它可以根据部署的应用所请求的资源量自动伸缩集群中节点数量,详情请了解创建节点伸缩策略

开源社区地址:https://github.com/kubernetes/autoscaler

插件说明

autoscaler可分成扩容和缩容两个方面:

  • 自动扩容
    集群的自动扩容有以下两种方式实现:
    • 当集群中的Pod由于工作节点资源不足而无法调度时,会触发集群扩容,扩容节点与所在节点池资源配额一致。
      此时需要满足以下条件时才会执行自动扩容:
      • 节点上的资源不足。
      • Pod的调度配置中不能包含节点亲和的策略(即Pod若已经设置亲和某个节点,则不会自动扩容节点),节点亲和策略设置方法请参见调度策略(亲和与反亲和)
    • 当集群满足节点伸缩策略时,也会触发集群扩容,详情请参见创建节点伸缩策略

    当前该插件使用的是最小浪费策略,即若Pod创建需要3核,此时有4核、8核两种规格,优先创建规格为4核的节点。

  • 自动缩容
    当集群节点处于一段时间空闲状态时(默认10min),会触发集群缩容操作(即节点会被自动删除)。当节点存在以下几种状态的Pod时,不可缩容:
    • Pod有设置Pod Disruption Budget(即干扰预算),当移除Pod不满足对应条件时,节点不会缩容。
    • Pod由于一些限制,如亲和、反亲和等,无法调度到其他节点,节点不会缩容。
    • Pod拥有cluster-autoscaler.kubernetes.io/safe-to-evict: 'false'这个annotations时,节点不缩容。
    • 节点上存在kube-system命名空间下的Pod(除kube-system命名空间下由DaemonSet创建的Pod),节点不缩容。
    • 节点上如果有非controller(Deployment/ReplicaSet/Job/StatefulSet)创建的Pod,节点不缩容。

    当节点符合缩容条件时,Autoscaler将预先给节点打上DeletionCandidateOfClusterAutoscaler污点,限制Pod调度到该节点上。当autoscaler插件被卸载后,如果节点上依然存在该污点请您手动进行删除。

约束与限制

  • 安装时请确保有足够的资源安装本插件。
  • 默认节点池不支持弹性扩缩容,详情请参见默认节点池DefaultPool说明
  • 使用autoscaler插件时,部分污点/注解可能会影响弹性伸缩功能,因此集群中应避免使用以下污点/注解:
    • 节点避免使用ignore-taint.cluster-autoscaler.kubernetes.io的污点:该污点作用于节点。由于autoscaler原生支持异常扩容保护策略,会定期评估集群的可用节点比例,非Ready分类节点数统计比例超过45%比例会触发保护机制;而集群中任何存在该污点的节点都将从自动缩放器模板节点中过滤掉,记录到非Ready分类的节点中,进而影响集群的扩缩容。
    • Pod避免使用cluster-autoscaler.kubernetes.io/enable-ds-eviction的注解:该注解作用于Pod,控制DaemonSet Pod是否可以被autoscaler驱逐。详情请参见Kubernetes原生的标签、注解和污点

安装插件

  1. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“ 插件管理”,在右侧找到CCE Cluster Autoscaler,单击“安装”
  2. 在安装插件页面,设置“规格配置”

    表1 插件规格配置

    参数

    参数说明

    插件规格

    插件部署可选择如下几种规格。

    说明:

    autoscaler插件高可用或自定义部署时,插件实例间存在反亲和策略,会分别部署在不同的节点上,因此集群中的可用节点必须大于等于插件实例数才可保证插件高可用。

    • 单实例:以单实例部署插件。
    • 高可用50:50节点集群规模多实例部署,实例数为2,具有高可用能力。
    • 高可用200:200节点集群规模多实例部署,实例数为2,具有高可用能力,每个实例使用资源比高可用50的实例更多。
    • 自定义:根据需要自定义实例数量和实例规格。

    实例数

    选择上方插件规格后,显示插件中的实例数。

    选择“自定义”规格时,您可根据需求调整插件实例数。

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。

    容器

    选择插件规格后,显示插件容器的CPU和内存配额。

    选择“自定义”规格时,您可根据需求调整插件实例的容器规格。

  3. 设置插件支持的“参数配置”

    表2 插件参数配置

    参数

    说明

    扩缩容配置

    可以勾选自动扩缩容。

    • 当集群下负载实例无法调度时自动扩容(从节点池)

      即当出现Pod处于Pending状态无法调度时,集群会自动扩容节点。若Pod已经设置亲和某个节点,则不会自动扩容节点。该功能一般与HPA策略配合使用,具体请参见使用HPA+CA实现工作负载和节点联动弹性伸缩

      如不勾选,则只能通过节点伸缩策略进行扩缩容。

    • 自动缩容节点
      • 空置时间(min):当集群节点处于一段时间的空闲状态时,会触发集群缩容操作,删除节点,默认10min。
      • 缩容阈值:当集群节点资源(Request值)低于多少百分比时,进行集群缩容扫描(默认0.5,即50%,cpu和mem都要满足的条件下才会缩容)。
      • 冷却时间:

        扩容执行后多久能再次判断是否缩容,默认10min。

        说明:

        集群中如果同时存在自动扩容和自动缩容的场景,建议配置“扩容执行后多久能再次判断是否缩容”为0min,避免由于部分节点池持续扩容或者扩容失败重试而阻塞整体缩容节点行为,导致非预期的节点资源浪费。

        节点删除后多久能再次判断是否缩容:删除节点后能再次启动缩容评估的时间间隔,默认10min。

        缩容失败后多久能再次判断是否缩容:缩容失败后能再次启动缩容评估的时间间隔,默认3min。节点池中配置的缩容冷却时间和此处配置的缩容冷却时间之间的影响和关系请参见缩容冷却时间说明

      • 缩容并发数:最多支持多少个空闲节点同时缩容,默认10。
        缩容并发数只针对完全空闲节点,完全空闲节点可实现并发缩容。非完全空闲节点则只能逐个缩容。
        说明:

        节点在缩容的时候,若节点上的Pod不需要驱逐(DaemonSet的Pod认为不需要驱逐),则认为该节点为完全空闲节点,否则认为该节点为非完全空闲。

      • 检查间隔:节点被判定不可移除后能再次启动检查的时间间隔,默认5min。

    节点总数

    集群可管理的节点数目的最大值,扩容时不会让集群下节点数超过此值。

    CPU总数(核)

    集群中所有节点 CPU 核数之和的最大值,扩容时不会让集群下节点CPU核数之和超过此值。

    内存总数(GB)

    集群中所有节点内存之和的最大值,扩容时不会让集群下节点内存之和超过此值。

  4. 配置完成后,单击“安装”。

组件说明

表3 autoscaler组件

容器组件

说明

资源类型

autoscaler

该容器为Kubernetes集群提供自动扩缩容节点的能力。

Deployment

缩容冷却时间说明

节点池中配置的缩容冷却时间和autoscaler插件中配置的缩容冷却时间之间的影响和关系如下:

节点池配置的缩容冷却时间

弹性缩容冷却时间:当前节点池扩容出的节点多长时间不能被缩容,作用范围为节点池级别。

autoscaler插件配置的缩容冷却时间

扩容后缩容冷却时间:autoscaler触发扩容后(不可调度、指标、周期策略)整个集群多长时间内不能被缩容,作用范围为集群级别。

节点删除后缩容冷却时间:autoscaler触发缩容后整个集群多长时间内不能继续缩容,作用范围为集群级别。

缩容失败后缩容冷却时间:autoscaler触发缩容失败后整个集群多长时间内不能继续缩容,作用范围为集群级别。