Kubernetes 弹性伸缩全场景解析(三) - HPA 实践手册
在上一篇文章中,給大家介紹和剖析了 HPA 的實(shí)現(xiàn)原理以及演進(jìn)的思路與歷程。本文我們將會為大家講解如何使用 HPA 以及一些需要注意的細(xì)節(jié)。
autoscaling/v1 實(shí)踐
v1 的模板可能是大家平時(shí)見到最多的也是最簡單的,v1 版本的 HPA 只支持一種指標(biāo) —— CPU。傳統(tǒng)意義上,彈性伸縮最少也會支持 CPU 與 Memory 兩種指標(biāo),為什么在 Kubernetes 中只放開了 CPU 呢?其實(shí)最早的 HPA 是計(jì)劃同時(shí)支持這兩種指標(biāo)的,但是實(shí)際的開發(fā)測試中發(fā)現(xiàn):內(nèi)存不是一個(gè)非常好的彈性伸縮判斷條件。因?yàn)楹?CPU不 同,很多內(nèi)存型的應(yīng)用,并不會因?yàn)?HPA 彈出新的容器而帶來內(nèi)存的快速回收,很多應(yīng)用的內(nèi)存都要交給語言層面的 VM 進(jìn)行管理,也就是說,內(nèi)存的回收是由 VM 的 GC 來決定的。這就有可能因?yàn)?GC 時(shí)間的差異導(dǎo)致 HPA 在不恰當(dāng)?shù)臅r(shí)間點(diǎn)震蕩,因此在 v1 的版本中,HPA 就只支持了 CPU 這一種指標(biāo)。
一個(gè)標(biāo)準(zhǔn)的 v1 模板大致如下:
apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata:name: php-apachenamespace: default spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: php-apacheminReplicas: 1maxReplicas: 10targetCPUUtilizationPercentage: 50其中 scaleTargetRef 表示當(dāng)前要操作的伸縮對象是誰。在本例中,伸縮的對象是一個(gè) apps/v1 版本的 Deployment。 targetCPUUtilizationPercentage 表示:當(dāng)整體的資源利用率超過 50% 的時(shí)候,會進(jìn)行擴(kuò)容。接下來我們做一個(gè)簡單的 Demo 來實(shí)踐下。
這樣一個(gè)使用 autoscaling/v1 的 HPA 就完成了。相對而言,這個(gè)版本的 HPA 目前是最簡單的,無論是否升級 Metrics-Server 都可以實(shí)現(xiàn)。
autoscaling/v2beta1 實(shí)踐
在前面的內(nèi)容中為大家講解了 HPA 還有 autoscaling/v2beta1 和 autoscaling/v2beta2 兩個(gè)版本。這兩個(gè)版本的區(qū)別是 autoscaling/v1beta1 支持了 Resource Metrics 和 Custom Metrics。而在 autoscaling/v2beta2 的版本中額外增加了 External Metrics 的支持。對于 External Metrics 在本文中就不進(jìn)行過多贅述,因?yàn)?External Metrics 目前在社區(qū)里面沒有太多成熟的實(shí)現(xiàn),比較成熟的實(shí)現(xiàn)是 Prometheus Custom Metrics。
上面這張圖為大家展現(xiàn)了開啟 Metrics Server 后, HPA 如何使用不同類型的Metrics,如果需要使用 Custom Metrics ,則需要配置安裝相應(yīng)的 Custom Metrics Adapter。在下文中,主要為大家介紹一個(gè)基于 QPS 來進(jìn)行彈性伸縮的例子。
目前默認(rèn)的阿里云容器服務(wù) Kubernetes 集群使用還是 Heapster,容器服務(wù)計(jì)劃在 1.12 中更新 Metrics Server,這個(gè)地方需要特別說明下,社區(qū)雖然已經(jīng)逐漸開始廢棄 Heapster,但是社區(qū)中還有大量的組件是在強(qiáng)依賴 Heapster 的 API,因此阿里云基于 Metrics Server 進(jìn)行了 Heapster 完整的兼容,既可以讓開發(fā)者使用 Metrics Server 的新功能,又可以無需擔(dān)心其他組件的宕機(jī)。
在部署新的 Metrics Server 之前,我們首先要備份一下 Heapster 中的一些啟動參數(shù),因?yàn)檫@些參數(shù)稍后會直接用在 Metrics Server 的模板中。其中重點(diǎn)關(guān)心的是兩個(gè) Sink,如果需要使用 Influxdb 的開發(fā)者,可以保留第一個(gè) Sink;如果需要保留云監(jiān)控集成能力的開發(fā)者,則保留第二個(gè) Sink。
將這兩個(gè)參數(shù)拷貝到 Metrics Server 的啟動模板中,在本例中是兩個(gè)都兼容,并下發(fā)部署。
apiVersion: v1 kind: ServiceAccount metadata:name: metrics-servernamespace: kube-system --- apiVersion: v1 kind: Service metadata:name: metrics-servernamespace: kube-systemlabels:kubernetes.io/name: "Metrics-server" spec:selector:k8s-app: metrics-serverports:- port: 443protocol: TCPtargetPort: 443 --- apiVersion: apiregistration.k8s.io/v1beta1 kind: APIService metadata:name: v1beta1.metrics.k8s.io spec:service:name: metrics-servernamespace: kube-systemgroup: metrics.k8s.ioversion: v1beta1insecureSkipTLSVerify: truegroupPriorityMinimum: 100versionPriority: 100 --- apiVersion: extensions/v1beta1 kind: Deployment metadata:name: metrics-servernamespace: kube-systemlabels:k8s-app: metrics-server spec:selector:matchLabels:k8s-app: metrics-servertemplate:metadata:name: metrics-serverlabels:k8s-app: metrics-serverspec:serviceAccountName: admincontainers:- name: metrics-serverimage: registry.cn-hangzhou.aliyuncs.com/ringtail/metrics-server:1.1imagePullPolicy: Alwayscommand:- /metrics-server- '--source=kubernetes:https://kubernetes.default'- '--sink=influxdb:http://monitoring-influxdb:8086'- '--sink=socket:tcp://monitor.csk.[region_id].aliyuncs.com:8093?clusterId=[cluster_id]&public=true'接下來我們修改下 Heapster 的 Service,將服務(wù)的后端從 Heapster 轉(zhuǎn)移到 Metrics Server。
如果此時(shí)從控制臺的節(jié)點(diǎn)頁面可以獲取到右側(cè)的監(jiān)控信息的話,說明 Metrics Server 已經(jīng)完全兼容 Heapster。
此時(shí)通過 kubectl get apiservice,如果可以看到注冊的 v1beta1.metrics.k8s.io 的 api,則說明已經(jīng)注冊成功。
接下來我們需要在 kube-controller-manager 上切換 Metrics 的數(shù)據(jù)來源。kube-controller-manger 部署在每個(gè) master 上,是通過 Static Pod 的托管給 kubelet 的。因此只需要修改 kube-controller-manager 的配置文件,kubelet 就會自動進(jìn)行更新。kube-controller-manager 在主機(jī)上的路徑是 /etc/kubernetes/manifests/kube-controller-manager.yaml。
需要將 --horizontal-pod-autoscaler-use-rest-clients=true,這里有一個(gè)注意點(diǎn),因?yàn)槿绻褂?vim 進(jìn)行編輯,vim 會自動生成一個(gè)緩存文件影響最終的結(jié)果,所以比較建議的方式是將這個(gè)配置文件移動到其他的目錄下進(jìn)行修改,然后再移回原來的目錄。至此,Metrics Server 已經(jīng)可以為 HPA 進(jìn)行服務(wù)了,接下來我們來做自定義指標(biāo)的部分。
如集群中未部署 Prometheus,可以參考《阿里云容器Kubernetes監(jiān)控(七) - Prometheus監(jiān)控方案部署》先部署 Prometheus。接下來我們部署 Custom Metrics Adapter。
kind: Namespace apiVersion: v1 metadata:name: custom-metrics --- kind: ServiceAccount apiVersion: v1 metadata:name: custom-metrics-apiservernamespace: custom-metrics --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: custom-metrics:system:auth-delegator roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:auth-delegator subjects: - kind: ServiceAccountname: custom-metrics-apiservernamespace: custom-metrics --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata:name: custom-metrics-auth-readernamespace: kube-system roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: extension-apiserver-authentication-reader subjects: - kind: ServiceAccountname: custom-metrics-apiservernamespace: custom-metrics --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:name: custom-metrics-resource-reader rules: - apiGroups:- ""resources:- namespaces- pods- servicesverbs:- get- list --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: custom-metrics-apiserver-resource-reader roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: custom-metrics-resource-reader subjects: - kind: ServiceAccountname: custom-metrics-apiservernamespace: custom-metrics --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:name: custom-metrics-getter rules: - apiGroups:- custom.metrics.k8s.ioresources:- "*"verbs:- "*" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: hpa-custom-metrics-getter roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: custom-metrics-getter subjects: - kind: ServiceAccountname: horizontal-pod-autoscalernamespace: kube-system --- apiVersion: apps/v1 kind: Deployment metadata:name: custom-metrics-apiservernamespace: custom-metricslabels:app: custom-metrics-apiserver spec:replicas: 1selector:matchLabels:app: custom-metrics-apiservertemplate:metadata:labels:app: custom-metrics-apiserverspec:tolerations:- key: beta.kubernetes.io/archvalue: armeffect: NoSchedule- key: beta.kubernetes.io/archvalue: arm64effect: NoScheduleserviceAccountName: custom-metrics-apiservercontainers:- name: custom-metrics-serverimage: luxas/k8s-prometheus-adapter:v0.2.0-beta.0args:- --prometheus-url=http://prometheus-k8s.monitoring.svc:9090- --metrics-relist-interval=30s- --rate-interval=60s- --v=10- --logtostderr=trueports:- containerPort: 443securityContext:runAsUser: 0 --- apiVersion: v1 kind: Service metadata:name: apinamespace: custom-metrics spec:ports:- port: 443targetPort: 443selector:app: custom-metrics-apiserver --- apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata:name: v1beta1.custom.metrics.k8s.io spec:insecureSkipTLSVerify: truegroup: custom.metrics.k8s.iogroupPriorityMinimum: 1000versionPriority: 5service:name: apinamespace: custom-metricsversion: v1beta1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:name: custom-metrics-server-resources rules: - apiGroups:- custom-metrics.metrics.k8s.ioresources: ["*"]verbs: ["*"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: hpa-controller-custom-metrics roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: custom-metrics-server-resources subjects: - kind: ServiceAccountname: horizontal-pod-autoscalernamespace: kube-system這個(gè)壓測的應(yīng)用暴露了一個(gè) Prometheus 的接口。接口中的數(shù)據(jù)如下,其中 http_requests_total 這個(gè)指標(biāo)就是我們接下來伸縮使用的自定義指標(biāo)。
[root@iZwz99zrzfnfq8wllk0dvcZ manifests]# curl 172.16.1.160:8080/metrics # HELP http_requests_total The amount of requests served by the server in total # TYPE http_requests_total counter http_requests_total 3955684最后
這篇文章主要是給大家?guī)硪粋€(gè)對于 autoscaling/v1 和 autoscaling/v2beta1 的感性認(rèn)知和大體的操作方式,對于 autoscaling/v1 我們不做過多的贅述,對于希望使用支持 Custom Metrics 的 autoscaling/v2beta1 的開發(fā)者而言,也許會認(rèn)為整體的操作流程過于復(fù)雜難以理解,我們會在下一篇文章中為大家詳解 autoscaling/v2beta1 使用 Custom Metrics 的種種細(xì)節(jié),幫助大家更深入地理解其中的原理與設(shè)計(jì)思路。
總結(jié)
以上是生活随笔為你收集整理的Kubernetes 弹性伸缩全场景解析(三) - HPA 实践手册的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解锁云原生 AI 技能 - 开发你的机器
- 下一篇: 大咖云集!Kubernetes and