由於CronHPA和HPA兩者無法相互感知,如果您的應用使用YAML同時配置了CronHPA和HPA,可能會出現兩種配置獨立工作,後執行操作覆蓋了先執行操作的現象。為瞭解決這個問題,ACK提供了CronHPA相容HPA的方案——當檢測到兩者同時存在時,將HPA作為CronHPA的擴縮容對象,從而實現對該HPA定義對象(例如Deployment)的定時擴縮容。
如果您的HPA和CronHPA均通過Container Service管理主控台建立,可忽略本操作。ACK會自動為您實現相容。
從CronHPA和HPA的定義模板瞭解為什麼會產生衝突
CronHPA定義模板 | HPA定義模板 |
|
|
對比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中的minReplicas
、maxReplicas
和desiredReplicas
數值,以及HPA中scaleTargetRef
對象的當前副本數。
但CronHPA不會直接調整Deployment的副本數目,而是通過HPA來修改Deployment配置,避免HPA和CronHPA發生衝突。
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相容HPA的規則。
表格涉及欄位說明如下:
HPA(min/max):HPA定義的最小和最大的副本數(minReplicas、maxReplicas)。
CronHPA目標副本數:CronHPA任務的目標副本數。
當前副本數:應用擴縮前的副本數。
副本數:應用執行擴縮容後的副本數。
擴縮容條件 | 擴縮容結果 | 相容規則說明 | ||
HPA(min/max) | CronHPA目標副本數 | 當前副本數 | ||
1/10 | 5 | 5 |
| 當CronHPA中的目標副本數和當前副本數一致時,HPA中的minReplicas和maxReplicas以及當前的副本數無需變更。 |
1/10 | 4 | 5 |
| 當CronHPA中的目標副本數低於當前副本數時,保留當前副本數。 |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
相關文檔
關於HPA和CronHPA的詳細資料,請參見使用容器水平伸縮(HPA)、使用容器定時水平伸縮(CronHPA)。