K8S動(dòng)態(tài)擴(kuò)縮容-HPA

kubernetes Horizontal Pod Autoscaling

  1. 自動(dòng)擴(kuò)縮ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 數(shù)量
  2. 度量指標(biāo)可以是:CPU指標(biāo) 和 自定義
HPA 控制過(guò)程
  1. 實(shí)現(xiàn)自動(dòng)擴(kuò)縮容的原理官方文檔

    1. --horizontal-pod-autoscaler-sync-period=15s 控制器的自動(dòng)檢測(cè)周期。
    2. metrics-server 提供 metrics.k8s.io API 為pod資源的使用提供支持。
    3. 15s/周期 -> 查詢(xún)metrics.k8s.io API -> 算法計(jì)算 -> 調(diào)用scale 調(diào)度 -> 特定的擴(kuò)縮容策略執(zhí)行。
  2. HPA擴(kuò)縮容算法 期望副本數(shù) = ceil[當(dāng)前副本數(shù) * (度量指標(biāo) / 期望指標(biāo))]

    1. 擴(kuò)容
      1. 如果計(jì)算出的擴(kuò)縮比例接近 1.0, 將會(huì)放棄本次擴(kuò)縮, 度量指標(biāo) / 期望指標(biāo)接近1.0。
    2. 縮容
      1. 冷卻/延遲: 如果延遲(冷卻)時(shí)間設(shè)置的太短,那么副本數(shù)量有可能跟以前一樣出現(xiàn)抖動(dòng)。 默認(rèn)值是 5 分鐘(5m0s)--horizontal-pod-autoscaler-downscale-stabilization
    3. 特殊處理
      1. 丟失度量值:縮小時(shí)假設(shè)這些 Pod 消耗了目標(biāo)值的 100%, 在需要放大時(shí)假設(shè)這些 Pod 消耗了 0% 目標(biāo)值。 這可以在一定程度上抑制擴(kuò)縮的幅度。
      2. 存在未就緒的pod的時(shí)候:我們保守地假設(shè)尚未就緒的 Pod 消耗了期望指標(biāo)的 0%,從而進(jìn)一步降低了擴(kuò)縮的幅度。
      3. 未就緒的 Pod 和缺少指標(biāo)的 Pod 考慮進(jìn)來(lái)再次計(jì)算使用率。 如果新的比率與擴(kuò)縮方向相反,或者在容忍范圍內(nèi),則跳過(guò)擴(kuò)縮。 否則,我們使用新的擴(kuò)縮比例。
      4. 指定了多個(gè)指標(biāo), 那么會(huì)按照每個(gè)指標(biāo)分別計(jì)算擴(kuò)縮副本數(shù),取最大值進(jìn)行擴(kuò)縮。

HPA 對(duì)象定義

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  behavior:
  scaleDown:
    policies:
    - type: Pods
      value: 4
      periodSeconds: 60
    - type: Percent
      value: 10
      periodSeconds: 60
    stabilizationWindowSeconds: 300
  
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

HPA對(duì)象默認(rèn)行為

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
  scaleUp:
    stabilizationWindowSeconds: 0
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
    - type: Pods
      value: 4
      periodSeconds: 15
    selectPolicy: Max

metrics-server api github

為集群提供監(jiān)控性能參考是必須的。

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

遇到問(wèn)題請(qǐng)參考 issue

一個(gè)nginx的演示實(shí)例

---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
  namespace: lidj
spec:
  maxReplicas: 10
  metrics:
  - resource:
      name: cpu
      target:
        averageUtilization: 40
        type: Utilization
    type: Resource
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: lidj
spec:
  type: NodePort
  ports:
    - name: "http"
      port: 80
      targetPort: 80

  selector:
    service: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: lidj
spec:
  replicas: 1
  selector:
    matchLabels:
      service: nginx
  template:
    metadata:
      labels:
        service: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          resources:
            requests:
              cpu: 100m
              memory: 100Mi
            limits:
              cpu: 200m
              memory: 200Mi

使用壓測(cè)工具ab進(jìn)行

ab -n 100000 -c 800 http://10.22.112.223:43434

查看現(xiàn)象

[root@shifeinode5 ~]# kubectl get pods,hpa -n lidj | grep nginx
pod/nginx-866f647cbc-97qp2            0/1     ContainerCreating   0          11s
pod/nginx-866f647cbc-hf65d            0/1     ContainerCreating   0          11s
pod/nginx-866f647cbc-hq6b7            1/1     Running             0          19h
pod/nginx-866f647cbc-kp6jq            1/1     Running             0          23h
horizontalpodautoscaler.autoscaling/nginx   Deployment/nginx   97%/40%   2         20        2          23h
[root@shifeinode5 ~]# kubectl get pods,hpa -n lidj | grep nginx
pod/nginx-866f647cbc-5tlft            1/1     Running             0          22s
pod/nginx-866f647cbc-97qp2            1/1     Running             0          37s
pod/nginx-866f647cbc-bfc5f            0/1     ContainerCreating   0          22s
pod/nginx-866f647cbc-chl48            0/1     ContainerCreating   0          7s
pod/nginx-866f647cbc-dl4v8            1/1     Running             0          22s
pod/nginx-866f647cbc-hf65d            1/1     Running             0          37s
pod/nginx-866f647cbc-hq6b7            1/1     Running             0          19h
pod/nginx-866f647cbc-j5275            1/1     Running             0          22s
pod/nginx-866f647cbc-kp6jq            1/1     Running             0          23h
pod/nginx-866f647cbc-v5gpc            0/1     ContainerCreating   0          7s
horizontalpodautoscaler.autoscaling/nginx   Deployment/nginx   91%/40%   2         20        8          23h
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容