HPA介紹


一、什么是HPA?

HPA(Horizontal Pod Autoscaler,水平Pod自動伸縮器)可根據觀察到的CPU、內存使用率或自定義度量標准來自動擴展或縮容Pod的數量。HPA不適用於無法縮放的對象,比如DaemonSet
HPA控制器會定期調整RC或Deployment的副本數,以使觀察到的平均CPU利用率與用戶指定的目標相匹配
HPA需要metrics-server(項目地址:https://github.com/kubernetes-incubator/metrics-server)獲取度量指標,由於在高可用集群安裝中已經安裝了metrics-server,所以本節的實踐部分無須再次安裝

二、HPA原理

2.1、為什么要使用HPA

    在生產環境中,總會有一些意想不到的事情發生,比如公司網站流量突然升高,此時之前創建的Pod已不足以撐住所有的訪問,而運維人員也不可能24小時守着業務服務,這時就可以通過配置HPA,實現負載過高的情況下自動擴容Pod副本數以分攤高並發的流量,當流量恢復正常后,HPA會自動縮減Pod的數量

2.2、HPA中一些細節的處理

噪聲處理:
    通過上面的公式可以發現,Target的數目很大程度上會影響最終的結果,而在Kubernetes中,無論是變更或者升級,都更傾向於使用Recreate而不是Restart的方式進行處理。這就導致了在Deployment的生命周期中,可能會出現某一個時間,Target會由於計算了Starting或者Stopping的的Pod而變得很大。這就會給HPA的計算帶來非常大的噪聲,在HPA Controller的計算中,如果發現當前的對象存在Starting或者Stopping的Pod會直接跳過當前的計算周期,等待狀態都變為Running再進行計算。

冷卻周期:
	在彈性伸縮中,冷卻周期是不能逃避的一個話題,很多時候我們期望快速彈出與快速回收,而另一方面,我們又不希望集群震盪,所以一個彈性伸縮活動冷卻周期的具體數值是多少,一直被開發者所挑戰。在HPA中,默認的擴容冷卻周期是3分鍾,縮容冷卻周期是5分鍾。

邊界值計算:
	我們回到剛才的計算公式,第一次我們算出需要彈出的容器數目是5,此時擴容后整體的負載是42%,但是我們似乎忽略了一個問題,一個全新的Pod啟動會不會自己就占用了部分資源?此外,8%的緩沖區是否就能夠緩解整體的負載情況,要知道當一次彈性擴容完成后,下一次擴容要最少等待3分鍾才可以繼續擴容。為了解決這些問題,HPA引入了邊界值△,目前在計算邊界條件時,會自動加入10%的緩沖,這也是為什么在剛才的例子中最終的計算結果為6的原因

2.3、原理

通過集群內的資源監控系統(metrics-server),來獲取集群中資源的使用狀態。
根據CPU、內存、以及用戶自定義的資源指標數據的使用量或連接數為參考依據,來制定一個臨界點,一旦超出這個點,HPA就會自動創建出pod副本
HPA通過定期(定期輪詢的時間通過–horizontal-pod-autoscaler-sync-period選項來設置,默認的時間為30秒)通過Status.PodSelector來查詢pods的狀態,獲得pod的CPU使用率。然后,通過現有pods的CPU使用率的平均值(計算方式是最近的pod使用量(最近一分鍾的平均值,從metrics-serve中獲得)

除以設定的每個Pod的CPU使用率限額)跟目標使用率進行比較,並且在擴容時,還要遵循預先設定的副本數限制:MinReplicas <= Replicas <= MaxReplicas。

計算擴容后Pod的個數:sum(最近一分鍾內某個Pod的CPU使用率/量的平均值)/CPU使用上限的整數+1

流程
1、創建HPA資源,設定目標CPU使用率限額,以及最大、最小實例數
2、收集一組中(PodSelector)每個Pod最近一分鍾內的CPU使用率,並計算平均值
3、讀取HPA中設定的CPU使用限額
4、計算:平均值之和/限額,求出目標調整的實例個數
5、目標調整的實例數不能超過1中設定的最大、最小實例數,如果沒有超過,則擴容;超過,則擴容至最大的實例個數
6、回到2,不斷循環

三、實現一個Web服務器的自動伸縮特性

使HPA生效前提:

​ 必須定義 requests參數,必須安裝metrics-server

# 1、運行hpa資源,名稱為php-apache,並設置請求CPU的資源為200m並暴露一個80端口
[root@k8s-master01 ~]#  kubectl run php-apache --image=mirrorgooglecontainers/hpa-example --requests=cpu=200m --expose --port=80
service/php-apache created
pod/php-apache created

# 2、當hpa資源的deployment資源對象的CPU使用率達到20%時,就進行擴容,最多可以擴容到5個
[root@k8s-master01 ~]# kubectl autoscale deployment php-apache --cpu-percent=20 --min=1 --max=5

# 3、確定當前的pod正常運行
[root@master ~]#  kubectl get pod | grep php-apa    
php-apache-867f97c8cb-9mpd6   1/1     Running   0          44m

​ 模擬消耗php-apache的資源,並驗證pod是否會自動擴容與縮容

#  新開啟多個終端(也可使用node節點),對php-apache的pod進行死循環請求,如下(如果你的系統資源比較充足,可以選擇開啟多個終端,對pod進行死循環請求
while true; do wget -q -O- 10.97.45.108; done

# 然后查看數量
[root@master ~]# kubectl get pod

# 當停止死循環請求后,也並不會立即減少pod數量,會等一段時間后減少pod數量,防止流量再次激增。

# 至此,HPA實現pod副本數量的自動擴容與縮容就實現了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM