k8s Pod的自動水平伸縮(HPA)


我們知道,當訪問量或資源需求過高時,使用:kubectl scale命令可以實現對pod的快速伸縮功能

但是我們平時工作中我們並不能提前預知訪問量有多少,資源需求多少。

這就很麻煩了,總不能為了需求總是把pod設置為最多狀態,這樣太浪費資源;也不能當請求量上來以后再去伸縮pod,這樣會有好多請求不成功。

k8s既然是雲原生時代的產品,當然得有智能,自動這些特性。

所以現在引入一個新的概念:

HPA(Horizontal Pod Autoscaler )

pod的自動水平伸縮

有了HPA,我們就不用為上面的問題而煩惱,HPA會幫我們自動完成pod的擴縮容。

當資源需求過高時,會自動創建出pod副本;當資源需求低時,會自動收縮pod副本數。

注意:首先必須確保集群中已經安裝metrics-server的組件,否則無法獲取集群內資源數據,無法進行以下操作。

原理:

通過集群內的資源監控系統(metrics-server),來獲取集群中資源的使用狀態。

根據CPU、內存、以及用戶自定義的資源指標數據的使用量或連接數為參考依據,來制定一個臨界點,一旦超出這個點,HPA就會自動創建出pod副本。

 

版本:

通過kubectl api-versions可以看到,目前有3個版本:

autoscaling/v1                 #只支持通過cpu為參考依據,來改變pod副本數
autoscaling/v2beta1       #支持通過cpu、內存、連接數以及用戶自定義的資源指標數據為參考依據。
autoscaling/v2beta2       #同上,小的變動

 

查詢:

1 kubectl explain hpa ##默認查詢到的是autoscaling/v1版本 2 3 kubectl explain hpa --api-version=autoscaling/v2beta1 ##如果使用其他版本,可以使用--api-version指明版本

部署HPA:

哪個資源最多幾個最少幾個通過什么判斷伸縮

例如:我有個deployment叫myapp現在只有一個副本數,最多只能8個副本數,當pod的cpu平均利用率超過百分之50或內存平均值超過百分之50時,pod將自動增加副本數以提供服務。

SVC、Deployment資源清單:

 

 1 apiVersion: v1  2 kind: Service  3 metadata:  4 name: svc-hpa  5 namespace: default  6 spec:  7  selector:  8  app: myapp  9  type: NodePort ##注意這里是NodePort,下面壓力測試要用到。 10  ports: 11 - name: http 12 port: 80 13 --- 14 apiVersion: apps/v1 15 kind: Deployment 16 metadata: 17  name: myapp 18 namespace: default 19 spec: 20 replicas: 1 21  selector: 22  matchLabels: 23  app: myapp 24  template: 25  metadata: 26 name: myapp-demo 27 namespace: default 28  labels: 29  app: myapp 30  spec: 31  containers: 32 - name: myapp 33 image: ikubernetes/myapp:v1 34  imagePullPolicy: IfNotPresent 35  ports: 36 - name: http 37 containerPort: 80 38  resources: 39  requests: 40  cpu: 50m 41  memory: 50Mi 42  limits: 43  cpu: 50m 44 memory: 50Mi

 

HPA資源清單如下:

 

 1 apiVersion: autoscaling/v2beta1  2 kind: HorizontalPodAutoscaler  3 metadata:  4 name: myapp-hpa-v2  5 namespace: default  6 spec:  7 minReplicas: 1 ##至少1個副本  8 maxReplicas: 8 ##最多8個副本  9  scaleTargetRef: 10 apiVersion: apps/v1 11  kind: Deployment 12  name: myapp 13  metrics: 14 - type: Resource 15  resource: 16  name: cpu 17 targetAverageUtilization: 50 ##注意此時是根據使用率,也可以根據使用量:targetAverageValue 18 - type: Resource 19  resource: 20  name: memory 21 targetAverageUtilization: 50 ##注意此時是根據使用率,也可以根據使用量:targetAverageValue

 

使用ab工具模擬壓力測試:

1 ab -c 1000 -n 5000000 http://192.168.1.103:31727/index.html

等待數分鍾后,查看hpa及pod數量

1 [root@K8s-master ~]# kubectl get hpa 2 NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE 3 myapp-hpa-v2 Deployment/myapp 5%/50%, 72%/50% 1 8 2 44m 4 [root@K8s-master ~]# kubectl get pods 5 NAME READY STATUS RESTARTS AGE 6 myapp-558db64459-pwzsd 1/1 Running 0 16m 7 myapp-558db64459-x9c4k 1/1 Running 0 23s


免責聲明!

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



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