Kubernetes基於Metrics Server的HPA

Kubernetes基於Metrics Server的HPA

[TOC]node

1. 環境說明和相關介紹

個人kubernetes環境:nginx

  • kubeadm安裝的kubernetes1.11

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 APIdocker

  1. 經過Metrics API咱們能夠獲取到指定node或者pod的當前資源使用狀況,API自己不存儲任何信息,因此咱們不可能經過API來獲取資源的歷史使用狀況。
  2. Metrics API的獲取路徑位於:/apis/metrics.k8s.io/
  3. 獲取Metrics API的前提條件是metrics server要在K8S集羣中成功部署
  4. 更多的metrics資料請參考:https://github.com/kubernetes/metrics

Metrics serverjson

  1. Metrics server是Kubernetes集羣資源使用狀況的聚合器
  2. 從1.8版本開始,Metrics server默承認以經過kube-up.sh腳本以deployment的方式進行部署,也能夠經過yaml文件的方式進行部署
  3. Metrics server收集全部node節點的metrics信息
  4. Kubernetes從1.7版本,經過 Kubernetes aggregator註冊Metrics Server在主API server

2. 部署metrics-server

因爲官方已經棄用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

3. 測試HPA

  1. 建立一個名爲nginxtest的deployment;
  2. 建立一個關聯資源nginxtest的HPA,最小的pod副本數爲1,最大爲10。HPA會根據設定的cpu使用率(10%)動態的增長或者減小pod數量,此地方用於測試,因此設定的伸縮閾值會比較小;
  3. 使用curl方式加大、減少nginx的負載;
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

4. 小結

HPA能對服務的容器數量作自動伸縮,對於服務的穩定性是一個很好的提高,但在生產中應用較少,緣由是由於不太容易衡量業務負載是否正常,影響服務穩定性的因素很是多。

參考資料:
[1] https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
[2] https://cloud.tencent.com/developer/article/1005406

相關文章
相關標籤/搜索