您好,登錄后才能下訂單哦!
? ? 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ò)縮容操作。如下圖
? ? 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
????????
????????????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
? ? ? ?
????????
???????# 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
????????
????? ?確保適配器adapter注冊(cè)到apiserver
???????# kubectl get apiservices |grep custom?
????? ?
???????# kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
???????
????????
????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
????????
????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>>)'
????
????
????這里主要是利用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
????
????
????5.測(cè)試HPA
????進(jìn)行壓測(cè)
????# yum install -y httpd-tools
????使用ab命令對(duì)metrics-app service進(jìn)行壓力測(cè)試
?????
????
????查看HPA,指標(biāo)數(shù)據(jù)已經(jīng)打滿,deployment下的容器已經(jīng)擴(kuò)容到了10個(gè),等壓力測(cè)試結(jié)束,就會(huì)自動(dòng)縮容
????
免責(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)容。