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