溫馨提示×

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

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

Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮

發(fā)布時(shí)間:2020-06-08 08:32:24 來源:網(wǎng)絡(luò) 閱讀:1520 作者:wujunqi1996 欄目:系統(tǒng)運(yùn)維

? ? HPA原理

????K8S彈性伸縮,指在大業(yè)務(wù)量情況下,當(dāng)前容器資源如cpu,內(nèi)存,自定義指標(biāo)等,已超出正常設(shè)定的范圍時(shí)進(jìn)行的自動(dòng)擴(kuò)容操作,將業(yè)務(wù)負(fù)載到擴(kuò)容后的容器上,降低容器壓力,直到達(dá)到HPA設(shè)定的容器數(shù)量上限,當(dāng)業(yè)務(wù)量降低后,實(shí)現(xiàn)自動(dòng)縮容操作。Kubernetes 中的 Metrics Server 持續(xù)采集所有 Pod 副本的指標(biāo)數(shù)據(jù)。HPA 控制器通過 Metrics Server 的 API(Heapster 的 API 或聚合 API)獲取這些數(shù)據(jù),基于用戶定義的擴(kuò)縮容規(guī)則進(jìn)行計(jì)算,得到目標(biāo) Pod 副本數(shù)量。當(dāng)目標(biāo) Pod 副本數(shù)量與當(dāng)前副本數(shù)量不同時(shí),HPA 控制器就向 Pod 的副本控制器(Deployment、RC 或 ReplicaSet)發(fā)起 scale 操作,調(diào)整 Pod 的副本數(shù)量,完成擴(kuò)縮容操作。

????HPA的具有擴(kuò)縮容冷卻周期,防止因網(wǎng)絡(luò)抖動(dòng)而造成的不必要擴(kuò)縮容操作

????擴(kuò)容冷卻時(shí)間默認(rèn)值:3分鐘

????縮容冷卻時(shí)間默認(rèn)值:5分鐘

????可以通過調(diào)整kube-controller-manager組件啟動(dòng)參數(shù)設(shè)置冷卻時(shí)間:

????????--horizontal-pod-autoscaler-downscale-delay :擴(kuò)容冷卻

????????--horizontal-pod-autoscaler-upscale-delay :縮容冷卻

? ? HPA發(fā)展初期只支持內(nèi)存,cpu的自動(dòng)擴(kuò)縮容操作,不支持自定義指標(biāo),發(fā)展至今,已經(jīng)可以通過第三方插件與Prometheus等監(jiān)控服務(wù)進(jìn)行交互,獲取到自定義指標(biāo),并轉(zhuǎn)換成apiserver能夠理解的內(nèi)容,供HPA進(jìn)行自動(dòng)化擴(kuò)縮容操作。如下圖

Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮


? ? HPA發(fā)展歷程

? ??

????目前 HPA 已經(jīng)支持了 autoscaling/v1、autoscaling/v2beta1和autoscaling/v2beta2 ?三個(gè)大版本 。

????目前大多數(shù)人比較熟悉是autoscaling/v1,這個(gè)版本只支持CPU一個(gè)指標(biāo)的彈性伸縮。

????而autoscaling/v2beta1增加了支持自定義指標(biāo),autoscaling/v2beta2又額外增加了外部指標(biāo)支持。

????而產(chǎn)生這些變化不得不提的是Kubernetes社區(qū)對(duì)監(jiān)控與監(jiān)控指標(biāo)的認(rèn)識(shí)與轉(zhuǎn)變。從早期Heapster到Metrics Server再到將指標(biāo)邊界進(jìn)行劃分,一直在豐富監(jiān)控生態(tài)。


????傳統(tǒng)HPA,只針對(duì)cpu,內(nèi)存進(jìn)行擴(kuò)縮容編寫方式也很簡(jiǎn)單,可以通過yaml,也可以通過kubectl 命令行形式設(shè)定閥值。


????v1版本:

????????apiVersion: autoscaling/v1

????????kind: HorizontalPodAutoscaler

????????metadata:

????????? name: php-apache

????????? namespace: default

????????spec:

????????? scaleTargetRef:

????????? ? apiVersion: apps/v1

????????? ? kind: Deployment

????????? ? name: php-apache

????????? minReplicas: 1

????????? maxReplicas: 10

????????? targetCPUUtilizationPercentage: 50


????v2beta2版本:

????????apiVersion: autoscaling/v2beta2

????????kind: HorizontalPodAutoscaler

????????metadata:

????????? name: php-apache

????????? namespace: default

????????spec:

????????? scaleTargetRef:

