如果您的应用资源使用率存在周期性变化,需要按照类似Crontab的策略定时对Pod进行扩缩容,您可以使用容器定时水平伸缩CronHPA(CronHorizontal Pod Autoscaler)实现Pod的定时扩缩容。CronHPA适用于业务流量有明显高峰时段或定时任务等场景。
阅读前提示
ACK集群提供了多种工作负载伸缩(调度层弹性)和节点伸缩(资源层弹性)方案,建议您在使用本文档前阅读弹性伸缩,了解不同方案的适用场景和使用限制等。
CronHPA模板及参数介绍
CronHPA基于kubernetes-cronhpa-controller实现。kubernetes-cronhpa-controller是一个基于时间的Pod水平伸缩控制器,通过类Crontab语法配置定时弹性伸缩策略,实现业务流量周期性波动场景下的资源动态调整。CronHPA可以作用于任何支持伸缩子资源(Scale Subresource)的Kubernetes对象,例如Deployment、StatefulSet等。
步骤一:安装CronHPA组件
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理。
单击应用管理页签,找到ack-kubernetes-cronhpa-controller,按照页面提示完成组件的安装。
步骤二:创建CronHPA任务
为应用创建CronHPA任务前,请确保集群中的CronHPA组件已正常运行,且当前应用只有一个HPA任务对象。以下以无状态应用为例,介绍如何为应用开启CronHPA任务,其他工作负载类型的步骤类似。
在创建应用时创建CronHPA任务
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面,单击使用镜像创建。
在创建页面,按照页面提示完成应用基本信息配置、容器配置、服务配置和定时伸缩配置,创建一个支持CronHPA的Deployment。
具体步骤及配置项说明,请参见创建无状态工作负载Deployment。下文仅介绍主要配置项。
应用基本信息:配置应用的名称、副本数量等。
容器配置:配置镜像,并配置容器所需的CPU和内存资源。
高级配置:
在访问设置区域,单击服务(Service)对应的创建,配置Service。
在伸缩配置区域,勾选定时伸缩的开启,按照页面提示安装组件(已安装时可忽略),然后配置定时伸缩的条件和参数。
定时任务名称:CronHPA任务的名称。
目标副本数:当到达设定计划时间时,应用副本数自动伸缩至该值。
调度周期:设置调度的周期,更多信息请参见Kubernetes CronHPA Controller。
为已有应用创建CronHPA任务
在工作负载页面创建
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击目标工作负载,然后单击容器伸缩页签,在定时伸缩(CronHPA)区域,单击创建,配置CronHPA。
配置项
描述
任务名称
CronHPA任务的名称。
目标副本数
当到达设定计划时间时,应用副本数自动伸缩至该值。
调度周期
设置的调度周期。关于为CronHPA任务设置调度周期的更多信息,请参见AliyunContainerService/kubernetes-cronhpa-controller。
在工作负载伸缩页面创建
此页面目前白名单开放中。如需使用,请提交工单申请。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击工作负载伸缩。
在页面右上方,单击创建自动伸缩。
单击HPA与CronHPA页签,然后选择目标负载,在配置伸缩策略栏勾选定时自动伸缩 CronHPA。
您可以选择添加多个CronHPA任务,请按照页面提示配置CronHPA策略信息,配置完成后单击确定。
定时自动伸缩名称:自定义CronHPA的名称。
任务名称:自定义CronHPA任务的名称。
目标副本数:设置计划时间到达时应用的目标副本数。
调度周期:设置调度的周期,更多信息请参见Kubernetes CronHPA Controller。
通过kubectl创建
创建并拷贝以下内容到cronhpa.yaml文件。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: CronHorizontalPodAutoscaler metadata: name: cronhpa-sample namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic excludeDates: - "* * * 15 11 *" - "* * * * * 5" jobs: - name: "scale-down" schedule: "30 */1 * * * *" targetSize: 1 runOnce: false - name: "scale-up" schedule: "0 */1 * * * *" targetSize: 3 runOnce: true
执行以下命令,为已有工作负载创建CronHPA任务。
kubectl apply -f cronhpa.yaml
预期输出:
cronhorizontalpodautoscaler.autoscaling.alibabacloud.com/cronhpa-sample created
相关操作
查看、添加或修改CronHPA任务
CronHPA任务创建后,您可以在CronHPA列表查看CronHPA任务状态和列表。如果您想添加CronHPA任务,或修改原有CronHPA配置,您可以通过以下入口实现。
工作负载伸缩入口
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击工作负载伸缩。
单击CronHPA页签,然后在目标CronHPA任务右侧的操作列下,单击编辑。
工作负载入口(以无状态应用为例,其他工作负载类型步骤类似)
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面的操作列,单击目标Deployment对应的详情,然后单击容器伸缩页签,在定时伸缩区域的操作列,单击任务添加或编辑。
实现CronHPA与HPA的协同
由于CronHPA和HPA两者无法相互感知,如果您的应用使用YAML同时配置了CronHPA和HPA,可能会出现两种配置独立工作,后执行操作覆盖了先执行操作的现象。为了解决这个问题,ACK提供了CronHPA兼容HPA的方案——当检测到两者同时存在时,将HPA作为CronHPA的扩缩容对象,从而实现对该HPA定义对象(例如Deployment)的定时扩缩容。
详细信息,请参见实现CronHPA与HPA的协同。