HPA,是Horizontal Pod Autoscaler縮寫,是K8s實作Pod水準彈性伸縮的控制器。
伸縮規則有如下兩類
- 名額伸縮,設定Pod的cpu或記憶體使用率等監測名額,當達到門檻值後, 執行伸縮活動。
- 定時伸縮,設定定時任務執行伸縮。對于有顯著時間規律的業務場景,可以使用定時伸縮。
上述兩種伸縮類型隻是觸發規則不同,伸縮的實作方式相同。本文重點示範名額伸縮。
HPA工作原理
HPA修改ReplicaSet工作原理
HPA控制器,通過控制Deployment修改ReplicaSet數量,來調整Pod副本的數量。
HPA控制器從metrics api擷取資源度量名額(如CPU使用率),得到名額值後會去計算目前使用的百分比,然後與設定的資源使用率門檻值對比,以決定是否伸縮Pod。
為deployment建立HPA規則
K8s叢集内,HPA是作為一個API資源對象存在,每一條HPA規則都需要綁定deployment。
kubectl get hpa可以檢視namespace下的hpa,如以下執行個體,目前“xujianhua-gz”這個ns下還沒有建立hpa。
$ kubectl get hpa -n xujianhua-gz
No resources found in xujianhua-gz namespace.
ns下有wordpress的deployment。wordpress是一個部落格應用,本文選擇增加wordpress的并發,使得服務端CPU過載,來演練hpa的伸縮能力。
檢視deployment
在wordpress deployment下建立一條hpa規則。
$ kubectl autoscale deployment wordpress -n xujianhua-gz --cpu-percent=50 --min=1 --max=10. # 注意要用-n指定namespace參數,否則建立不成功
horizontalpodautoscaler.autoscaling/wordpress autoscaled #代表建立hpa成功
檢視hpa發現伸縮規則已建立成功,當cpu使用率達到50%便開始伸縮活動。
hpa規則
Tagets代表pod監測名額的使用率和門檻值。MINPODS代表最小的Pod副本數,MAXPODS代表最大副本數。REPLICAS代表目前副本數。HPA的功能就是按照名額規則在MINPODS和MAXPODS間調整REPLICAS的數值。
增加wordpress應用的負載
首先需要安裝一個Web服務壓測工具-http_load
http_load可以模拟多程序并發通路web網頁,本示例用來模拟對wordpress的高并發通路場景。
安裝http_load
wget http://www.acme.com/software/http_load/http_load-09Mar2016.tar.gz
tar zxvf http_load-09Mar2016.tar.gz & cd http_load-09Mar2016
make & make install
模拟并發通路wordpress
# 建立一個名為url.txt的檔案,把被壓測的網頁url寫進去。
touch url.txt
vim url.txt #脫敏的demo url :http://180.184.197.xx/
# http_load參數
#-p 并發通路程序數
#-f 總的通路次數
#-r 每秒的通路頻率
#-s 總的通路時間
http_load -p 100 -f 10000 url.txt
terminal中可以看到工具正在高頻通路目标站點
高并發現場
驗證HPA的伸縮效果
用kubectl的watch參數,監聽前文所建立的K8s hpa的活動記錄,會發現Replicas的數量從1迅速增長到10。
kubectl get hpa -n xujianhua-gz --watch
Pod副本數從1增加到10
從K8s 控制台,檢視Pod執行個體清單,壓測前和壓測後的對比如下所示。
壓測前
壓測後
總結
K8s原生支援的HPA功能,可以非常便捷地實作Pod的彈性伸縮,運維人員隻需要在K8s中為deployment開啟HPA,無需配置負載均衡,彈性伸縮等其他雲服務,運維成本大大降低。其次,Pod相比虛拟機,拉起時間更快,是以K8s架構下應用的彈性伸縮,比虛拟機環境伸縮速度更快,更能适應流量快速變化的業務需求。