k8s-HPA自動伸縮pod數量


修改控制器的pod副本數

1、yml文件中修改replicas數量
2、在dashboard修改deployment的pod值;此修改只是臨時生效,重建yml文件后,pod數量會恢復,以yml文件為准
3、通過kubectl scale命令;此修改只是臨時生效,重建yml文件后,pod數量會恢復
4、通過kubectl edit編輯deployment
5、通過HPA控制器

手動調整pod數量:

kubectl scale 參數對運行在k8s 環境中的pod 數量進行擴容(增加)或縮容(減小)。

1、kubectl scale deployment/nginx-deployment --replicas=2 -n default   #指定deployment的名稱
 
2、root@master1:~# kubectl get deployment -n default                   #查看擴容后控制器的pod數量
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
net-test1          3/3     3            3           4d12h
nginx-deployment   2/2     2            2           5m42s

kubectl autoscale deployment/nginx-deploymen --min=2 --max=5 --cpu-percent=50 -n default
#自動擴容指定deployment的pod數量,當pod的cpu資源利用率達到50%,最大pod數量擴容到5個,最小2個pod數量

HPA自動伸縮pod數量

kubectl autoscale 參數自動控制在k8s集群中運行的pod數量(水平自動伸縮),需要提前設置pod范圍及觸發條件。

k8s從1.1版本開始增加了名稱為HPA(Horizontal Pod Autoscaler)的控制器,用於實現基於pod中資源
(CPU/Memory)利用率進行對pod的自動擴縮容功能的實現,早期的版本只能基於Heapster組件實現對CPU利用率
做為觸發條件,但是在k8s 1.11版本開始使用Metrices Server完成數據采集(采集pod的CPU/內存),然后將采集到的數據通過
API(Aggregated API,匯總API),例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io,然后
再把數據提供給HPA控制器進行查詢,以實現基於某個資源利用率對pod進行擴縮容的目的。

控制管理器(kube-controller-manager)默認每隔15s(可以通過–horizontal-pod-autoscaler-sync-period修改)查詢metrics的資源使用情況

kube-controller-manager支持以下三種metrics指標類型:
  ->預定義metrics(比如Pod的CPU)以利用率的方式計算
  ->自定義的Pod metrics,以原始值(raw value)的方式計算
  ->自定義的object metrics
  
支持兩種metrics查詢方式:
  ->Heapster
  ->自定義的REST API
  
支持多metrics,即支持多種數據采集方式,采集pod指標數據
運維通過master的API創建一個HPA控制器,由HPA控制器對deployment進行自動伸縮,通過調用kube-controller-manager對pod數量進行管理;
配置了HPA的deployment發現pod的資源利用率超過了之前所設定的值,通過調用kube-controller-manager服務創建pod,直到pod的資源利用率低於所設定的值;HPA會通過metrics API獲取當前HPA所管理的deployment內部的POD的資源利用率

工作過程:
HPA通過master api(Metrices Server通過api server把采集到的數據記錄到etcd中,HPA會通過master api獲取到etcd中pod的數據)獲取到deployment中pod的指標數據,再與HPA提前定義好的值做對比,如果資源利用率超出定義的值,則會通過kube-controller-manager新建pod,直到資源利用率低於hpa所定義的值;
kube-controller-manager默認每隔15s會查詢metrics的資源使用情況

准備metrics-server

https://github.com/kubernetes-incubator/metrics-server #使用metrics-server作為HPA數據源。

1、cd /usr/local/src

2、git clone https://github.com/kubernetes-sigs/metrics-server.git     #將項目克隆下來

3、git clone https://github.com/kubernetes-sigs/metrics-server.git

4、cd metrics-server/deploy/kubernetes/

5、grep image ./*       #部署容器時,有的鏡像國外網站下載不下來,需要更換成國內地址

6、vim metrics-server-deployment.yaml
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6      #將鏡像地址更換成國內阿里雲地址

7、kubectl apply -f .   #將當前目錄下所有yml文件全部創建

8、cd /opt/k8s-data/yaml/magedu/tomcat-app1/

9、vim hpa.yaml

#apiVersion: autoscaling/v2beta1   
apiVersion: autoscaling/v1                #定義API版本
kind: HorizontalPodAutoscaler             #對象類型
metadata:                                 #定義對象元數據
  namespace: linux                        #hpa創建后隸屬的namespace
  name: linux-tomcat-app1-podautoscaler   #hpa對象名稱
  labels:                    
    app: linux-tomcat-app1   #自定義的label名稱
    version: v2beta1         #自定義的api版本
spec:                        #定義對象具體信息
  scaleTargetRef:            #定義水平伸縮的目標對象,Deployment、ReplicationController/ReplicaSet     
    apiVersion: apps/v1      #目標對象的API版本
    #apiVersion: extensions/v1beta1 
    kind: Deployment         #目標對象類型為deployment
    name: linux-tomcat-app1-deployment   #目標deployment的具體名稱
  minReplicas: 2                         #最小pod數
  maxReplicas: 4                         #最大pod數
  targetCPUUtilizationPercentage: 60     #CPU資源利用率 
  
  #metrics:           #k8s-1.9之前使用此方法指定水平伸縮,現版本已經淘汰
  #- type: Resource
  #  resource:
  #    name: cpu
  #    targetAverageUtilization: 60
  #- type: Resource
  #  resource:
  #    name: memory
  
10、kubectl apply -f hpa.yaml

11、hpa的yml文件一般與服務的yml文件分開

12、kubectl describe deployment/linux-tomcat-app1-deployment -n linux
#desired 最終期望處於READY狀態的副本數
 updated 當前完成更新的副本數(已經成為READY狀態的副本數)
 total 總計副本數
 available 當前可用的副本數
 unavailable 不可用副本數
 
13、kubectl get hpa -n linux   #查看指定namespace下的hpa控制器 

注意

如果hpa的最小值高於業務yml文件replicas的值,以hpa值為准;
如果yml文件中的replicas值高於hpa的最小值,以hpa的最小值為准;

如果hpa控制器發現所監控的deployment下有pod的CPU資源利用率超過所指定的數值,會進行擴展pod,直到該deployment內各個pod的cpu利用率低於所指定的值為止;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM