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
對於按 Pod 統計的資源指標(如 CPU),控制器從資源指標 API 中獲取每一個 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果設定了目標使用率, 控制器獲取每個 Pod 中的容器資源使用情況,並計算資源使用率。 如果設定了 target 值,將直接使用原始資料(不再計算百分比)。 接下來,控制器根據平均的資源使用率或原始值計算出擴縮的比例,進而計算出目標副本數
如果pod 使用opject指標和external指標(每個指標描述一個物件資訊)。 這個指標將直接跟據目標設定值相比較,並生成一個上面提到的擴縮比例。 在 autoscaling/v2beta2
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-stabilization
:kube-controller-manager
的這個引數表示縮容冷卻時間。 即自從上次縮容執行結束後,多久可以再次執行縮容,預設時間是 5 分鐘(5m0s
),防止抖動
測試案例
-
建立一個測試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
-
建立一個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
-
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
-
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