概述
Horizontal Pod Autoscaling,簡稱HPA,是Kubernetes中實現(xiàn)POD水平自動伸縮的功能。自動擴展主要分為兩種:
- 水平擴展(scale out),針對于實例數(shù)目的增減
- 垂直擴展(scal up),即單個實例可以使用的資源的增減, 比如增加cpu和增大內存
HPA屬于前者。它可以根據(jù)CPU使用率或應用自定義metrics自動擴展Pod數(shù)量(支持 replication controller、deployment 和 replica set)
節(jié)點擴縮容層面,k8s集群的Cluster Autoscaler持續(xù)監(jiān)控Pods,一旦發(fā)現(xiàn)Pods無法被schedule,則基于PodConditoin進行擴展,即node節(jié)點的自動擴縮容,具體內容在后續(xù)文章中介紹。
監(jiān)控數(shù)據(jù)獲取
Heapster: heapster收集Node節(jié)點上的cAdvisor數(shù)據(jù),并按照kubernetes的資源類型來集合資源。但是在v1.11中已經(jīng)被廢棄(heapster監(jiān)控數(shù)據(jù)可用,但HPA不再從heapster拿數(shù)據(jù))
metric-server: 在v1.8版本中引入,官方將其作為heapster的替代者。metric-server依賴于kube-aggregator,因此需要在apiserver中開啟相關參數(shù)。v1.11中HPA從metric-server獲取監(jiān)控數(shù)據(jù)
工作流程
- 1.創(chuàng)建HPA資源,設定目標CPU使用率限額,以及最大、最小實例數(shù), 一定要設置Pod的資源限制參數(shù): request, 否則HPA不會工作。
- 2.控制管理器每隔30s(可以通過–horizontal-pod-autoscaler-sync-period修改)查詢metrics的資源使用情況
- 3.然后與創(chuàng)建時設定的值和指標做對比(平均值之和/限額),求出目標調整的實例個數(shù)
- 4.目標調整的實例數(shù)不能超過1中設定的最大、最小實例數(shù),如果沒有超過,則擴容;超過,則擴容至最大的實例個數(shù)
如何部署:
- 1.6-1.8版本默認使用heapster
- 1.11版本及以上默認使用metric-server(需單獨安裝,并開啟參數(shù))
1.部署和運行php-apache并將其暴露成為服務

2.創(chuàng)建HPA

如果為1.8及以下的k8s集群,指標正常,如果為1.11集群,需要執(zhí)行如下操作。

4.向php-apache服務增加負載,驗證自動擴縮容
啟動一個容器,并通過一個循環(huán)向php-apache服務器發(fā)送無限的查詢請求(請在另一個終端中運行以下命令)

5.觀察HPA是否生效

用yaml創(chuàng)建HPA的方式為:

實現(xiàn)細節(jié)

HPA由一個控制循環(huán)實現(xiàn),循環(huán)周期由--horizontal-pod-autoscaler-sync-period 標志指定,默認是30秒,每個周期內,controller-manager會查詢HPA中定義的metric的資源利用率。
如上例子,pod的request定義為200M,而HPA定義的target為50%,即HPA將通過增加或者減少Pod副本的數(shù)量(通過Deployment)以保持所有Pod的平均CPU利用率在50%以內(即200*0.5=100M以內),循環(huán)周期到達時,獲取pod的1分鐘內的平均cpu利用率(從heaspter),發(fā)現(xiàn)超過了100M,為332M,于是通過下面的公式,決定最終的pod數(shù)量
TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
即 332/50 =6.xxx ceil為向上取整,得到7。如果得到的結果大于10,則為10
因為每次HPA生效都會創(chuàng)建或者刪除pod,而這些操作其實會影響到metric監(jiān)控值,如創(chuàng)建pod會暫時性的升高cpu,因此每次擴容都要間隔3分鐘,縮容需要間隔5分鐘。且需要滿足:avg(CurrentPodsConsumption)/ Target下降9%,進行縮容,增加至10%才進行擴容
這樣做好處是:
1、判斷的精度高,不會頻繁的擴縮pod,造成集群壓力大。
2、避免頻繁的擴縮pod,防止應用訪問不穩(wěn)定
實現(xiàn)hpa的條件:
1、hpa不能autoscale daemonset類型control
2、要實現(xiàn)autoscale,pod必須設置request
本文為容器監(jiān)控實踐系列文章,完整內容見:container-monitor-book