基于Heapster的HPA

概述

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并將其暴露成為服務

image

2.創(chuàng)建HPA


image

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


image

4.向php-apache服務增加負載,驗證自動擴縮容

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


image

5.觀察HPA是否生效


image

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

image

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

image

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

參考:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/autoscaling/horizontal-pod-autoscaler.md

本文為容器監(jiān)控實踐系列文章,完整內容見:container-monitor-book

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容