容器定時伸縮(CronHPA)
應(yīng)對資源浪費的場景,阿里云服務(wù)容器提供kubernetes-cronhpa-controller組件,實現(xiàn)資源定時擴容。本文介紹如何實現(xiàn)容器的定時伸縮,及介紹定時伸縮CronHPA兼容HPA的原理。
前提條件
您已創(chuàng)建集群,詳細信息,請參見創(chuàng)建Kubernetes托管版集群、創(chuàng)建ASK集群。
已在本地計算機上安裝Helm,且Helm版本≥v2.11.0。具體操作,請參見Install Helm。
已通過kubectl工具連接集群。具體操作,請參見通過kubectl連接Kubernetes集群。
背景信息
kubernetes-cronhpa-controller是一個Kubernetes HPA Controller,按照類似Crontab的策略定時地對集群進行擴縮容。您可以把CronHorizontalPodAutoscaler(以下簡稱CronHPA)用在任何Kubernetes中定義的對象上,只要該對象支持伸縮子資源(如Deployment和StatefulSet)的項目已在GitHub開源。
以下舉例對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是日期數(shù)組。當(dāng)遇到符合excludeDates描述的日期時任務(wù)將會被跳過。 說明 最小單位為天。
如您想在11月15日不運行任務(wù),可像以下示例一樣指定excludeDates。
|
jobs | 支持在一個spec中設(shè)定多個CronHPA任務(wù)。每個CronHPA任務(wù)可以配置以下字段:
|
安裝CronHPA組件
您可以通過以下方式安裝CronHPA組件ack-kubernetes-cronhpa-controller。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在組件管理頁面單擊應(yīng)用管理頁簽,找到ack-kubernetes-cronhpa-controller,然后單擊安裝。
如果您無需使用容器定時伸縮功能,可以刪除CronHPA組件。關(guān)于刪除CronHPA組件ack-kubernetes-cronhpa-controller的具體步驟,請參見管理組件或基于Helm的發(fā)布管理。
創(chuàng)建定時伸縮CronHPA任務(wù)
為應(yīng)用創(chuàng)建和運行CronHPA前,請確保集群中的CronHPA組件已正常運行,且當(dāng)前應(yīng)用只有一個HPA對象。關(guān)于CronHPA和HPA的兼容策略,請參見下文的定時伸縮CronHPA兼容HPA。您可以在以下兩種場景中創(chuàng)建CronHPA任務(wù)。
場景一:在創(chuàng)建應(yīng)用時創(chuàng)建CronHPA任務(wù)
在創(chuàng)建應(yīng)用的高級配置頁面的伸縮配置區(qū)域,選中定時伸縮右側(cè)開啟為應(yīng)用創(chuàng)建定時伸縮任務(wù)。關(guān)于創(chuàng)建應(yīng)用的詳細步驟,請參見創(chuàng)建無狀態(tài)工作負(fù)載Deployment或者創(chuàng)建有狀態(tài)工作負(fù)載StatefulSet。
容器服務(wù)管理控制臺會自動檢查是否已安裝CronHPA組件。如果CronHPA組件未被安裝,頁面提示點擊安裝。安裝CronHPA組件后,頁面顯示定時伸縮任務(wù)的創(chuàng)建配置。配置參數(shù)的詳細描述如下:
參數(shù) | 描述 |
定時任務(wù)名稱 | 為定時任務(wù)定義名稱。每個任務(wù)的名稱是唯一的,不能與其他任務(wù)名稱重復(fù)。 |
目標(biāo)副本數(shù) | 當(dāng)?shù)竭_設(shè)定計劃時間時,應(yīng)用副本數(shù)自動伸縮至該值。 |
調(diào)度周期 | 設(shè)置調(diào)度周期。 關(guān)于為定時伸縮任務(wù)設(shè)置調(diào)度周期的詳細描述,請參見AliyunContainerService/kubernetes-cronhpa-controller。 |
場景二:為已有應(yīng)用創(chuàng)建CronHPA任務(wù)
本文以為無狀態(tài)應(yīng)用創(chuàng)建定時伸縮任務(wù)為例,說明如何為已有應(yīng)用創(chuàng)建CronHPA任務(wù)。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在無狀態(tài)頁面,單擊應(yīng)用右側(cè)操作列下的詳情。
單擊容器伸縮頁簽,配置定時伸縮任務(wù)。
如果CronHPA組件未被安裝,頁面提示點擊安裝。單擊點擊安裝后,然后進行以下步驟。
如果CronHPA組件已被安裝,直接進行以下步驟。
單擊定時伸縮(CronHPA)右側(cè)創(chuàng)建,然后在創(chuàng)建對話框中,設(shè)置定時伸縮任務(wù)的創(chuàng)建參數(shù)。
配置參數(shù)的詳細描述如下:
參數(shù)
描述
任務(wù)名稱
為定時任務(wù)定義名稱。每個任務(wù)的名稱是唯一的,不能與其他任務(wù)名稱重復(fù)。
目標(biāo)副本數(shù)
當(dāng)?shù)竭_設(shè)定計劃時間時,應(yīng)用副本數(shù)自動伸縮至該值。
調(diào)度周期
設(shè)置調(diào)度周期。
關(guān)于為定時伸縮任務(wù)設(shè)置調(diào)度周期的詳細描述,請參見AliyunContainerService/kubernetes-cronhpa-controller。
添加或修改定時伸縮任務(wù)
請參見上文創(chuàng)建定時伸縮CronHPA任務(wù)的步驟進入容器伸縮頁面。
在容器伸縮頁簽的定時伸縮(CronHPA)區(qū)域,單擊目標(biāo)任務(wù)右側(cè)操作下的任務(wù)添加或編輯。
在編輯對話框中,單擊添加任務(wù)進行任務(wù)創(chuàng)建或者單擊已有CronHPA任務(wù)進行修改,然后單擊確定。
您可以進行以下操作刪除CronHPA任務(wù)。
在編輯對話框中,單擊任務(wù)名稱右上角的刪除圖標(biāo),然后單擊確定。
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通過設(shè)置定時的方式觸發(fā)容器的水平副本伸縮。為了防止突發(fā)的流量沖擊等狀況,您可能已經(jīng)或者打算配置HPA保障應(yīng)用的正常運行。如果同時檢測到了HPA和CronHPA的存在,阿里云容器服務(wù)ACK會將HPA作為定時伸縮CronHPA的擴縮容對象,從而實現(xiàn)對該HPA定義的Deployment對象的定時擴縮容。
對比CronHPA和HPA的定義模板,可以看出:
CronHPA和HPA都是通過scaleTargetRef字段來獲取伸縮對象。
CronHPA通過jobs的crontab規(guī)則定時伸縮副本數(shù)。
HPA通過資源利用率判斷伸縮的情況。
設(shè)想如果同時設(shè)置CronHPA和HPA,那么會出現(xiàn)CronHPA和HPA同時操作一個scaleTargetRef的場景。因為CronHPA和HPA相互獨立無法感知,所以就會出現(xiàn)兩個Controller各自工作,后執(zhí)行的操作會覆蓋先執(zhí)行的操作。
CronHPA和HPA的兼容解決方案
從上文可知,CronHPA和HPA同時使用會導(dǎo)致后執(zhí)行的操作覆蓋先執(zhí)行操作的本質(zhì)原因是兩個controller無法相互感知,那么只需要讓CronHPA感知HPA的當(dāng)前狀態(tài)就能解決沖突問題。HPA的定義將Deployment配置在scaleTargetRef字段下,然后Deployment通過自身定義查找ReplicaSet,最后通過ReplicaSet調(diào)整真實的副本數(shù)目。阿里云容器服務(wù)ACK將CronHPA中的scaleTargetRef設(shè)置為HPA對象,然后通過HPA對象來尋找真實的scaleTargetRef,從而讓CronHPA感知HPA的當(dāng)前狀態(tài)。
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中的minReplicas、maxReplicas、desiredReplicas的數(shù)值,但是同時也知曉HPA中scaleTargetRef所對應(yīng)的當(dāng)前Relicas值。CronHPA會通過調(diào)整HPA的方式感知HPA。CronHPA通過識別要達到的副本數(shù)與當(dāng)前副本數(shù)兩者間的較大值,判斷是否需要擴縮容及修改HPA的上限;CronHPA通過識別CronHPA要達到的副本數(shù)與HPA的配置間的較小值,判斷是否需要修改HPA的下限。
以下根據(jù)不同的場景,解釋CronHPA兼容HPA的規(guī)則。
HPA(min/max) | Cronhpa | Deployment | 擴縮結(jié)果 | 兼容規(guī)則說明 |
1/10 | 5 | 5 |
| 當(dāng)CronHPA中的目標(biāo)副本數(shù)和當(dāng)前副本數(shù)一致時,HPA中的最大和最小副本數(shù),還有應(yīng)用當(dāng)前的副本數(shù)無需變更。 |
1/10 | 4 | 5 |
| 當(dāng)CronHPA中的目標(biāo)副本數(shù)低于當(dāng)前副本數(shù)時,保留當(dāng)前副本數(shù)。 |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
表格中參數(shù)說明如下:
HPA(min/max):表示HPA定義中最小和最大的副本數(shù)值。
CronHPA:表示CronHPA任務(wù)設(shè)定的副本數(shù)。
Deployment:表示應(yīng)用擴縮前的副本數(shù)。
從上述看出,CronHPA不會直接調(diào)整Deployment的副本數(shù)目,而是通過HPA來操作Deployment,這樣可以避免HPA和CronHPA的沖突問題。
常見問題
如何卸載ack-kubernetes-cronhpa-controller組件?
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在Helm頁面,查看是否存在ack-kubernetes-cronhpa-controller組件。
如果存在,請單擊該組件右側(cè)操作列下的刪除。
重要通過Helm方式刪除該組件,不會刪除CRD和已創(chuàng)建的Task資源,如需徹底刪除CronHPA相關(guān)資源,請手動刪除。
如果不存在,請轉(zhuǎn)下一步。
在集群管理頁左側(cè)導(dǎo)航欄,選擇 。
在組件管理頁面,找到ack-kubernetes-cronhpa-controller組件,單擊右下方的卸載。