更新时间:2024-10-14 GMT+08:00

CCE集群弹性引擎

插件简介

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说明
  • 缩容节点会导致与节点关联的本地持久卷类型的PVC/PV数据丢失,无法恢复,且PVC/PV无法再正常使用。缩容节点时使用了本地持久存储卷的Pod会从缩容的节点上被驱逐,并重新创建Pod,Pod会一直处于pending状态,因为Pod使用的PVC带有节点标签,由于冲突无法调度成功。
  • 使用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集群弹性引擎插件,单击“安装”
  2. 在安装插件页面,设置“规格配置”

    表1 规格配置

    参数

    参数说明

    实例数

    插件实例的副本数量。

    实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。

    容器

    请根据集群的规模,合理调整插件实例数和容器CPU/内存配额,详情请参见表2

    表2 插件配额建议

    节点数量

    实例数

    CPU申请值

    CPU限制值

    内存申请值

    内存限制值

    50

    2

    1000m

    1000m

    1000Mi

    1000Mi

    200

    2

    4000m

    4000m

    2000Mi

    2000Mi

    1000

    2

    8000m

    8000m

    8000Mi

    8000Mi

    2000

    2

    8000m

    8000m

    8000Mi

    8000Mi

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

    表3 参数配置

    参数

    说明

    节点总数

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

    CPU总数(核)

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

    内存总数(GiB)

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

  4. 设置插件实例的“调度策略”

    • 调度策略对于DaemonSet类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表4 插件调度配置

    参数

    参数说明

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。
    • 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。

    节点亲和

    • 不配置:插件实例不指定节点亲和调度。
    • 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。
    • 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。

      同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。

    插件会对实例添加针对node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。

    详情请参见设置容忍策略

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

组件说明

表5 autoscaler组件

容器组件

说明

资源类型

autoscaler

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

Deployment

缩容冷却时间说明

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

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

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

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

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

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

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