前言
在(zai)kubernetes中(zhong),我們使用(yong)pod對外(wai)提(ti)供服務。這(zhe)時候,我們需要以下(xia)兩種情形需要關(guan)注:
Pod因(yin)為不(bu)(bu)明(ming)原因(yin)掛(gua)掉,導(dao)致服務不(bu)(bu)可用
Pod在高負荷(he)的(de)情況(kuang)下(xia),不能(neng)支撐我們(men)的(de)服(fu)務
如(ru)果我們(men)人工(gong)(gong)監控pods,人工(gong)(gong)進行調整副(fu)本那么(me)這個工(gong)(gong)作量無疑(yi)是巨(ju)大的(de),但kubernetes已經有了(le)相應的(de)機制來(lai)應對(dui)了(le)。
HPA全稱Horizontal Pod Autoscaler控制器工作流程(V1版本)
更詳(xiang)細的介紹參考官方(fang)文(wen)檔(dang)Horizontal Pod Autoscaler
- 流程
創(chuang)建(jian)HPA資源對(dui)象,關聯(lian)對(dui)應(ying)資源例(li)如(ru)Deployment,設定(ding)目標CPU使用率閾值,最(zui)大(da),最(zui)小replica數量。
前提:pod一定要設置資源限制(zhi),參數(shu)request,HPA才(cai)會工作。
HPA控制器每隔15秒鐘(可(ke)以通(tong)過設(she)置controller manager的–horizontal-pod-autoscaler-sync-period參數設(she)定,默(mo)認15s)通(tong)過觀測metrics值獲取(qu)資源使用信息
HPA控(kong)制器將獲取資源使用信息與HPA設定值進行對比(bi),計(ji)算出需要調整的(de)副本數量
根(gen)據(ju)計算(suan)結果(guo)調整副本數量(liang),使得單個POD的CPU使用率盡量(liang)逼近期望值,但不能(neng)照顧設定的最(zui)大(da),最(zui)小值。
以上2,3,4周期(qi)循環
- 周期
HPA控(kong)制器觀(guan)測資源(yuan)使用(yong)率并(bing)作出決策(ce)是(shi)有周(zhou)期的(de),執(zhi)行(xing)是(shi)需要時間的(de),在執(zhi)行(xing)自動(dong)伸縮(suo)過程中metrics不(bu)是(shi)靜止不(bu)變的(de),可能(neng)(neng)降低或者升高,如果(guo)執(zhi)行(xing)太(tai)頻繁可能(neng)(neng)導致資源(yuan)的(de)使用(yong)快速(su)抖動(dong),因此(ci)控(kong)制器每次(ci)決策(ce)后的(de)一段時間內不(bu)再(zai)進行(xing)新的(de)決策(ce)。對(dui)于擴(kuo)容(rong)這個(ge)時間是(shi)3分鐘(zhong),縮(suo)容(rong)則(ze)是(shi)5分鐘(zhong),對(dui)應調整參數
--horizontal-pod-autoscaler-downscale-delay --horizontal-pod-autoscaler-upscale-delay
自動伸縮不(bu)是一次到位的,而是逐漸逼近計算值(zhi),每(mei)次調(diao)整(zheng)不(bu)超過當(dang)前副本數量的2倍或者(zhe)1/2
本(ben)記錄是(shi)(shi)對kubernetes HPA功(gong)能的驗證,參考(kao)kubernetes官方文檔(dang)(dang),使用的是(shi)(shi)官方文檔(dang)(dang)提供的鏡像php-apache進行(xing)測試。
metrics server
kubernetes集群需(xu)要配置(zhi)好metrics server,配置(zhi)參考文(wen)檔Kubernetes部署metrics-server
配置HPA實現應用橫向擴展
1. 配置啟動deployment:php-apache
cat hpa-deployment.ymal
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
  labels:
    app: hpa-test
spec:
  replicas: 1
  selector:
    matchLabels:
      name: php-apache
      app: hpa-test
  template:
    metadata:
      labels:
        name: php-apache
        app: hpa-test
    spec:
      containers:
      - name: php-apache
        image: mirrorgooglecontainers/hpa-example:latest
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        resources:
          requests:
            cpu: 0.005
            memory: 64Mi
          limits:
            cpu: 0.05
            memory: 128Mi
2. 配置service: php-apache-svc
cat hpa-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: php-apache-svc
  labels:
    app: hpa-test
spec:
  selector:
    name: php-apache
    app: hpa-test
  ports:
  - name: http
    port: 80
    protocol: TCP
