如何使用KEDA自動縮放Azure管道代理
譯文譯者 | 李睿
審校 | 孫淑娟
如果你正在使用Kubernetes解決方案作為一個平臺,并在任何公共云中托管容器應(yīng)用程序,那么遲早會面臨高昂的帳單。Kubernetes計費(fèi)在很大程度上取決于節(jié)點(diǎn)的數(shù)量,而節(jié)點(diǎn)數(shù)量是由集群的工作負(fù)載數(shù)量決定的。
眾所周知,自動縮放是Kubernetes最受歡迎的特性之一。因此,在根本沒有進(jìn)行工作的情況下,減少一些工作負(fù)載并降低云計算成本將更為明智。
當(dāng)人們談到Kubernetes的自動縮放功能時,可能會想到水平Pod自動縮放器(HPA)。在默認(rèn)情況下,HPA可以使用基本指標(biāo)(如CPU或內(nèi)存使用情況)實(shí)現(xiàn)自動縮放。然而,當(dāng)復(fù)雜的分布式應(yīng)用程序與Kubernetes集群之外的不同組件集成時(例如:Kafka topic lag、Redis Stream、Azure Pipeline Queue、Azure Service Bus、PubSub topic等),HPA本身無法基于這些組件的指標(biāo)來縮放pod。
HPA可以使用自定義指標(biāo)并以此為基礎(chǔ)進(jìn)行縮放,但它需要設(shè)置一個指標(biāo)適配器和一個額外的配置層,以便將數(shù)據(jù)正確地映射到Kubernetes。
這就是KEDA讓用戶的工作變得輕松的地方。
為了克服這類問題,KEDA在HPA之上提供了縮放功能。KEDA是一個事件驅(qū)動的自動縮放器,它根據(jù)需要處理的事件數(shù)量添加額外的HPA。它自動縮放不同類型的Kubernetes資源,例如部署、狀態(tài)集、作業(yè)和自定義資源。
架構(gòu)和概念
KEDA由兩個組件組成,用于控制pods/工作負(fù)載的自動縮放。
(1)代理:它負(fù)責(zé)激活和取消激活Kubernetes部署、狀態(tài)集或任何其他目標(biāo),以便在沒有事件時縮放到零,在有事件時縮放到零。
(2)度量服務(wù)器:它作為Kubernetes度量服務(wù)器,將從事件源收集的事件(Azure管道隊(duì)列、Kafka主題消息等)公開到HPA。
縮放器:KEDA的真正力量在于大量的縮放器??s放器是一個豐富的信息源,因?yàn)樗峁┩獠繑?shù)據(jù)/事件,并允許基于外部數(shù)據(jù)進(jìn)行縮放。如今,它支持50多個具有特定支持觸發(fā)器的縮放器,如Azure Pipeline(觸發(fā)器:Azure Pipeline)和Kafka(觸發(fā)器:Kafka Topics),并且還有更多功能。
ScaledObject:它們被部署為Kubernetes CRD,帶來了將部署/狀態(tài)集與事件源鏈接起來的功能,并定義了可縮放元數(shù)據(jù)。ScaledObject使用觸發(fā)器響應(yīng)事件源中發(fā)生的事件,并根據(jù)需要縮放工作負(fù)載。
KEDA使用另一個名為Trigger Authentication(名稱空間)或ClusterTriggerAutnetication (集群作用域)的CRD對事件源進(jìn)行身份驗(yàn)證。
現(xiàn)在有足夠的理論,以下來看一些實(shí)際用例,如何利用KEDA在代理池中管理Azure管道代理。
用例
首先,需要花費(fèi)時間來理解場景。例如一個ADO(Azure DevOps)項(xiàng)目,它使用持續(xù)集成(CI)/持續(xù)交付(CD)解決方案。在這一基礎(chǔ)上,已經(jīng)構(gòu)建了構(gòu)建/發(fā)布管道。這些管道使用自托管的容器化代理來執(zhí)行所有任務(wù)。這些自托管的容器化代理作為狀態(tài)集部署在GKE集群上。
下面的截圖描述了在StatefulSet下只有一個pod代理,并且一個管道作業(yè)正在同一個pod代理上運(yùn)行。如果創(chuàng)建更多的版本,它們(作業(yè))將進(jìn)入隊(duì)列,等待單個pod代理空閑。有了KEDA,每當(dāng)隊(duì)列中有一個新作業(yè)時,將會看到pod的數(shù)量得到增加。
先決條件
- 采用ADO項(xiàng)目(已建立代理池)作為持續(xù)集成(CI)/持續(xù)交付(CD)解決方案。
- 在代理池下創(chuàng)建Azure管道代理所需的ADO項(xiàng)目權(quán)限。
- Kubernetes集群將Azure管道代理部署為狀態(tài)集。
- 必須為K8S集群中的應(yīng)用程序建立必要的GCP網(wǎng)絡(luò)連接,以便能夠訪問互聯(lián)網(wǎng)。
安裝Azure管道代理
使用以下YAML在K8S集群上安裝自托管的容器化Azure管道代理。
現(xiàn)在驗(yàn)證代理已成功注冊到ADO代理池,可以看到代理也出現(xiàn)在Azure管道上。
在Kubernetes集群上安裝KEDA
可以通過多種方式在Kubernetes集群上安裝KEDA。例如使用Helm chart在集群上安裝KEDA,其他方法可以參考官方Helm圖表。
KEDA在行動
如上所述,ScaledObject是在事件源和部署之間創(chuàng)建映射的對象?,F(xiàn)在,將使用Azure管道觸發(fā)器和TriggerAuthentication創(chuàng)建ScaledObject,以允許KEDA在狀態(tài)集中縮放pod。
參考官方頁面可以了解ScaledObject的所有參數(shù)。
一旦創(chuàng)建了ScaledObject,KEDA將自動同步配置,并開始監(jiān)視上面創(chuàng)建的azp-agent Statefulset。KEDA使用所需的配置無縫地創(chuàng)建一個HPA對象,并基于通過ScaledObject提供的觸發(fā)器規(guī)則(在本例中,它的隊(duì)列長度為‘1’)縮放副本。
現(xiàn)在,將對回購進(jìn)行一些提交,以排隊(duì)一些構(gòu)建。
因此,可以看到KEDA在azp-agent Statefulset中縮放了pod的數(shù)量,這些pod將被注冊到代理池中,并承擔(dān)隊(duì)列上的掛起作業(yè)
KEDA擁有50多個縮放器,可以使用不同類型的事件源事件來驅(qū)動自動縮放,并且它還在繼續(xù)添加更多的縮放器。因此,它絕對是一個可用于基于事件的自動縮放的生產(chǎn)級應(yīng)用程序。
原文標(biāo)題:??Autoscale Azure Pipeline Agents With KEDA??,作者:Basudeba Mandal