Openshift HPA(Horizontal Pod Autosc

jerrysun發表於2021-09-09

1、HPA介紹

HPA(Horizontal Pod Autoscaler)是Openshift中的一個非常重要的物件,它定義了系統如何根據收集對應的Pod的狀態(CPU/Memory)對DeploymentConfig、ReplicationController物件進行擴容與縮容。

  • HPA依賴於收集到的Pod資源的使用狀態,所以要使HPA生效,Openshift必須安裝好cluster metrics應用。

  • 被監控的pod必須設定好了spec.containers.resources.requests屬性,HPA才能正常工作。

  • 僅支援CPU/Memory使用率的判斷,如果自定義監控項,只能使用經驗值,不能使用使用率。

  • 支援物件:DeploymentConfig、ReplicationController、Deployment、Replica Set。


    圖片描述

    HPA實現Pod伸縮.JPG

2. HPA伸縮過程及演算法

HPA進行伸縮過程

  1. 收集該HPA控制下所有Pod最近的cpu使用情況(CPU utilization)

  2. 對比在擴容條件裡記錄的cpu限額(CPUUtilization)

  3. 調整例項數(必須要滿足不超過最大/最小例項數)

  4. 每隔30s做一次自動擴容的判斷
    說明:

  • CPU utilization的計算方法是用cpu usage(最近一分鐘的平均值,透過heapster可以直接獲取到)除以cpu request(這裡cpu request就是我們在建立容器時制定的cpu使用核心數)得到一個平均值,這個平均值可以理解為:平均每個Pod CPU核心的使用佔比。

  • 最重要的步驟為3,這裡即為HPA的演算法,計算當前需要啟動幾個Pod

HPA進行伸縮演算法

分為三種情況:

  1. 普通情況下啟動Pod數量計算方式

TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

說明:

  • ceil()表示取大於或等於某數的最近一個整數

例子:
我們有一個叢集例項數是3 pods,同時Pod的cpu資源的Request為1.4。cpu限額,即Target是CPU使用率為80%,當cpu的使用量CurrentPodsCPUUtilization為1.1,1.4,1.3時,要擴容成多少個呢?

ceil((1.1+1.4+1.3)/1.4/0.8)= 4

所以擴容成四個例項。

  1. 例項剛啟動時及剛完成擴容/縮容,會有一段冷卻時間
    由於啟動例項時cpu的使用度會陡增,所以自動擴容會等待一段時間以收集準確的執行時監控資料。每次擴容後冷卻3分鐘才能再次進行擴容,而縮容則要等5分鐘後。這是因為自動擴容使用保守的方法,儘可能滿足pods業務的正常使用,所以擴容的優先順序要大於縮容。

  2. 當前Pod Cpu使用率與目標使用率接近時,不會觸發擴容
    當滿足以下條件才會真正觸發擴容/縮容:

avg(CurrentPodsConsumption) / Target >1.1 或 <0.9

這是為了避免出現頻繁的擴容縮容。
擴容條件的相對與絕對度量
例子:
我們有一個叢集例項數是3 pods,同時Pod的cpu資源的Request為1.5。cpu限額,即Target是CPU使用率為80%,當cpu的使用量CurrentPodsCPUUtilization為1.1,1.4,1.3時,會不會發生擴容,要擴容成多少個呢?

ceil((1.1+1.4+1.3)/1.5/0.8)= 4

按照我們1的說法,它再新增一個pod。但是我們再來算下當前Pod使用率與目標使用率情況。

(1.1 + 1.4 + 1.3)/3/1.5 = 0.84444 #當前Pod CPU平均使用率0.84444 / 0.8 = 1.055555 < 1.1 #當前Pod CPU平均使用率與目標CPU使用率比

綜上:1.0555 < 1.1,當前HPA並不會發生擴容,所以最終Pod數仍然是3個。

實戰

為 dc/nginx-demo 建立一個 HPA (最小為1個pod,最多為3個pod,cpu使用率目標值為80%)

oc autoscale dc/nginx-demo--min=1 --max=3 --cpu-percent=80

檢視當前hpa狀態

[root@demo ~]# oc delete hpa hpa-resource-metrics-memory horizontalpodautoscaler "hpa-resource-metrics-memory" deleted
[root@demo ~]# oc describe hpa nginx-demo Name:                                                  nginx-demo
Namespace:                                             testmysql
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Wed, 06 Jun 2018 10:36:57 +0800Reference:                                             DeploymentConfig/nginx-demo
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  0% (0) / 80%
Min replicas:                                          1Max replicas:                                          3Conditions:
  Type            Status  Reason            Message
  ----            ------  ------            -------
  AbleToScale     True    ReadyForNewScale  the last scale time was sufficiently old as to warrant a new scale
  ScalingActive   True    ValidMetricFound  the HPA was able to succesfully calculate a replica count from cpu resource utilization (percentage of request)
  ScalingLimited  True    TooFewReplicas    the desired replica count is more than the maximum replica count
Events:           <none>

為dc/nginx-demo建立一個HPA(最小為1個pod,最多為3個pod,memory使用率目標值50%)

與CPU使用率作為目標值不同,memory使用率不能使用oc autoscale命令來建立,只能透過yaml檔案來建立

# hpa-memory.ymlapiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory 
spec:
  scaleTargetRef:
    apiVersion: apps.openshift.io/v1
    kind: DeploymentConfig
    name: nginx-demo
  minReplicas: 1 
  maxReplicas: 3 
  metrics:
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 50
oc create -f hpa-memory.yml

檢視當前hpa狀態

[root@demo~]# oc describe hpa hpa-resource-metrics-memory Name:                                                     hpa-resource-metrics-memory
Namespace:                                                testmysql
Labels:                                                   <none>
Annotations:                                              <none>
CreationTimestamp:                                        Wed, 06 Jun 2018 10:28:59 +0800Reference:                                                DeploymentConfig/nginx-demo
Metrics:                                                  ( current / target )
  resource memory on pods  (as a percentage of request):  1% (1347584) / 50%
Min replicas:                                             1Max replicas:                                             3Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive   True    ValidMetricFound    the HPA was able to succesfully calculate a replica count from memory resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:
  Type     Reason          Age              From                       Message
  ----     ------          ----             ----                       -------
  Warning  FailedGetScale  5m (x6 over 8m)  horizontal-pod-autoscaler  no matches for apps/, Kind=DeploymentConfig
  Warning  FailedGetScale  4m (x3 over 5m)  horizontal-pod-autoscaler  no matches for apps/, Kind=ReplicationController
  Warning  FailedGetScale  3m               horizontal-pod-autoscaler  replicationcontrollers/scale.autoscaling "nginx-demo" not found

         

             




作者:潘曉華Michael
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/151/viewspace-2820638/,如需轉載,請註明出處,否則將追究法律責任。

相關文章