通过弹性伸缩功能自动伸缩Pod、ECS和ECI

弹性伸缩是ACK上被广泛采用的功能,典型的场景包含在线业务弹性、大规模计算训练、深度学习GPU或共享GPU的训练与推理、定时周期性负载变化等。本文介绍如何通过ACK的弹性伸缩功能实现Pod、ECS和ECI的自动扩缩容。

背景信息


弹性伸缩分为两个维度:

  • 调度层弹性,主要是负责修改负载的调度容量变化。例如,HPA是典型的调度层弹性组件,通过HPA可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。
  • 资源层弹性,主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECS或ECI等资源的方式进行调度容量的补充。

在 ACK 中可通过设置HPACronHPA进行Pod的水平自动伸缩;通过配置 节点自动伸缩或通过虚拟节点方式可以进行ECS/ECI的自动伸缩。

前提条件


操作步骤


场景一:Pod自动伸缩

您可以通过两种方式实现Pod自动伸缩,即HPA(指标型HPA)和CronHpa(定时型HPA)。

通过HPA进行Pod自动伸缩(以基于CPU指标为例)

1、登录容器服务管理控制台,在左侧导航栏单击集群,然后单击目标集群。

2、在集群配置页的左侧导航栏,单击工作负载,然后单击右上角的使用镜像创建HPADeploy1

3、填写应用名称、副本数等信息,单击下一步HPADeploy2

4、填选镜像地址和版本等信息,单击下一步HPADeploy3

5、在高级配置选项中勾选开启容器组水平伸缩,填写相关信息后点击页面右下角创建

本例中HPA的指标设为CPU使用量,触发条件设为使用量70%HPAConfig

6、页面显示资源成功创建,单击查看应用详情HPADeploy4

容器组页签下可以看到容器处于Running状态。 HPADeploy5

此时,当Nginx的Pod的利用率超过本例中设置的70%利用率时,则会进行水平扩容。

通过CronHPA进行Pod自动伸缩

在可以准确预测流量高峰的情况下(如秒杀、促销活动),可以通过定时HPA进行Pod自动伸缩。

1、登录容器服务管理控制台,在左侧导航栏中选择市场 > 应用目录,安装ack-kubernetes-cronhpa-controller应用。

2、创建并复制以下内容到deployment_cronhpa.yml中。

---
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: nginx-deployment-basic
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
        ports:
        - containerPort: 80
---
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: nginx-deployment-basic
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3

3、执行以下命令,部署示例对象与cronhpa。

kubectl apply -f deployment_cronhpa.yaml

4、执行kubectl describe cronhpa命令,查看cronhpa状态和执行结果。

场景二:ECS自动伸缩

节点自动伸缩组件是基于kubernetes资源调度的分配情况进行伸缩判断的,节点中资源的分配是通过资源请求(Request)进行计算的。

  • 当Pod由于资源请求(Request)无法满足并进入等待(Pending)状态时,节点自动伸缩组件会根据配置的弹性伸缩组配置信息中的资源规格以及约束配置,计算所需的节点数目,如果可以满足伸缩条件,则会触发伸缩组的节点加入。
  • 当一个节点在弹性伸缩组中且节点上Pod的资源请求低于阈值时,节点自动伸缩组件会将节点进行缩容。

因此资源请求(Request)的正确、合理设置,是弹性伸缩的前提条件。具体授权与配置方式请参考节点自动伸缩

场景三:ECI自动伸缩

虚拟节点Virtual Node来源于Kubernetes社区的Virtual Kubelet技术,其实现了Kubernetes与弹性容器实例ECI的无缝连接,让Kubernetes集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。

  1. 在ACK集群中部署虚拟节点,请参见部署虚拟节点Chart
  2. 在ACK集群中安装virtual-kubelet-autoscaler应用,请参见ACK安装virtual-kubelet-autoscaler

参考文档