溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣使用自定義指標(biāo)進(jìn)行K8S自動(dòng)彈性伸縮

發(fā)布時(shí)間:2021-12-16 09:57:50 來(lái)源:億速云 閱讀:238 作者:柒染 欄目:云計(jì)算

怎樣使用自定義指標(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)伸縮。

為什么需要自定義指標(biāo)?

應(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流水線

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:

怎樣使用自定義指標(biāo)進(jìn)行K8S自動(dòng)彈性伸縮

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使用。

怎樣使用自定義指標(biāo)進(jìn)行K8S自動(dòng)彈性伸縮

大部分復(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)進(jìn)行K8S自動(dòng)彈性伸縮

Demo:Kubernetes自動(dòng)伸縮

我們將演示如何使用自定義指標(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)伸縮的整體流程如下圖所示:

怎樣使用自定義指標(biāo)進(jìn)行K8S自動(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í)。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI