全部產品
Search
文件中心

Container Compute Service:容器定時伸縮(CronHPA)

更新時間:Dec 11, 2024

為了更好地提升資源使用率和節省資源成本,Container Compute Service (ACS)支援通過ack-kubernetes-cronhpa-controller組件來實現資源的定時伸縮CronHPA(Cron Horizontal Pod Autoscaler),從而減少資源浪費。本文介紹如何在ACS叢集中實現容器的定時伸縮以及CronHPA相容HPA的原理。

前提條件

背景資訊

ack-kubernetes-cronhpa-controller是一個Kubernetes HPA Controller,按照類似Crontab的策略定時地對叢集進行擴縮容。您可以將CronHPA使用於 Kubernetes中任何支援scale子資源的對象(例如Deployment和StatefulSet)。詳細資料,請參見kubernetes-cronhpa-controller

以下樣本對CronHPA的各個欄位進行解釋說明。

apiVersion: autoscaling.alibabacloud.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
   excludeDates:
   # exclude November 15th
   - "* * * 15 11 *"
   # exclude every Friday 
   - "* * * * * 5"
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3
     runOnce: false

欄位

說明

scaleTargetRef

scaleTargetRef指定擴縮容對象。如果對象支援Scale子資源,CronHPA即可支援。

excludeDates

excludeDates是日期數組。當遇到符合excludeDates描述的日期時任務將會被跳過。

說明

最小單位為

"* * * * * *"表示"<Seconds> <Minutes> <Hours> <Day of month> <Month> <Day of week>"。

如您想在11月15日不運行任務,可像以下樣本一樣指定excludeDates

excludeDates:
  - "* * * 15 11 *"

jobs

支援在一個spec中設定多個CronHPA任務。每個CronHPA任務可以配置以下欄位:

  • name:它在一個CronHPA中應是唯一的,這樣就可以通過name來區分不同的任務。

  • schedule:它的策略和crontab類似。kubernetes-cronhpa-controller使用了Golang庫(go-cron)功能更強大的Cron,它支援更多表示規則。建立時請嚴格按照以下格式說明進行設定,否則將導致建立失敗。

    Cron運算式的格式如下:

    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  | * / , - ?
  • targetSize:設定調度時,擴縮容的Pod數目。

  • runOnce:如果runOnce設定為true,那麼任務將只執行一次,第一次執行完後即退出。

安裝CronHPA組件

您可以通過以下方式安裝CronHPA組件ack-kubernetes-cronhpa-controller。

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇營運管理組件管理

  3. 組件管理頁面單擊應用管理頁簽,找到ack-kubernetes-cronhpa-controller,單擊安裝,然後在彈出的對話方塊中,單擊確定

說明

如果您無需使用容器定時伸縮功能,可以刪除CronHPA組件。關於刪除CronHPA組件ack-kubernetes-cronhpa-controller的具體步驟,請參見管理組件

建立定時伸縮CronHPA任務

為應用建立和運行CronHPA之前,請確保叢集中的CronHPA組件已正常運行,且當前應用只有一個HPA對象。關於CronHPA和HPA的相容策略,請參見下文定時伸縮CronHPA相容HPA。您可以通過以下兩種方式建立CronHPA任務。

方式一:在建立應用時建立CronHPA任務

在建立應用的進階配置頁面的伸縮配置地區,選中定時伸縮右側開啟為應用建立定時伸縮任務。關於建立應用的詳細步驟,請參見建立無狀態工作負載Deployment或者建立有狀態工作負載StatefulSet

image.png

ACS管理主控台會自動檢查是否已安裝CronHPA組件。如果CronHPA組件未被安裝,頁面提示點擊安裝。安裝CronHPA組件後,頁面顯示定時伸縮任務的建立配置。配置參數的詳細描述如下:

配置項

說明

定時任務名稱

為定時任務定義名稱。每個任務的名稱是唯一的,不能與其他任務名稱重複。

目標副本數

當到達設定計劃時間時,應用副本數自動調整至該值。

調度周期

設定調度周期。

關於為定時伸縮任務設定調度周期的詳細描述,請參見predefined-schedules

方式二:為已有應用建立CronHPA任務

