您好,登錄后才能下訂單哦!
怎樣使用自定義指標(biāo)進(jìn)行K8S自動(dòng)彈性伸縮,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
Kubernetes自動(dòng)彈性伸縮可以根據(jù)業(yè)務(wù)流量,自動(dòng)增加或減少服務(wù)。這一功能在實(shí)際的業(yè)務(wù)場(chǎng)景中十分重要。我們將了解Kubernetes如何針對(duì)應(yīng)用產(chǎn)生的自定義指標(biāo)實(shí)現(xiàn)自動(dòng)伸縮。
應(yīng)用程序的CPU或RAM的消耗并不一定能夠正確表明是否需要進(jìn)行擴(kuò)展。例如,如果你有一個(gè)消息隊(duì)列consumer,它每秒可以處理500條消息而不會(huì)導(dǎo)致崩潰。一旦該consumer的單個(gè)實(shí)例每秒處理接近500條消息,你可能希望將應(yīng)用程序擴(kuò)展到兩個(gè)實(shí)例,以便將負(fù)載分布在兩個(gè)實(shí)例上。測(cè)量CPU或RAM對(duì)于擴(kuò)展這樣的應(yīng)用程序來(lái)說(shuō)有點(diǎn)矯枉過(guò)正了,你需要尋找一個(gè)與應(yīng)用程序性質(zhì)更為密切相關(guān)的指標(biāo)。一個(gè)實(shí)例在特定時(shí)間點(diǎn)處理的消息數(shù)量能更貼切地反映該應(yīng)用的實(shí)際負(fù)載。同樣,可能有一些應(yīng)用的其他指標(biāo)更有意義。這些可以使用Kubernetes中的自定義指標(biāo)進(jìn)行定義。
Metrics Server和API
最初,這些指標(biāo)會(huì)通過(guò)Heapster暴露給用戶,Heapster可以從每個(gè)kubelet中查詢指標(biāo)。Kubelet則與localhost上的cAdvisor對(duì)話,并檢索出節(jié)點(diǎn)級(jí)和pod級(jí)的指標(biāo)。Metric-server的引入是為了取代heapster,并使用Kubernetes API來(lái)暴露指標(biāo)從而以Kubernetes API的方式提供指標(biāo)。Metric server僅提供核心的指標(biāo),比如pod和節(jié)點(diǎn)的內(nèi)存和CPU,對(duì)于其他指標(biāo),你需要構(gòu)建完整的指標(biāo)流水線。構(gòu)建流水線和Kubernetes自動(dòng)伸縮的機(jī)制將會(huì)保持不變。
Aggregation Layer
能夠通過(guò)Kubernetes API層暴露指標(biāo)的關(guān)鍵部分之一是Aggregation Layer。該aggregation layer允許在集群中安裝額外的Kubernetes格式的API。這使得API像任何Kubernetes資源一樣可用,但API的實(shí)際服務(wù)可以由外部服務(wù)完成,可能是一個(gè)部署到集群本身的Pod(如果沒(méi)有在集群級(jí)別完成,你需要啟用aggregation layer)。那么,這到底是如何發(fā)揮作用的呢?作為用戶,用戶需要提供API Provider(比如運(yùn)行API服務(wù)的pod),然后使用APIService對(duì)象注冊(cè)相同的API。
讓我們以核心指標(biāo)流水線為例來(lái)說(shuō)明metrics server如何使用 API Aggregation layer注冊(cè)自己。APIService對(duì)象如下:
apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata: name: v1beta1.metrics.k8s.io spec: service: name: metrics-server namespace: kube-system group: metrics.k8s.io version: v1beta1 insecureSkipTLSVerify: true groupPriorityMinimum: 100 versionPriority: 100
部署使用APIService注冊(cè)API的metrics server之后,我們可以看到Kubernetes API中提供了指標(biāo)API:
Metrics流水線:核心部分和完整流水線
我們已經(jīng)了解了基本組件,讓我們把它們放在一起組成核心metrics流水線。在核心流水線中,如果你已經(jīng)恰當(dāng)?shù)匕惭b了metrics server,它也將創(chuàng)建APIService將自己注冊(cè)到Kubernetes API server上。正如我們?cè)谏弦还?jié)中所了解到的那樣,這些指標(biāo)將在/apis/metrics.k8s.io中暴露,并被HPA使用。
大部分復(fù)雜的應(yīng)用程序需要更多的指標(biāo),而不僅僅是內(nèi)存和CPU,這也是大多數(shù)企業(yè)使用監(jiān)控工具的原因,最常見(jiàn)的監(jiān)控工具有Prometheus、Datadog以及Sysdig等。而不同的工具所使用的格式也有所區(qū)別。在我們可以使用Kubernetes API聚合來(lái)暴露endpoint之前,我們需要將指標(biāo)轉(zhuǎn)換為合適的格式。此時(shí)需要使用小型的adapter(適配器)——它可能是監(jiān)控工具的一部分,也可能作為一個(gè)單獨(dú)的組件,它在監(jiān)控工具和Kubernetes API之間架起了一座橋梁。例如,Prometheus有專門的Prometheus adapter或者Datadog有Datadog Cluster Agent — 它們位于監(jiān)控工具和API之間,并從一種格式轉(zhuǎn)換到另一個(gè)種格式,如下圖所示。這些指標(biāo)在稍微不同的endpoint都可以使用。
我們將演示如何使用自定義指標(biāo)自動(dòng)伸縮應(yīng)用程序,并且借助Prometheus和Prometheus adapter。
設(shè)置Prometheus
為了讓適配器可以使用指標(biāo),我們將使用Prometheus Operator來(lái)安裝Prometheus。它創(chuàng)建CRD來(lái)在集群中部署Prometheus的組件。CRD是擴(kuò)展Kubernetes資源的一種方式。使用Operator可以“以Kubernetes的方式”(通過(guò)在YAML文件中定義對(duì)象)輕松配置和維護(hù)Prometheus實(shí)例。由Prometheus Operator創(chuàng)建的CRD有:
AlertManager
ServiceMonitor
Prometheus
你可以根據(jù)下方鏈接的指導(dǎo)設(shè)置Prometheus:
https://github.com/infracloudio/kubernetes-autoscaling#installing-prometheus-operator-and-prometheus
部署Demo應(yīng)用程序
為了生成指標(biāo),我們將部署一個(gè)簡(jiǎn)單的應(yīng)用程序mockmetrics,它將在/metrics處生成total_hit_count值。這是一個(gè)用Go寫(xiě)的網(wǎng)絡(luò)服務(wù)器。當(dāng)URL被訪問(wèn)時(shí),指標(biāo)total_hit_count的值會(huì)不斷增加。它使用Prometheus所要求的展示格式來(lái)顯示指標(biāo)。
根據(jù)以下鏈接來(lái)為這一應(yīng)用程序創(chuàng)建deployment和服務(wù),它同時(shí)也為應(yīng)用程序創(chuàng)建ServiceMonitor和HPA:
https://github.com/infracloudio/kubernetes-autoscaling#deploying-the-mockmetrics-application
ServiceMonitor
ServiceMonitor為Prometheus創(chuàng)建了一個(gè)配置。它提到了服務(wù)的標(biāo)簽、路徑、端口以及應(yīng)該在什么時(shí)候抓取指標(biāo)的時(shí)間間隔。在服務(wù)label的幫助下,選擇了pods。Prometheus會(huì)從所有匹配的Pod中抓取指標(biāo)。根據(jù)你的Prometheus配置,ServiceMonitor應(yīng)該放在相應(yīng)的命名空間中。在本例中,它和mockmetrics 在同一個(gè)命名空間。
部署和配置Prometheus Adapter
現(xiàn)在要為HPA提供custom.metrics.k8s.io API endpoint,我們將部署Prometheus Adapter。Adapter希望它的配置文件在Pod中可用。我們將創(chuàng)建一個(gè)configMap并將其掛載在pod內(nèi)部。我們還將創(chuàng)建Service和APIService來(lái)創(chuàng)建API。APIService將**/api/custom.metrics.k8s.io/v1beta1 endpoint**添加到標(biāo)準(zhǔn)的Kubernetes APIs。你可以根據(jù)以下教程來(lái)實(shí)現(xiàn)這一目標(biāo):
https://github.com/infracloudio/kubernetes-autoscaling#deploying-the-custom-metrics-api-server-prometheus-adapter
接下來(lái),我們看一下配置:
seriesQuery用于查詢Prometheus的資源,標(biāo)簽為“default“和”mockmetrics-service“。
resources部分提到標(biāo)簽如何被映射到Kubernetes資源。針對(duì)我們的情況,它將“namespace“標(biāo)簽與Kubernetes的”namespace“進(jìn)行映射,服務(wù)也是如此。
metricsQuery又是一個(gè)Prometheus查詢,它可以將指標(biāo)導(dǎo)入adapter。我們使用的查詢是獲取2分鐘內(nèi)所有匹配regexmockmetrics-deploy-(.*)的pods的平均total_hit_count總和。
Kubernetes自動(dòng)伸縮實(shí)踐
一旦你根據(jù)下文中的步驟進(jìn)行,指標(biāo)值會(huì)不斷增加。我們現(xiàn)在就來(lái)看HPA:
https://github.com/infracloudio/kubernetes-autoscaling#scaling-the-application
$ kubectl get hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE mockmetrics-app-hpa Deployment/mockmetrics-deploy 0/100 1 10 1 11h mockmetrics-app-hpa Deployment/mockmetrics-deploy 56/100 1 10 1 11h mockmetrics-app-hpa Deployment/mockmetrics-deploy 110/100 1 10 1 11h mockmetrics-app-hpa Deployment/mockmetrics-deploy 90/100 1 10 2 11h mockmetrics-app-hpa Deployment/mockmetrics-deploy 126/100 1 10 2 11h mockmetrics-app-hpa Deployment/mockmetrics-deploy 306/100 1 10 2 11h mockmetrics-app-hpa Deployment/mockmetrics-deploy 171/100 1 10 4 11h
你可以看到當(dāng)該值達(dá)到目標(biāo)值時(shí),副本數(shù)如何增加。
工作流程
自動(dòng)伸縮的整體流程如下圖所示:
圖片來(lái)源: luxas/kubeadm-workshop
關(guān)于怎樣使用自定義指標(biāo)進(jìn)行K8S自動(dòng)彈性伸縮問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。