基於Heapster的HPA
概述
Horizontal Pod Autoscaling,簡稱HPA,是Kubernetes中實現POD水平自動伸縮的功能。自動擴充套件主要分為兩種:
水平擴充套件(scale out),針對於例項數目的增減
垂直擴充套件(scal up),即單個例項可以使用的資源的增減, 比如增加cpu和增大記憶體
HPA屬於前者。它可以根據CPU使用率或應用自定義metrics自動擴充套件Pod數量(支援 replication controller、deployment 和 replica set)
節點擴縮容層面,k8s叢集的Cluster Autoscaler持續監控Pods,一旦發現Pods無法被schedule,則基於PodConditoin進行擴充套件,即node節點的自動擴縮容,具體內容在後續文章中介紹。
監控資料獲取
Heapster: heapster收集Node節點上的cAdvisor資料,並按照kubernetes的資源型別來集合資源。但是在v1.11中已經被廢棄(heapster監控資料可用,但HPA不再從heapster拿資料)
metric-server: 在v1.8版本中引入,官方將其作為heapster的替代者。metric-server依賴於kube-aggregator,因此需要在apiserver中開啟相關引數。v1.11中HPA從metric-server獲取監控資料
工作流程
1.建立HPA資源,設定目標CPU使用率限額,以及最大、最小例項數, 一定要設定Pod的資源限制引數: request, 否則HPA不會工作。
2.控制管理器每隔30s(可以透過–horizontal-pod-autoscaler-sync-period修改)查詢metrics的資源使用情況
3.然後與建立時設定的值和指標做對比(平均值之和/限額),求出目標調整的例項個數
4.目標調整的例項數不能超過1中設定的最大、最小例項數,如果沒有超過,則擴容;超過,則擴容至最大的例項個數
如何部署:
1.6-1.8版本預設使用heapster
1.11版本及以上預設使用metric-server(需單獨安裝,並開啟引數)
1.部署和執行php-apache並將其暴露成為服務
image
2.建立HPA
image
如果為1.8及以下的k8s叢集,指標正常,如果為1.11叢集,需要執行如下操作。
image
4.向php-apache服務增加負載,驗證自動擴縮容
啟動一個容器,並透過一個迴圈向php-apache伺服器傳送無限的查詢請求(請在另一個終端中執行以下命令)
image
5.觀察HPA是否生效
image
用yaml建立HPA的方式為:
image
實現細節
image
HPA由一個控制迴圈實現,迴圈週期由--horizontal-pod-autoscaler-sync-period 標誌指定,預設是30秒,每個週期內,controller-manager會查詢HPA中定義的metric的資源利用率。
如上例子,pod的request定義為200M,而HPA定義的target為50%,即HPA將透過增加或者減少Pod副本的數量(透過Deployment)以保持所有Pod的平均CPU利用率在50%以內(即200*0.5=100M以內),迴圈週期到達時,獲取pod的1分鐘內的平均cpu利用率(從heaspter),發現超過了100M,為332M,於是透過下面的公式,決定最終的pod數量
TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
即 332/50 =6.xxx ceil為向上取整,得到7。如果得到的結果大於10,則為10
因為每次HPA生效都會建立或者刪除pod,而這些操作其實會影響到metric監控值,如建立pod會暫時性的升高cpu,因此每次擴容都要間隔3分鐘,縮容需要間隔5分鐘。且需要滿足:avg(CurrentPodsConsumption)/ Target下降9%,進行縮容,增加至10%才進行擴容
這樣做好處是:
1、判斷的精度高,不會頻繁的擴縮pod,造成叢集壓力大。
2、避免頻繁的擴縮pod,防止應用訪問不穩定
實現hpa的條件:
1、hpa不能autoscale daemonset型別control
2、要實現autoscale,pod必須設定request
作者:二二向箔
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3407/viewspace-2820709/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於Custom-metrics-apiserver實現Kubernetes的HPA(內含踩坑)APIServer
- 基於Kubernetes的hpa實現pod例項數量的自動伸縮
- 安裝heapster報錯
- k8s的監控+HPAK8S
- Openshift HPA(Horizontal Pod Autosc
- k8s實踐(十一):heapster+influxdb+grafanaK8SUXGrafana
- kubernetes實踐之十:Kubernetes-dashboard+Heapster+InfluxDB+GrafanaUXGrafana
- [kubernetes系列]HPA模組深度講解
- Effective HPA:預測未來的彈性伸縮產品
- docker筆記34-容器資源需求、資源限制及HeapSterDocker筆記
- 拋磚系列之k8s HorizontalPodAutoscaler(HPA)K8S
- k8s 自動伸縮 pod(HPA)K8S
- 基於XML的DIXML
- 基於jQuery的AjaxjQuery
- 基於 ramfs 的 OTA
- 基於 SpringBoot 的 FileServiceSpring Boot
- 基於javaEE的看看Java
- 基於ExoPlayer的ExoVideoViewIDEView
- k8s實踐——HPA實踐例項K8S
- k8s HPA(HorizontalPodAutoscaler)--自動水平伸縮K8S
- k8s-hpa自動橫向擴容K8S
- 基於graphql的微服務基礎框架微服務框架
- 基於相關畢業設計論文下載基於WEB,基於java基於JSPWebJavaJS
- 基於 Traefik 的 ForwardAuth 配置Forward
- 基於C#的GRPCC#RPC
- 基於Python的效能分析Python
- 關於hive的基礎Hive
- 基於 KubeVela 的 GitOps 交付Git
- 基於Gitlab的CICD流程Gitlab
- 基於JSP的微博JS
- 基於Docker的GoldenGate部署DockerGo
- 基於mpvue的toast元件VueAST元件
- ES 筆記十六:基於詞項和基於全文的搜尋筆記
- minikube metrics-server HPA 自動擴縮容錯誤Server
- 基於 LNMP 的 Nginx 百萬併發之路 (三)基於域名的虛擬主機LNMPNginx
- 基於flask的最小的應用Flask
- 基於Gridsome建立一個基於Vue.JS和Markdown的部落格Vue.js
- 基於OCaml的識別程式