以下步驟以無狀態應用為例,說明如何為已有應用建立CronHPA任務。

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面,單擊應用右側操作列下的詳情

  4. 單擊容器伸縮頁簽,配置定時伸縮任務。

    • 如果CronHPA組件未被安裝,頁面提示點擊安裝。單擊點擊安裝後,進行以下步驟。

    • 如果CronHPA組件已經安裝,直接進行以下步驟。

  5. 單擊定時伸縮(CronHPA)右側的建立,然後在建立對話方塊中,設定定時伸縮任務的建立參數。

    create

    配置項說明如下:

    配置項

    說明

    任務名稱

    為定時任務定義名稱。每個任務的名稱是唯一的,不能與其他任務名稱重複。

    目標副本數

    當到達設定的計劃時間時,應用副本數自動調整至該值。

    調度周期

    設定調度周期。關於為定時伸縮任務設定調度周期的詳細描述,請參見predefined-schedules

添加或修改定時伸縮任務

  1. 請參見上文建立定時伸縮CronHPA任務的步驟進入容器伸縮頁面。

  2. 容器伸縮頁簽的定時伸縮(CronHPA)地區,單擊目標任務右側操作下的任務添加或編輯

  3. 編輯對話方塊中,單擊新增工作進行任務建立或者單擊已有CronHPA任務進行修改,然後單擊確定

    modify

    說明

    您可以通過下圖所示的操作刪除CronHPA任務。在編輯對話方塊中,單擊任務名稱右上方的刪除表徵圖,然後單擊確定delete

CronHPA和HPA的定義模板

CronHPA

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	
	

HPA

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
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作用的對象都是工作負載(例如Deployment或者StatefulSet等),在同一個工作負載上同時配置可能會導致衝突。為瞭解決這一問題,CronHPA支援將HPA作為其擴縮容的對象,以相容HPA原有的功能。

對比CronHPA和HPA的定義模板,可以看出:

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

  • CronHPA通過spec.jobscrontab規則定時伸縮副本數。

  • HPA通過資源使用率判斷伸縮的情況。

設想如果同時設定CronHPA和HPA,那麼會出現CronHPA和HPA同時操作同一個scaleTargetRef的情境。因為CronHPA和HPA相互獨立無法感知,所以就會出現兩個Controller各自工作,後執行的操作會覆蓋先執行的操作。

CronHPA和HPA的相容解決方案

從上文可知,當CronHPA感知到HPA的目前狀態就能解決衝突問題。為了讓CronHPA能感知HPA的目前狀態,ACS將CronHPA中的scaleTargetRef設定為HPA對象本身而不是最終的工作負載對象。CronHPA在執行擴縮容操作時會先通過HPA對象來尋找真實的scaleTargetRef,進而根據這個狀態對工作負載對象進行相應調整,有效防止相互覆蓋的情況發生,保證擴縮容操作的一致性和可預期性。

CronHPA相容HPA的定義模板如下。

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: autoscaling/v1
      kind: HorizontalPodAutoscaler
      name:  nginx-deployment-basic-hpa
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
     runOnce: false
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3
     runOnce: false

通過上述CronHPA的定義,CronHPA可以明確知曉HPA中的spec.minReplicasspec.maxReplicasstatus.desiredReplicas的數值,但是同時也知曉HPA中spec.scaleTargetRef所對應的當前Replicas值。CronHPA會通過調整HPA的方式感知HPA。CronHPA通過識別要達到的副本數與當前副本數兩者間的較大值,判斷是否需要擴縮容或修改HPA的上限;CronHPA通過識別CronHPA要達到的副本數與HPA的配置間的較小值,判斷是否需要修改HPA的下限。

以下根據不同的情境,解釋CronHPA相容HPA的規則。

HPA(min/max)

CronHPA

Deployment

擴縮容結果

相容規則說明

1/10

5

5

  • HPA(min/max):1/10

  • Deployment:5

當CronHPA中的目標副本數和當前副本數一致時,HPA中的最大和最小副本數,以及應用當前的副本數無需變更。

1/10

4

5

  • HPA(min/max):1/10

  • Deployment:5

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

1/10

6

5

  • HPA(min/max):6/10

  • Deployment:6

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

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

5/10

4

5

  • HPA(min/max):4/10

  • Deployment:5

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

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

5/10

11

5

  • HPA(min/max):11/11

  • Deployment:11

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

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

表格中參數說明如下:

  • HPA(min/max):表示HPA定義中最小和最大的副本數值。

  • CronHPA:表示CronHPA設定的副本數。

  • Deployment:表示應該用擴縮前的副本數。

從上述看出,CronHPA不會直接調整Deployment的副本數目,而是通過HPA來操作Deployment,這樣可以避免HPA和CronHPA的衝突問題。