為了更好地提升資源使用率和節省資源成本,Container Compute Service (ACS)支援通過ack-kubernetes-cronhpa-controller組件來實現資源的定時伸縮CronHPA(Cron Horizontal Pod Autoscaler),從而減少資源浪費。本文介紹如何在ACS叢集中實現容器的定時伸縮以及CronHPA相容HPA的原理。
前提條件
已建立ACS叢集。具體操作,請參見建立ACS叢集。
已使用kubectl串連Kubernetes叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
背景資訊
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描述的日期時任務將會被跳過。 說明 最小單位為天。
如您想在11月15日不運行任務,可像以下樣本一樣指定excludeDates。
|
jobs | 支援在一個
|
安裝CronHPA組件
您可以通過以下方式安裝CronHPA組件ack-kubernetes-cronhpa-controller。
登入容器計算服務控制台,在左側導覽列選擇叢集。
在叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇營運管理 > 組件管理。
在組件管理頁面單擊應用管理頁簽,找到ack-kubernetes-cronhpa-controller,單擊安裝,然後在彈出的對話方塊中,單擊確定。
如果您無需使用容器定時伸縮功能,可以刪除CronHPA組件。關於刪除CronHPA組件ack-kubernetes-cronhpa-controller的具體步驟,請參見管理組件。
建立定時伸縮CronHPA任務
為應用建立和運行CronHPA之前,請確保叢集中的CronHPA組件已正常運行,且當前應用只有一個HPA對象。關於CronHPA和HPA的相容策略,請參見下文定時伸縮CronHPA相容HPA。您可以通過以下兩種方式建立CronHPA任務。
方式一:在建立應用時建立CronHPA任務
在建立應用的進階配置頁面的伸縮配置地區,選中定時伸縮右側開啟為應用建立定時伸縮任務。關於建立應用的詳細步驟,請參見建立無狀態工作負載Deployment或者建立有狀態工作負載StatefulSet。
ACS管理主控台會自動檢查是否已安裝CronHPA組件。如果CronHPA組件未被安裝,頁面提示點擊安裝。安裝CronHPA組件後,頁面顯示定時伸縮任務的建立配置。配置參數的詳細描述如下:
配置項 | 說明 |
定時任務名稱 | 為定時任務定義名稱。每個任務的名稱是唯一的,不能與其他任務名稱重複。 |
目標副本數 | 當到達設定計劃時間時,應用副本數自動調整至該值。 |
調度周期 | 設定調度周期。 關於為定時伸縮任務設定調度周期的詳細描述,請參見predefined-schedules。 |
方式二:為已有應用建立CronHPA任務
以下步驟以無狀態應用為例,說明如何為已有應用建立CronHPA任務。
登入容器計算服務控制台,在左側導覽列選擇叢集。
在叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇
。在無狀態頁面,單擊應用右側操作列下的詳情。
單擊容器伸縮頁簽,配置定時伸縮任務。
如果CronHPA組件未被安裝,頁面提示點擊安裝。單擊點擊安裝後,進行以下步驟。
如果CronHPA組件已經安裝,直接進行以下步驟。
單擊定時伸縮(CronHPA)右側的建立,然後在建立對話方塊中,設定定時伸縮任務的建立參數。
配置項說明如下:
配置項
說明
任務名稱
為定時任務定義名稱。每個任務的名稱是唯一的,不能與其他任務名稱重複。
目標副本數
當到達設定的計劃時間時,應用副本數自動調整至該值。
調度周期
設定調度周期。關於為定時伸縮任務設定調度周期的詳細描述,請參見predefined-schedules。
添加或修改定時伸縮任務
請參見上文建立定時伸縮CronHPA任務的步驟進入容器伸縮頁面。
在容器伸縮頁簽的定時伸縮(CronHPA)地區,單擊目標任務右側操作下的任務添加或編輯。
在編輯對話方塊中,單擊新增工作進行任務建立或者單擊已有CronHPA任務進行修改,然後單擊確定。
說明您可以通過下圖所示的操作刪除CronHPA任務。在編輯對話方塊中,單擊任務名稱右上方的刪除表徵圖,然後單擊確定。
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.jobs
的crontab規則定時伸縮副本數。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.minReplicas
、spec.maxReplicas
和status.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 |
| 當CronHPA中的目標副本數和當前副本數一致時,HPA中的最大和最小副本數,以及應用當前的副本數無需變更。 |
1/10 | 4 | 5 |
| 當CronHPA中的目標副本數低於當前副本數時,保留當前副本數。 |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
表格中參數說明如下:
HPA(min/max):表示HPA定義中最小和最大的副本數值。
CronHPA:表示CronHPA設定的副本數。
Deployment:表示應該用擴縮前的副本數。
從上述看出,CronHPA不會直接調整Deployment的副本數目,而是通過HPA來操作Deployment,這樣可以避免HPA和CronHPA的衝突問題。