全部產品
Search
文件中心

Container Service for Kubernetes:實現CronHPA與HPA的協同配置

更新時間:Mar 27, 2025

由於CronHPA和HPA兩者無法相互感知,如果您的應用使用YAML同時配置了CronHPA和HPA,可能會出現兩種配置獨立工作,後執行操作覆蓋了先執行操作的現象。為瞭解決這個問題,ACK提供了CronHPA相容HPA的方案——當檢測到兩者同時存在時,將HPA作為CronHPA的擴縮容對象,從而實現對該HPA定義對象(例如Deployment)的定時擴縮容。

說明

如果您的HPA和CronHPA均通過Container Service管理主控台建立,可忽略本操作。ACK會自動為您實現相容。

從CronHPA和HPA的定義模板瞭解為什麼會產生衝突

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	

對比CronHPA和HPA的定義模板,可以發現:

  • CronHPA和HPA都是通過scaleTargetRef欄位來擷取伸縮對象。

  • CronHPA通過jobs的crontab規則定時伸縮副本數。

  • HPA通過資源(Resource)利用率判斷伸縮的情況。

因此,如果應用同時配置了CronHPA和HPA,CronHPA和HPA可能會同時操作一個scaleTargetRef(即伸縮對象)。為瞭解決這個問題,需要使CronHPA能夠感知HPA的目前狀態。

解決方案

方案原理

為瞭解決CronHPA和HPA無法相互感知的問題,ACK支援將HPA作為CronHPA的擴縮容對象。在HPA的定義模板中,HPA將Deployment配置在scaleTargetRef欄位下,Deployment再通過自身的定義尋找ReplicaSet,ReplicaSet再調整真實的副本數量。

通過將HPA作為CronHPA的scaleTargetRef,CronHPA可以明確知曉並綜合考慮CronHPA任務當前的目標副本數,HPA中的minReplicasmaxReplicasdesiredReplicas數值,以及HPA中scaleTargetRef對象的當前副本數。

但CronHPA不會直接調整Deployment的副本數目,而是通過HPA來修改Deployment配置,避免HPA和CronHPA發生衝突。

配置樣本

您需要將CronHPA的scaleTargetRef欄位修改為已有的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-sample的HPA資源用於應對日常的負載波動,您每天的業務時間為早上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 0 9 * * * "
     targetSize: 20
     runOnce: false
   - name: "scale-down-5pm"   
     schedule: "0 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中的minReplicas和maxReplicas以及當前的副本數無需變更。

1/10

4

5

  • HPA(min/max):1/10

  • 副本數:5

當CronHPA中的目標副本數低於當前副本數時,保留當前副本數。

1/10

6

5

  • HPA(min/max):6/10

  • 副本數:6

  • 當CronHPA中的目標副本數高於當前副本數時,保留CronHPA的目標副本數。

  • CronHPA目標副本數高於HPA的minReplicas時,修改HPA的副本數下限。

5/10

4

5

  • HPA(min/max):4/10

  • 副本數:5

  • 當CronHPA中的目標副本數低於當前副本數時,保留當前應用副本數。

  • 當CronHPA目標副本數低於HPA的minReplicas時,修改HPA的副本數下限。

5/10

11

5

  • HPA(min/max):11/11

  • 副本數:11

  • 當CronHPA中的目標副本數高於當前副本數時,保留CronHPA的目標副本數。

  • 當CronHPA目標副本數高於HPA的maxReplicas時,修改HPA的副本數上限。

相關文檔

關於HPA和CronHPA的詳細資料,請參見使用容器水平伸縮(HPA)使用容器定時水平伸縮(CronHPA)