[TOC]node
個人kubernetes環境:nginx
Horizontal Pod Autoscaler(HPA,Pod水平自動伸縮),根據資源利用率或者自定義指標自動調整replication controller、deployment 或 replica set,實現部署的自動擴展和縮減,讓部署的規模接近於實際服務的負載。HPA不適於沒法縮放的對象,例如DaemonSet。 git
Kubernetes從1.8版本開始,CPU、內存等資源的metrics信息能夠經過 Metrics API來獲取,用戶能夠直接獲取這些metrics信息(例如經過執行kubect top
命令),HPA使用這些metics信息來實現動態伸縮。本文介紹Kubernetes集羣基於metric server的HPA。在開始以前咱們須要瞭解一下Metrics API和Metrics Server。 github
Metrics API: docker
/apis/metrics.k8s.io/
Metrics server: json
kube-up.sh
腳本以deployment的方式進行部署,也能夠經過yaml文件的方式進行部署 因爲官方已經棄用heapster,現metrics-server做爲其替代方案。 api
當前最新版本爲v0.3.1。部署yaml文件連接:deploy bash
在metrics-server-deployment.yaml
中,
image可以使用:ygqygq2/metrics-server:v0.3.1
另還需添加2個參數: app
containers: - name: metrics-server args: - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP - --kubelet-insecure-tls image: ygqygq2/metrics-server:v0.3.1
部署成功後,達到以下結果,則爲正常: curl
[root@lab1 1.8+]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% lab1 777m 2% 16064Mi 50% lab2 526m 1% 12577Mi 79% lab3 569m 1% 8819Mi 27% lab4 56m 5% 4151Mi 53% lab5 353m 2% 8287Mi 53% lab6 55m 5% 4021Mi 52% [root@lab1 1.8+]# kubectl top pods NAME CPU(cores) MEMORY(bytes) gohttpserver-849d47c88f-pqf7f 0m 4Mi nginx-cephfs-7777495b9b-5sfvv 0m 1Mi nginx-cephfs-dy1-7777495b9b-6jvph 0m 1Mi nginx-cephfs-dy2-86bdbfd977-g278z 0m 1Mi
kubectl run nginxtest --image=nginx:latest --requests=cpu=1m --expose --port=80 nginxtest_ip=$(kubectl get svc nginxtest -o=jsonpath="{.spec.clusterIP}") # 獲取svc IP,用於測試 kubectl autoscale deployment nginxtest --cpu-percent=10 --min=1 --max=10
咱們來建立一個busybox,而且循環訪問上面建立的服務。
kubectl run load-generator --image=busybox busybox_pod=$(kubectl get pod |grep load-generator|awk '{print $1}') kubectl exec -it ${busybox_pod} -- /bin/sh -c "while true; do curl -s $nginxtest_ip; done" & # 後臺跑,負載不夠可多條同時執行
查看hpa狀態,同時咱們查看相關資源nginxtest的副本數量,副本數量在變化。CPU資源利用率也在變化,最後趨於平穩。
$ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginxtest Deployment/nginxtest 100%/10% 1 10 4 24m $ kubectl get deployment nginxtest NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginxtest 4 4 4 4 27m
咱們關掉剛纔的busbox並等待一段時間。能夠看到副本數量變回爲1。
$ kubectl get deployment nginxtest NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginxtest 1 1 1 1 36m $ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginxtest Deployment/nginxtest 0%/10% 1 10 1 33m
HPA能對服務的容器數量作自動伸縮,對於服務的穩定性是一個很好的提高,但在生產中應用較少,緣由是由於不太容易衡量業務負載是否正常,影響服務穩定性的因素很是多。
參考資料:
[1] https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
[2] https://cloud.tencent.com/developer/article/1005406