概述
在一些复杂的业务场景下,可能有固定时间段高峰业务,又有日常突发高峰业务。此种情况下,用户既期望能定时弹性伸缩应对固定时间段高峰业务,又期望能根据指标弹性伸缩应对日常突发高峰业务。CCE提供CronHPA的自定义资源,实现在固定时间段对集群进行扩缩容,并且可以和HPA策略共同作用,定时调整HPA伸缩范围,实现复杂场景下的工作负载伸缩。
前提条件
您已创建集群,请参照 快速入门->创建一个集群内容进行创建。
已安装 cube-cronhpa 最新版本插件。
使用CronHPA直接调整Deployment实例数量
CronHPA可以单独调整关联Deployment,定时调整Deployment的实例数,使用方法如下。
apiVersion: autoscaling.ctyun.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
jobs:
- name: "scale-a"
schedule: "30 6 * * * *"
targetSize: 1
- name: "scale-b"
schedule: "01 30 * * * *"
targetSize: 3
CronHPA关键字段说明
字段 | 说明 |
---|---|
apiVersion | API版本,固定值 autoscaling.ctyun.com/v1beta1 |
kind | API类型,固定值 CronHorizontalPodAutoscaler |
metadata.name | CronHPA策略名称。 |
metadata.labels | 策略标签 |
metadata.namespace | CronHPA策略所在的命名空间。 |
spec.scaleTargetRef | 指定CronHPA的扩缩容对象,可配置以下字段: apiVersion:CronHPA扩缩容对象的API版本。 kind:CronHPA扩缩容对象的API类型。 name:CronHPA扩缩容对象的名称。CronHPA支持HPA策略或Deployment。 |
spec.jobs | CronHPA策略规则,可添加多个规则。每个规则可配置以下字段: name:CronHPA规则名称,该名称需唯一。 schedule:指定任务运行时间与周期,参数格式与go-cron类似,请参见下表。 targetSize:扩缩容的Pod数目。 disable:参数值为“true”或“false”。其中“false”表示该规则生效,“true”则表示该规则不生效。 |
该插件使用的 schedule 时间格式为 go-cron 库,一共是6位,都是强制填写。具体格式如下:
Field name | Mandatory? | Allowed values | Allowed special characters
---------- | ---------- | -------------- | --------------------------
Seconds | Yes | 0-59 | * / , -
Minutes | Yes | 0-59 | * / , -
Hours | Yes | 0-23 | * / , -
Day of month | Yes | 1-31 | * / , - ?
Month | Yes | 1-12 or JAN-DEC | * / , -
Day of week | Yes | 0-6 or SUN-SAT | * / , - ?
使用CronHPA调整HPA伸缩范围
CronHPA支持定时调整HPA策略的最大和最小实例数,满足复杂场景下的工作负载伸缩。
由于HPA与CronHPA均通过scaleTargetRef字段来获取伸缩对象,如果CronHPA和HPA同时设置Deployment为伸缩对象,两个伸缩策略相互独立,后执行的操作会覆盖先执行的操作,导致伸缩效果不符合预期,因此需避免这种情况发生。
当CronHPA与HPA兼容使用时,需要将CronHPA中的scaleTargetRef字段设置为HPA策略,而HPA策略的scaleTargetRef字段设置为Deployment,这样CronHPA策略会在固定的时间调整HPA策略的实例数量上下限,即可实现工作负载定时伸缩和弹性伸缩的兼容。
步骤 1 为Deployment创建HPA策略。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deployment-basic-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 32
步骤 2 创建CronHPA策略,并关联步骤1中创建的HPA策略。
apiVersion: autoscaling.ctyun.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
spec:
scaleTargetRef:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
name: nginx-deployment-basic-hpa
jobs:
- name: "scale-a"
schedule: "0 51 * * * *"
targetSize: 1
- name: "scale-b"
schedule: "0 58 * * * *"
targetSize: 3
在CronHPA与HPA共同使用时,CronHPA规则是在HPA策略的基础上生效的,CronHPA不会直接调整Deployment的副本数目,而是通过HPA来操作Deployment,因此了解以下参数可帮助您更好地理解其工作原理。
CronHPA的目标实例数(targetReplicas):表示CronHPA设定的实例数,在CronHPA生效时用于调整HPA的最大/最小实例数,从而间接调整Deployment实例数。
HPA的最小实例数(minReplicas):Deployment的实例数下限。
HPA的最大实例数(maxReplicas):Deployment的实例数上限。
Deployment的实例数(replicas):CronHPA策略生效之前Deployment的Pod数量。
在CronHPA规则生效时,通过比较目标实例数(targetReplicas)与实际Deployment的实例数,并结合HPA的最小实例数或最小实例数的数值大小,来调整Deployment实例数的上下限值。
下表格以举例的形式说明了不同场景下CronHPA修改HPA的情况。
扩缩容条件 | 扩缩容结果 | 兼容规则说明 | ||
HPA(min/max) | CronHPA目标副本数 | 当前副本数 | ||
1/10 | 5 | 5 |
| 当CronHPA中的目标副本数和当前副本数一致时,HPA中的minReplicas和maxReplicas以及当前的副本数无需变更。 |
1/10 | 4 | 5 |
| 当CronHPA中的目标副本数低于当前副本数时,保留当前副本数。 |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
创建定时伸缩任务
登录云容器引擎控制台,选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 -> 无状态。
在无状态页面,单击应用右侧“更多”操作列下的弹性伸缩。
如果 cube-cronhpa 组件未被安装,页面提示点击安装。单击点击安装后,然后进行以下步骤。
点击 CronHPA 策略的启用策略,添加策略规则.