实现CronHPA与HPA的协同配置

由于CronHPAHPA两者无法相互感知,如果您的应用使用YAML同时配置了CronHPAHPA,可能会出现两种配置独立工作,后执行操作覆盖了先执行操作的现象。为了解决这个问题,ACK提供了CronHPA兼容HPA的方案——当检测到两者同时存在时,将HPA作为CronHPA的扩缩容对象,从而实现对该HPA定义对象(例如Deployment)的定时扩缩容。

说明

如果您的HPACronHPA均通过容器服务管理控制台创建,可忽略本操作。ACK会自动为您实现兼容。

CronHPAHPA的定义模板了解为什么会产生冲突

CronHPA定义模板

HPA定义模板

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: 11	
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-sample
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment-basic
  minReplicas: 4
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50	

对比CronHPAHPA的定义模板,可以发现:

  • CronHPAHPA都是通过scaleTargetRef字段来获取伸缩对象。

  • CronHPA通过jobscrontab规则定时伸缩副本数。

  • HPA通过资源(Resource)利用率判断伸缩的情况。

因此,如果应用同时配置了CronHPAHPA,CronHPAHPA可能会同时操作一个scaleTargetRef(即伸缩对象)。为了解决这个问题,需要使CronHPA能够感知HPA的当前状态。

解决方案

方案原理

为了解决CronHPAHPA无法相互感知的问题,ACK支持将HPA作为CronHPA的扩缩容对象。在HPA的定义模板中,HPADeployment配置在scaleTargetRef字段下,Deployment再通过自身的定义查找ReplicaSet,ReplicaSet再调整真实的副本数量。

通过将HPA作为CronHPAscaleTargetRef,CronHPA可以明确知晓并综合考虑CronHPA任务当前的目标副本数,HPA中的minReplicasmaxReplicasdesiredReplicas数值,以及HPAscaleTargetRef对象的当前副本数。

CronHPA不会直接调整Deployment的副本数目,而是通过HPA来修改Deployment配置,避免HPACronHPA发生冲突。

image

配置示例

您需要将CronHPAscaleTargetRef字段修改为已有的HPA内容,以上文中HPA模板为例,CronHPA兼容HPA的重点修改内容如下:

未兼容HPA的配置

需要修改为如下兼容HPA的配置

scaleTargetRef:
   apiVersion: apps/v1
   kind: Deployment
   name: nginx-deployment-basic
scaleTargetRef:
   apiVersion: autoscaling/v2
   # 设置为HPA资源类型
   kind: HorizontalPodAutoscaler
   # 设置为HPA资源的名称
   name:  hpa-sample 

假设您有一个名为hpa-sampleHPA资源用于应对日常的负载波动,您每天的业务时间为早上9点到下午5点,您可以在已有HPA的基础上设置一个CronHPA的定时任务,每天早上9点将副本数量调高应对高峰期的负载,每天下午5点将副本数调低,以减少资源浪费。

完整的CronHPA配置模板如下(需要兼容HPA):

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:    # 设置为HPA资源内容
      apiVersion: autoscaling/v2
      kind: HorizontalPodAutoscaler
      name: hpa-sample 
   jobs:
   - name: "scale-up-9am"  
     schedule: "0 9 * * * "
     targetSize: 20
     runOnce: false
   - name: "scale-down-5pm"   
     schedule: "0 17 * *  *"
     targetSize: 3
     runOnce: false

兼容规则说明

以下根据不同的场景,说明CronHPA兼容HPA的规则。

说明

表格涉及字段说明如下:

  • HPA(min/max):HPA定义的最小和最大的副本数(minReplicas、maxReplicas)。

  • CronHPA目标副本数:CronHPA任务的目标副本数。

  • 当前副本数:应用扩缩前的副本数。

  • 副本数:应用执行扩缩容后的副本数。

扩缩容条件

扩缩容结果

兼容规则说明

HPA(min/max)

CronHPA目标副本数

当前副本数

1/10

5

5

  • HPA(min/max):1/10

  • 副本数:5

CronHPA中的目标副本数和当前副本数一致时,HPA中的minReplicasmaxReplicas以及当前的副本数无需变更。

1/10

4

5

  • HPA(min/max):1/10

  • 副本数:5

CronHPA中的目标副本数低于当前副本数时,保留当前副本数。

1/10

6

5

  • HPA(min/max):6/10

  • 副本数:6

  • CronHPA中的目标副本数高于当前副本数时,保留CronHPA的目标副本数。

  • CronHPA目标副本数高于HPAminReplicas时,修改HPA的副本数下限。

5/10

4

5

  • HPA(min/max):4/10

  • 副本数:5

  • CronHPA中的目标副本数低于当前副本数时,保留当前应用副本数。

  • CronHPA目标副本数低于HPAminReplicas时,修改HPA的副本数下限。

5/10

11

5

  • HPA(min/max):11/11

  • 副本数:11

  • CronHPA中的目标副本数高于当前副本数时,保留CronHPA的目标副本数。

  • CronHPA目标副本数高于HPAmaxReplicas时,修改HPA的副本数上限。

相关文档

关于HPACronHPA的详细信息,请参见使用容器水平伸缩(HPA)使用容器定时水平伸缩(CronHPA)