概述
在一些復雜的業務場景下,可能有固定時間段高峰業務,又有日常突發高峰業務。此種情況下,用戶既期望能定時彈性伸縮應對固定時間段高峰業務,又期望能根據指標彈性伸縮應對日常突發高峰業務。CCE提供CronHPA的自定義資源,實現在固定時間段對集群進行擴縮容,并且可以和HPA策略共同作用,定時調整HPA伸縮范圍,實現復雜場景下的工作負載伸縮。

CronHPA支持定時調整HPA策略的最大和最小實例數,也可以直接定時調整Deployment的Pod實例數。
CronHPA的YAML示例如下:
apiVersion: autoscaling.cce.io/v2alpha1
kind: CronHorizontalPodAutoscaler
metadata:
name: ccetest
namespace: default
spec:
scaleTargetRef: # 關聯HPA策略或Deployment
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
name: hpa-test
rules:
- ruleName: "scale-down"
schedule: "15 * * * *" # 指定任務運行時間與周期,參數格式請參見Cron,例如0 * * * * 或@hourly。
targetReplicas: 1 # 目標實例數量
disable: false
- ruleName: "scale-up"
schedule: "13 * * * *"
targetReplicas: 6
disable: false
表 CronHPA關鍵字段說明
| 字段 | 說明 |
|---|---|
| apiVersion | API版本,固定值“autoscaling.cce.io/v2alpha1”。 |
| kind | API類型,固定值“CronHorizontalPodAutoscaler”。 |
| metadata.name | CronHPA策略名稱。 |
| metadata.namespace | CronHPA策略所在的命名空間。 |
| spec.scaleTargetRef | 指定CronHPA的擴縮容對象,可配置以下字段: apiVersion:CronHPA擴縮容對象的API版本。 kind:CronHPA擴縮容對象的API類型。 name:CronHPA擴縮容對象的名稱。CronHPA支持HPA策略或Deployment。 |
| spec.rules | CronHPA策略規則,可添加多個規則。每個規則可配置以下字段: ruleName:CronHPA規則名稱,該名稱需唯一。 schedule:指定任務運行時間與周期,參數格式與CronTab類似,請參見,例如0 * * * * 或@hourly。 targetReplicas:擴縮容的Pod數目。 disable:參數值為“true”或“false”。其中“false”表示該規則生效,“true”則表示該規則不生效。 |
前提條件
已安裝1.2.13及以上版本cce-hpa-controller。
使用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/v1
kind: HorizontalPodAutoscaler
metadata:
name: hpa-test
namespace: default
spec:
maxReplicas: 10 # 最大實例數
minReplicas: 5 # 最小實例數
scaleTargetRef: # 關聯Deployment
apiVersion: apps/v1
kind: Deployment
name: nginx
targetCPUUtilizationPercentage: 50
步驟 2 創建CronHPA策略,并關聯步驟1中創建的HPA策略。
apiVersion: autoscaling.cce.io/v2alpha1
kind: CronHorizontalPodAutoscaler
metadata:
name: ccetest
namespace: default
spec:
scaleTargetRef: # 關聯HPA策略
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
name: hpa-test
rules:
- ruleName: "scale-down"
schedule: "15 * * * *" # 指定任務運行時間與周期,參數格式請參見Cron,例如0 * * * * 或@hourly。
targetReplicas: 1 # 目標實例數量
disable: false
- ruleName: "scale-up"
schedule: "13 * * * *"
targetReplicas: 11
disable: false
在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擴縮容場景

上圖為可能存在的擴縮容場景,如下表格以舉例的形式說明了不同場景下CronHPA修改HPA的情況。
| 場景 | 場景說明 | Cronhpa (targetReplicas) |
Deployment (replicas) |
HPA (minReplicas / maxReplicas) |
最終結果 | 操作說明 |
|---|---|---|---|---|---|---|
| 場景一 | targetReplicas< minReplicas ≤ replicas ≤ maxReplicas |
4 | 5 | 5/10 | HPA: 4/10 Deployment: 5 |
CronHPA目標實例數低于HPA最小實例數(minReplicas)時: 修改HPA的最小實例數。 Deployment實例數無修改。 |
| 場景二 | targetReplicas= minReplicas ≤ replicas ≤ maxReplicas |
5 | 6 | 5/10 | HPA: 5/10 Deployment: 6 |
CronHPA目標實例數等于HPA最小實例數(minReplicas)時: HPA的最小實例數無修改。 Deployment實例數無修改。 |
| 場景三 | minReplicas < targetReplicas< replicas ≤ maxReplicas |
4 | 5 | 1/10 | HPA: 4/10 Deployment: 5 |
CronHPA目標實例數大于HPA最小實例數(minReplicas), 小于Deployment實例數(replicas)時: 修改HPA的最小實例數。 Deployment實例數無修改。 |
| 場景四 | minReplicas < targetReplicas = replicas < maxReplicas |
5 | 5 | 1/10 | HPA: 5/10 Deployment: 5 |
CronHPA目標實例數大于HPA最小實例數(minReplicas), 等于Deployment實例數(replicas)時: 修改HPA的最小實例數。 Deployment實例數無修改。 |
| 場景五 | minReplicas ≤ replicas < targetReplicas < maxReplicas |
6 | 5 | 1/10 | HPA: 6/10 Deployment: 6 |
CronHPA目標實例數大于Deployment實例數(replicas), 小于HPA最大實例數(maxReplicas)時: 修改HPA的最小實例數。 修改Deployment實例數。 |
| 場景六 | minReplicas ≤ replicas < targetReplicas = maxReplicas |
10 | 5 | 1/10 | HPA: 10/10 Deployment: 10 |
CronHPA目標實例數大于Deployment實例數(replicas), 等于HPA最大實例數(maxReplicas)時: 修改HPA的最小實例數。 修改Deployment實例數。 |
| 場景七 | minReplicas ≤ replicas ≤ maxReplicas < targetReplicas |
11 | 5 | 5/10 | HPA: 11/11 Deployment: 11 |
CronHPA目標實例數大于HPA最大實例數(maxReplicas)時: 修改HPA的最小實例數。 修改HPA的最大實例數。 修改Deployment實例數。 |
使用CronHPA直接調整Deployment實例數量
CronHPA還可以單獨調整關聯Deployment,定時調整Deployment的實例數,使用方法如下。
piVersion: autoscaling.cce.io/v2alpha1
kind: CronHorizontalPodAutoscaler
metadata:
name: ccetest
namespace: default
spec:
scaleTargetRef: # 關聯Deployment
apiVersion: apps/v1
kind: Deployment
name: nginx
rules:
- ruleName: "scale-down"
schedule: "08 * * * *" # 指定任務運行時間與周期,參數格式請參見Cron,例如0 * * * * 或@hourly。
targetReplicas: 1
disable: false
- ruleName: "scale-up"
schedule: "05 * * * *"
targetReplicas: 3
disable: false