????????? ? apiVersion: apps/v1

????????? ? kind: Deployment

????????? ? name: php-apache

????????? minReplicas: 1

????????? maxReplicas: 10

????????? metrics:

????????? - type: Resource

????????? ? resource:

????????? ? ? name: cpu

????????? ? ? target:

????????? ? ? ? type: Utilization

????????? ? ? ? averageUtilization: 50

????????? - type: Pods

????????? ? pods:

????????? ? ? metric:

????????? ? ? ? name: packets-per-second

????????? ? ? target:

????????? ? ? ? type: AverageValue

????????? ? ? ? averageValue: 1k

????????? - type: Object

????????? ? object:

????????? ? ? metric:

????????? ? ? ? name: requests-per-second

????????? ? ? describedObject:

????????? ? ? ? apiVersion: networking.k8s.io/v1beta1

????????? ? ? ? kind: Ingress

????????? ? ? ? name: main-route

????????? ? ? target:

????????? ? ? ? type: Value

????????? ? ? ? value: 10k

????????? - type: External

????????? ? external:

????????? ? ? metric:

????????? ? ? ? name: queue_messages_ready

????????? ? ? ? selector: "queue=worker_tasks"

????????? ? ? target:

????????? ? ? ? type: AverageValue

????????? ? ? ? averageValue: 30


????????metrics中的type字段有四種類型的值:Object、Pods、Resource、External。

????????????Resource:指的是當(dāng)前伸縮對(duì)象下的pod的cpu和memory指標(biāo),只支持Utilization和AverageValue類型的目標(biāo)值。

????????????Object:指的是指定k8s內(nèi)部對(duì)象的指標(biāo),數(shù)據(jù)需要第三方adapter提供,只支持Value和AverageValue類型的目標(biāo)值。

????????????Pods:指的是伸縮對(duì)象Pods的指標(biāo),數(shù)據(jù)需要第三方的adapter提供,只允許AverageValue類型的目標(biāo)值。

????????????External:指的是k8s外部的指標(biāo),數(shù)據(jù)同樣需要第三方的adapter提供,只支持Value和AverageValue類型的目標(biāo)值。


基于Prometheus自定義指標(biāo)縮放

1.部署Prometheus

參考我之前的博客部署即可


2.部署Prometheus Adapter

??????但是prometheus采集到的metrics并不能直接給k8s用,因?yàn)閮烧邤?shù)據(jù)格式不兼容,還需要另外一個(gè)組件(k8s-prometheus-adpater),將prometheus的metrics 數(shù)據(jù)格式轉(zhuǎn)換成k8s API接口能識(shí)別的格式,轉(zhuǎn)換以后,因?yàn)槭亲远x????API,所以還需要用Kubernetes aggregator在主APIServer中注冊(cè),以便直接通過/apis/來訪問。

???????直接使用Helm Charts安裝

????

????? ?# wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz

????? ?# tar zxvf helm-v3.0.0-linux-amd64.tar.gz?

????? ?# mv linux-amd64/helm /usr/bin/

????? ?# helm repo add stable http://mirror.azure.cn/kubernetes/charts

????? ?# helm repo update

????? ?# helm repo list

? ? ? ?Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮

????????

???????# helm install prometheus-adapter stable/prometheus-adapter --namespace kube-system --set prometheus.url=http://prometheus.kube-system,prometheus.port=9090

? ? ? ?# helm list -n kube-system

????????Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮


????? ?確保適配器adapter注冊(cè)到apiserver

???????# kubectl get apiservices |grep custom?

????? ?Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮

???????# kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"

???????Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮

????????

????3.創(chuàng)建metrics deployment

????容器需要暴露出讓prometheus獲取數(shù)據(jù)的端口,metrics路徑,需要和開發(fā)商量好,服務(wù)暴露在外的需要監(jiān)控的指標(biāo)放在/metrics路徑下

? ? 注意:鏡像為私人鏡像,需要實(shí)驗(yàn)的話,需要進(jìn)行替換

????????apiVersion: apps/v1

????????kind: Deployment

????????metadata:

????????? labels:

????????? ? app: metrics-app

????????? name: metrics-app

????????spec:

????????? replicas: 3

????????? selector:

????????? ? matchLabels:

????????? ? ? app: metrics-app

????????? template:

????????? ? metadata:

????????? ? ? labels:

????????? ? ? ? app: metrics-app

????????? ? ? annotations:

????????? ? ? ? prometheus.io/scrape: "true"

????????? ? ? ? prometheus.io/port: "80"

????????? ? ? ? prometheus.io/path: "/metrics"

????????? ? spec:

