全部產品
Search
文件中心

Container Service for Kubernetes:使用容器定時伸縮(CronHPA)

更新時間:Jul 15, 2025

如果您的應用資源使用率存在周期性變化,需要按照類似Crontab的策略定時對Pod進行擴縮容,您可以使用容器定時水平伸縮CronHPA(CronHorizontal Pod Autoscaler)實現Pod的定時擴縮容。CronHPA適用於業務流量有明顯高峰時段或定時任務等情境。

閱讀前提示

ACK叢集提供了多種工作負載伸縮(調度層彈性)和節點伸縮(資源層彈性)方案,建議您在使用本文檔前閱讀Auto Scaling,瞭解不同方案的適用情境和使用限制等。

CronHPA模板及參數介紹

CronHPA基於kubernetes-cronhpa-controller實現。kubernetes-cronhpa-controller是一個基於時間的Pod水平伸縮控制器,通過類Crontab文法配置定時Auto Scaling策略,實現業務流量周期性波動情境下的資源動態調整。CronHPA可以作用於任何支援伸縮子資源(Scale Subresource)的Kubernetes對象,例如Deployment、StatefulSet等。

展開查看樣本及涉及的參數

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:                 # 任務排除日期(Cron 格式),以下日期不執行擴縮容
  - "* * * 15 11 *"             # 排除11月15日
  - "* * * * * 5"               # 排除星期五
  jobs:
  - name: "scale-down"
    schedule: "30 */1 * * * *"  # 每分鐘的第30秒觸發一次(如 08:00:30, 08:01:30)。
    targetSize: 1               # 目標副本數
    runOnce: false              # 任務執行模式(是否僅運行一次),預設false
  - name: "scale-up"
    schedule: "0 */1 * * * *"  # 每分鐘的第0秒觸發一次(如 08:00:00, 08:01:00)。
    targetSize: 3              # 目標副本數
    runOnce: false             

CronHPA配置涉及的參數如下。

參數

說明

scaleTargetRef

指定擴縮容的對象。如果對象支援伸縮子資源(Scale Subresource),CronHPA即可支援。

excludeDates

日期數組。當遇到符合excludeDates描述的日期時任務將會被跳過。最小單位為天。

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

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

excludeDates:
  - "* * * 15 11 *"

jobs

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

  • name:CronHPA的任務名稱。

  • schedule:kubernetes-cronhpa-controller(基於go-cron庫)文法與標準Crontab類似,但支援更靈活的運算式。建立時請嚴格按照以下格式說明進行設定。

    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:設定為true時,任務將只執行一次,第一次執行完則退出(Exit)。

步驟一:安裝CronHPA組件

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 單擊應用管理頁簽,找到ack-kubernetes-cronhpa-controller,按照頁面提示完成組件的安裝。

步驟二:建立CronHPA任務

為應用建立CronHPA任務前,請確保叢集中的CronHPA組件已正常運行,且當前應用只有一個HPA任務對象。以下以無狀態應用為例,介紹如何為應用開啟CronHPA任務,其他工作負載類型的步驟類似。

在建立應用時建立CronHPA任務

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

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

  3. 無狀態頁面,單擊使用鏡像建立

  4. 建立頁面,按照頁面提示完成應用基本資料配置、容器配置、服務配置和定時伸縮配置,建立一個支援CronHPA的Deployment。

    具體步驟及配置項說明,請參見建立無狀態工作負載Deployment。下文僅介紹主要配置項。

    • 應用基本資料:配置應用的名稱、副本數量等。

    • 容器配置:配置鏡像,並配置容器所需的CPU和記憶體資源。

    • 進階配置

      • 訪問設定地區,單擊服務(Service)對應的建立,配置Service。

      • 伸縮配置地區,勾選定時伸縮開啟,按照頁面提示安裝組件(已安裝時可忽略),然後配置定時伸縮的條件和參數。

        • 定時任務名稱:CronHPA任務的名稱。

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

        • 調度周期:設定調度的周期,更多資訊請參見Kubernetes CronHPA Controller

為已有應用建立CronHPA任務

在工作負載頁面建立

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

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

  3. 單擊目標工作負載,然後單擊容器伸縮頁簽,在定時伸縮(CronHPA)地區,單擊建立,配置CronHPA。

    create

    配置項

    描述

    任務名稱

    CronHPA任務的名稱。

    目標副本數

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

    調度周期

    設定的調度周期。關於為CronHPA任務設定調度周期的更多資訊,請參見AliyunContainerService/kubernetes-cronhpa-controller

在工作負載伸縮頁面建立

說明

此頁面目前白名單開放中。如需使用,請提交工單申請。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊工作負載伸縮

  3. 在頁面右上方,單擊建立自動調整

  4. 單擊HPA與CronHPA頁簽,然後選擇目標負載,在配置伸縮策略欄勾選定時自動調整 CronHPA

    您可以選擇添加多個CronHPA任務,請按照頁面提示配置CronHPA策略資訊,配置完成後單擊確定

    • 定時自動調整名稱:自訂CronHPA的名稱。

    • 任務名稱:自訂CronHPA任務的名稱。

    • 目標副本數:設定計劃時間到達時應用的目標副本數。

    • 調度周期:設定調度的周期,更多資訊請參見Kubernetes CronHPA Controller

通過kubectl建立

  1. 建立並拷貝以下內容到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         
  2. 執行以下命令,為已有工作負載建立CronHPA任務。

    kubectl apply -f cronhpa.yaml

    預期輸出:

    cronhorizontalpodautoscaler.autoscaling.alibabacloud.com/cronhpa-sample created

相關操作

查看、添加或修改CronHPA任務

CronHPA任務建立後,您可以在CronHPA列表查看CronHPA任務狀態和列表。如果您想添加CronHPA任務,或修改原有CronHPA配置,您可以通過以下入口實現。

  • 工作負載伸縮入口

    1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊工作負載伸縮

    2. 單擊CronHPA頁簽,然後在目標CronHPA任務右側的操作列下,單擊編輯

  • 工作負載入口(以無狀態應用為例,其他工作負載類型步驟類似)

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

    2. 無狀態頁面的操作列,單擊目標Deployment對應的詳情,然後單擊容器伸縮頁簽,在定時伸縮地區的操作列,單擊任務添加或編輯

實現CronHPA與HPA的協同

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

詳細資料,請參見實現CronHPA與HPA的協同