1. 程式人生 > 其它 >Kubernetes HPA (Horizontal Pod Autoscaler)

Kubernetes HPA (Horizontal Pod Autoscaler)

HPA功能概述


Pod水平自動擴縮,可以基於CPU/Memroy的使用率或者當前使用值進行自動擴縮容(kubernetes 1.6+可支援對記憶體擴縮),當然也基於其它自定義metrcis name進行擴縮容(kubernetes 1.6+)支援kubernetes的副本集包括deployment replicaSet ReplicationController

Pod 水平自動擴縮特性由 Kubernetes API 資源和控制器實現。資源決定了控制器的行為。 控制器會週期性的調整副本控制器或 Deployment 中的副本數量,以使得 Pod 的平均 CPU 利用率與使用者所設定的目標值匹配,由控制器管理器的 --horizontal-pod-autoscaler-sync-period

 引數指定週期(預設值為 15 秒)

對於按 Pod 統計的資源指標(如 CPU),控制器從資源指標 API 中獲取每一個 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果設定了目標使用率, 控制器獲取每個 Pod 中的容器資源使用情況,並計算資源使用率。 如果設定了 target 值,將直接使用原始資料(不再計算百分比)。 接下來,控制器根據平均的資源使用率或原始值計算出擴縮的比例,進而計算出目標副本數

如果pod 使用opject指標和external指標(每個指標描述一個物件資訊)。 這個指標將直接跟據目標設定值相比較,並生成一個上面提到的擴縮比例。 在 autoscaling/v2beta2

 版本API中,這個指標也可以根據 Pod 數量平分後再計算

HPA計算方式


期望副本數 = ceil[當前副本數 * (當前指標 / 期望指標)]

如果 HorizontalPodAutoscaler 指定的是targetAverageValue 或 targetAverageUtilization, 那麼將會把指定 Pod 度量值的平均值做為 currentMetricValue。 然而,在檢查容忍度和決定最終擴縮值前,仍然會把那些無法獲取指標的 Pod 統計進去

當使用CPU指標進行HPA時,任何還未就緒(例如還在初始化)狀態的 Pod  最近的指標 度量值採集於就緒狀態前的 Pod,該 Pod 也會被擱置。

  • --horizontal-pod-autoscaler-initial-readiness-delay 引數(預設為 30s)用於設定 Pod 準備時間, 在此時間內的 Pod 統統被認為未就緒

  • --horizontal-pod-autoscaler-cpu-initialization-period 引數(預設為5分鐘) 用於設定 Pod 的初始化時間, 在此時間內的 Pod,CPU 資源度量值將不會被採納

  • --horizontal-pod-autoscaler-downscale-stabilizationkube-controller-manager 的這個引數表示縮容冷卻時間。 即自從上次縮容執行結束後,多久可以再次執行縮容,預設時間是 5 分鐘(5m0s),防止抖動

測試案例


  1. 建立一個測試deployment副本集,如下

    kubectl apply -f php-apache.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: php-apache
    spec:
      selector:
        matchLabels:
          run: php-apache
      replicas: 1
      template:
        metadata:
          labels:
            run: php-apache
        spec:
          containers:
          - name: php-apache
            image: k8s.gcr.io/hpa-example
            ports:
            - containerPort: 80
            resources:
              limits:
                cpu: 500m
                memory: 200M
              requests:
                cpu: 200m
                memory: 100M
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: php-apache
      labels:
        run: php-apache
    spec:
      ports:
      - port: 80
      selector:
        run: php-apache
  2. 建立一個HPA策略,如下

     kubectl apply -f hpa-v2.yaml

    piVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: php-apache
      namespace: default
    spec:
      minReplicas: 1
      maxReplicas: 10
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: php-apache
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            averageUtilization: 50
            type: Utilization
      - type: Resource
        resource:
          name: memory
          target:
            averageUtilization: 80
            type: Utilization
  3. memroy壓力測試,如下

    <root@HK-K8S-CP ~># kubectl exec -it php-apache-69475dc47c-9snfm -- bash
    # 安裝stress
    root@php-apache-69475dc47c-9snfm:/var/www/html# apt-get update
    Ign http://httpredir.debian.org jessie InRelease
    Get:1 http://security.debian.org jessie/updates InRelease [44.9 kB]
    Get:2 http://httpredir.debian.org jessie-updates InRelease [16.3 kB]                                                                                                                                            
    Get:3 http://httpredir.debian.org jessie Release.gpg [1652 B]                                                                                                                                                   
    Get:4 http://httpredir.debian.org jessie Release [77.3 kB]                                                                                                                                                      
    Get:5 http://security.debian.org jessie/updates/main amd64 Packages [992 kB]                                                                                                                                    
    Get:6 http://httpredir.debian.org jessie-updates/main amd64 Packages [20 B]                                                                                                                                     
    Get:7 http://httpredir.debian.org jessie/main amd64 Packages [9098 kB]                                                                                                                                          
    Fetched 10.2 MB in 37s (274 kB/s)                                                                                                                                                                               
    Reading package lists... Done
    W: There is no public key available for the following key IDs:
    AA8E81B4331F7F50
    root@php-apache-69475dc47c-9snfm:/var/www/html# apt-get install stress
    Reading package lists... Done
    Building dependency tree      
    Reading state information... Done
    The following NEW packages will be installed:
      stress
    0 upgraded, 1 newly installed, 0 to remove and 102 not upgraded.
    Need to get 18.5 kB of archives.
    After this operation, 44.0 kB of additional disk space will be used.
    Get:1 http://httpredir.debian.org/debian/ jessie/main stress amd64 1.0.1-1+deb8u1 [18.5 kB]
    Fetched 18.5 kB in 0s (0 B/s)   
    debconf: delaying package configuration, since apt-utils is not installed
    Selecting previously unselected package stress.
    (Reading database ... 12878 files and directories currently installed.)
    Preparing to unpack .../stress_1.0.1-1+deb8u1_amd64.deb ...
    Unpacking stress (1.0.1-1+deb8u1) ...
    Setting up stress (1.0.1-1+deb8u1) ...
     
    # stress 壓力測試,引數解釋,新建3個IO程序,3個寫程序,每次寫入分配50M的記憶體,分配後不釋放,測試100秒
    root@php-apache-69475dc47c-9snfm:/var/www/html# stress -i 3 --vm 3 --vm-bytes 50M --vm-hang 100 --timeout 100s
    stress: info: [99] dispatching hogs: 0 cpu, 3 io, 3 vm, 0 hdd
    stress: info: [99] successful run completed in 100s
     
     
    #觀察HPA策略,如下
    <root@HK-K8S-CP ~># kubectl get hpa
    NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   168%/80%   1         10        3          105m
    <root@HK-K8S-CP ~># kubectl get hpa
    NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   168%/80%   1         10        3          105m
  4. CPU壓力測試,如下

    # 增加4個cpu程序,處理sqrt()函式函式,以提高系統CPU負荷
    root@php-apache-69475dc47c-9snfm:/var/www/html# stress -c 4 
    stress: info: [107] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
     
     
    <root@HK-K8S-CP ~># kubectl get hpa
    NAME         REFERENCE               TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   9%/80%, 1%/50%   1         10        1          4h46m
    <root@HK-K8S-CP ~># kubectl get hpa
    NAME         REFERENCE               TARGETS             MINPODS   MAXPODS   REPLICAS   AGE
    php-apache   Deployment/php-apache   10%/80%, 194%/50%   1         10        4          4h47m