3. 配置hpa:php-apache-hpa
cat hpa-hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache-hpa
  labels:
    app: hpa-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50
4. 啟動deployment,service,hpa,并驗證
# kubectl apply -f ./ deployment.apps/php-apache configured service/php-apache-svc unchanged horizontalpodautoscaler.autoscaling/php-apache-hpa unchanged # kubectl get all NAME READY STATUS RESTARTS AGE pod/php-apache-6b9f498dc4-vwlfr 1/1 Running 0 3h14m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d20h service/php-apache-svc ClusterIP 10.104.34.168 <none> 80/TCP 3h14m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/php-apache 1/1 1 1 3h14m NAME DESIRED CURRENT READY AGE replicaset.apps/php-apache-6b9f498dc4 1 1 1 3h14m NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE horizontalpodautoscaler.autoscaling/php-apache-hpa Deployment/php-apache 20%/50% 1 10 1 3h14m
壓(ya)力測(ce)試(shi),觀察HPA效果
1.生成(cheng)一個壓(ya)測客戶端(duan),持續壓(ya)力測試
kubectl run --generator=run-pod/v1 -i --tty load-generator --image=busybox /bin/sh # while true; do wget -q -O- //php-apache-svc.default.svc.cluster.local; done OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!
2.壓測一(yi)下(xia),觀察結(jie)果
kubectl get hpa
    NAME             REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    php-apache-hpa   Deployment/php-apache   800%/50%   1         10        1          27m
kubectl get hpa
    NAME             REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    php-apache-hpa   Deployment/php-apache   1000%/50%   1         10        2          27m
kubectl get hpa
    NAME             REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    php-apache-hpa   Deployment/php-apache   1000%/50%   1         10        4          27m
kubectl get hpa
    NAME             REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    php-apache-hpa   Deployment/php-apache   1000%/50%   1         10        8          27m
kubectl get hpa
    NAME             REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    php-apache-hpa   Deployment/php-apache   120%/50%   1         10        10         27m
kubectl get deployment php-apache
    NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    php-apache   10/10   10           10          28m
結論:隨著壓(ya)力(li)測試進行,deployment下pod的(de)CPU使用率增加,超過HPA設(she)定的(de)百分比50%,之后逐次翻(fan)倍擴容replicaset。達到上限停(ting)止擴容。根據replicaset設(she)置(zhi)的(de)request QoS逐漸穩(wen)定資源(yuan)的(de)使用率。
3.停止壓測
while true; do wget -q -O- //php-apache-svc.default.svc.cluster.local; done OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!wget: can't connect to remote host (10.104.63.73): Connection refused OK!OK!OK!OK!OK!OK!........OK!OK!OK! ^C / # exit / # Session ended, resume using 'kubectl attach load-generator -c load-generator -i -t' command when the pod is running
CPU使用(yong)率(lv)恢(hui)復到最(zui)初值(zhi)(zhi)20%,controller會周期觀測,逐次縮容到最(zui)小(xiao)值(zhi)(zhi)。
kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache-hpa Deployment/php-apache 20%/50% 1 10 10 36m #等待幾分鐘之后(默認5分鐘),原因: kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache-hpa Deployment/php-apache 20%/50% 1 10 4 41m #再次等待幾分鐘后(默認5分鐘) kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache-hpa Deployment/php-apache 20%/50% 1 10 2 46m #再次等待幾分鐘后(默認5分鐘),穩定在最小副本數量 kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache-hpa Deployment/php-apache 20%/50% 1 10 1 53m
其他
以上測試驗證了HPA功能,使用(yong)的(de)API版(ban)(ban)本是autoscaling/v1。通過kubectl api-versions可(ke)以查看到存在3個版(ban)(ban)本。v1版(ban)(ban)本只(zhi)支(zhi)持CPU,v2beta2版(ban)(ban)本支(zhi)持多metrics(CPU,memory)以及自定義metrics。基于(yu)autoscaling/v2beta2的(de)hpa yaml文件寫法
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache-hpa
  labels:
    app: hpa-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
————————————————
版權(quan)聲明:本(ben)文為CSDN博主「把酒問(wen)蒼(cang)天(tian)」的原創文章(zhang),遵循(xun)CC 4.0 BY-SA版權(quan)協議,轉載請附上(shang)原文出處鏈接及本(ben)聲明。
原(yuan)文鏈接(jie)://blog.csdn.net/bjwf125/article/details/100702935
