Kubernetes Pod水平自動伸縮(HPA)


HPA簡介

HAP,全稱 Horizontal Pod Autoscaler, 可以基於 CPU 利用率自動擴縮 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 數量。 除了 CPU 利用率,也可以基於其他應程序提供的自定義度量指標來執行自動擴縮。 Pod 自動擴縮不適用於無法擴縮的對象,比如 DaemonSet。
Pod 水平自動擴縮特性由 Kubernetes API 資源和控制器實現。資源決定了控制器的行為。 控制器會周期性的調整副本控制器或 Deployment 中的副本數量,以使得 Pod 的平均 CPU 利用率與用戶所設定的目標值匹配。

Pod HAP工作機制示意圖

實際生產中,廣泛使用這四類指標:
1、Resource metrics - CPU核內存利用率指標
2、Pod metrics - 例如網絡利用率和流量
3、Object metrics - 特定對象的指標,比如Ingress, 可以按每秒使用請求數來擴展容器
4、Custom metrics - 自定義監控,比如通過定義服務響應時間,當響應時間達到一定指標時自動擴容

好了,概念就說這些,想了解更多,請參看官網,現在開始實戰。

示例

1、首先我們部署一個nginx,副本數為2,請求cpu資源為200m。同時為了便宜測試,使用NodePort暴露服務。命名空間:hpa

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: hpa
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources:
          requests:
            cpu: 200m
            memory: 100Mi
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: hpa
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

2、查看部署結果

[root@k8s-node001 HPA]# kubectl  get po -n hpa
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5c87768685-48b4v   1/1     Running   0          8m38s
nginx-5c87768685-kfpkq   1/1     Running   0          8m38s

3、創建HPA
簡單說下:這里創建一個HPA,用於控制我們上一步驟中創建的 Deployment,使 Pod 的副本數量維持在 1 到 10 之間。
HPA 將通過增加或者減少 Pod 副本的數量(通過 Deployment)以保持所有 Pod 的平均 CPU 利用率在 50% 以內。
算法參見

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
  namespace: hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

4、查看部署結果

[root@k8s-node001 HPA]# kubectl  get hpa -n hpa
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%      1                10                 2          50s

5、壓測,觀察Pod數和HPA變化
執行壓測命令

[root@k8s-node001 ~]# ab -c 1000 -n 100000000 http://192.168.100.185:30792/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.100.185 (be patient)

觀察變化

[root@k8s-node001 HPA]#  kubectl  get hpa -n hpa
NAME    REFERENCE          TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   303%/50%   1         10        7          12m

[root@k8s-node001 HPA]# kubectl  get po -n hpa
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-5c87768685-6b4sl   1/1     Running   0          85s
pod/nginx-5c87768685-99mjb   1/1     Running   0          69s
pod/nginx-5c87768685-cls7r   1/1     Running   0          85s
pod/nginx-5c87768685-hhdr7   1/1     Running   0          69s
pod/nginx-5c87768685-jj744   1/1     Running   0          85s
pod/nginx-5c87768685-kfpkq   1/1     Running   0          27m
pod/nginx-5c87768685-xb94x   1/1     Running   0          69s

從以上輸出可以看出,hpa TARGETS達到了303%,需要擴容。pod數自動擴展到了7個。
繼續等待壓測結束或者直接打斷壓測

[root@k8s-node001 ~]# kubectl get hpa -n hpa
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   20%/50%   1         10        7          16m

。。。N分鍾后。。。

[root@k8s-node001 ~]# kubectl get hpa -n hpa
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        7          18m

。。。再過N分鍾后。。。

[root@k8s-node001 ~]# kubectl  get po -n hpa
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5c87768685-jj744   1/1     Running   0          11m

這時,CPU 利用率已經降到 0,所以 HPA 將自動縮減副本數量至 1。
這里需要注意下:為什么會將副本數降為1,而不是我們部署時指定的replicas: 2呢?
因為在創建HPA時,指定了副本數范圍,這里是minReplicas: 1,maxReplicas: 10。所以HPA在縮減副本數時減到了1。
Tips: 自動擴縮完成副本數量的改變可能需要幾分鍾的時間。

總結


免責聲明!

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



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