????????? ? ? containers:

????????? ? ? - image: 172.30.0.109/metrics-app

????????? ? ? ? name: metrics-app

????????? ? ? ? ports:

????????? ? ? ? - name: web

????????? ? ? ? ? containerPort: 80

????????? ? ? ? resources:

????????? ? ? ? ? requests:

????????? ? ? ? ? ? cpu: 200m

????????? ? ? ? ? ? memory: 256Mi

????????? ? ? ? readinessProbe:

????????? ? ? ? ? httpGet:

????????? ? ? ? ? ? path: /

????????? ? ? ? ? ? port: 80

????????? ? ? ? ? initialDelaySeconds: 3

????????? ? ? ? ? periodSeconds: 5

????????? ? ? ? livenessProbe:

????????? ? ? ? ? httpGet:

????????? ? ? ? ? ? path: /

????????? ? ? ? ? ? port: 80

????????? ? ? ? ? initialDelaySeconds: 3

????????? ? ? ? ? periodSeconds: 5

????????---

????????apiVersion: v1

????????kind: Service

????????metadata:

????????? name: metrics-app

????????? labels:

????????? ? app: metrics-app

????????spec:

????????? ports:

????????? - name: web

????????? ? port: 80

????????? ? targetPort: 80

????????? selector:

????????? ? app: metrics-app????


????????訪問容器/metrics路徑,得到總共http訪問量,經(jīng)過prometheus指標(biāo)轉(zhuǎn)換為QPS

????????Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮


????4.創(chuàng)建HPA規(guī)則

? ? 針對(duì)容器QPS進(jìn)行擴(kuò)縮容操作,Pods類型只支持averageValue,deployment最大擴(kuò)容數(shù)設(shè)為10。

????HPA yaml:

????????apiVersion: autoscaling/v2beta2

????????kind: HorizontalPodAutoscaler

????????metadata:

????????? name: metrics-app-hpa?

????????? namespace: default

????????spec:

????????? scaleTargetRef:

????????? ? apiVersion: apps/v1

????????? ? kind: Deployment

????????? ? name: metrics-app

????????? minReplicas: 1

????????? maxReplicas: 10

????????? metrics:

????????? - type: Pods

????????? ? pods:

????????? ? ? metric:

????????? ? ? ? name: http_requests_per_second

????????? ? ? target:

????????? ? ? ? type: AverageValue

????????? ? ? ? averageValue: 800m? ?# 800m 即0.8個(gè)/秒


????配置好HPA后,hpa還不能獲取到http_requests_per_second的數(shù)據(jù),kubetcl get hpa看到的獲取指標(biāo)是unknown,需要在prometheus adapter適配器中配置http_requests_per_second

相當(dāng)于白名單,去獲取prometheus中的指標(biāo)數(shù)據(jù)。

????修改prometheus adapter configmap

? ? # kubectl edit cm -n kube-system?prometheus-adapter

????新增:

????- seriesQuery: 'http_requests_total{kubernetes_namespace!="",kubernetes_pod_name!=""}'

? ? ? resources:

? ? ? ? overrides:

? ? ? ? ? kubernetes_namespace: {resource: "namespace"}

? ? ? ? ? kubernetes_pod_name: {resource: "pod"}

? ? ? name:

? ? ? ? matches: "^(.*)_total"

? ? ? ? as: "${1}_per_second"

? ? ? metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'

????Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮

????

????這里主要是利用promSQL的形式通過將http_requests_total轉(zhuǎn)換成一個(gè)區(qū)間的平均訪問量,如上兩分鐘,求容器所有的和,即為QPS


????注意:將/metrics中的http_requests_total名稱替換為http_requests_per_second,HPA根據(jù)http_requests_per_second去獲取指標(biāo)數(shù)據(jù)進(jìn)行擴(kuò)縮容操作

????prometheus-adapter配置修改后,需要重啟容器加載新的配置

????

????到這一步,指標(biāo)已經(jīng)獲取到了

????# kubectl get hpa

????Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮

????

????5.測(cè)試HPA

????進(jìn)行壓測(cè)

????# yum install -y httpd-tools

????使用ab命令對(duì)metrics-app service進(jìn)行壓力測(cè)試

?????Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮

????

????查看HPA,指標(biāo)數(shù)據(jù)已經(jīng)打滿,deployment下的容器已經(jīng)擴(kuò)容到了10個(gè),等壓力測(cè)試結(jié)束,就會(huì)自動(dòng)縮容

????Kubernetes1.16基于Prometheus自定義指標(biāo)彈性伸縮



向AI問一下細(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