CCE支持HPA策略和CustomedHPA策略兩種工作負載伸縮方式。兩種策略的對比如下:
HPA和CustomedHPA策略對比
伸縮策略 | HPA策略 | CustomedHPA策略 |
實現方式 | Kubernetes中實現POD水平自動伸縮的功能,即Horizontal Pod Autoscaling | 彈性伸縮增強能力 |
策略規則 | 基于指標(CPU利用率、內存利用率),對無狀態工作負載進行彈性擴縮容。 | 基于指標(CPU利用率、內存利用率)或周期(每天、每周、每月或每年的具體時間點),對無狀態工作負載進行彈性擴縮容。 |
主要功能 | 在kubernetes社區HPA功能的基礎上,增加了應用級別的冷卻時間窗和擴縮容閾值等功能。 | 指標觸發
周期觸發 支持選擇天、周、月或年的具體時間點或周期作為觸發時間 |
說明:
伸縮策略優先級:手動伸縮和自動伸縮同時配置的情況下,在不執行手動伸縮時,資源調度以自動伸縮為準,伸縮按照監控信息自動觸發,如果使用手動伸縮,自動伸縮會暫時失效。
HPA工作原理
HPA(Horizontal Pod Autoscaler)是用來控制Pod水平伸縮的控制器,HPA周期性檢查Pod的度量數據,計算滿足HPA資源所配置的目標數值所需的副本數量,進而調整目標資源(如Deployment)的replicas字段。
想要做到自動彈性伸縮,先決條件就是能感知到各種運行數據,例如集群節點、Pod、容器的CPU、內存使用率等等。而這些數據的監控能力Kubernetes也沒有自己實現,而是通過其他項目來擴展Kubernetes的能力,CCE提供如下兩個插件來實現該能力:
- 是一套開源的系統監控報警框架,能夠采集豐富的Metrics(度量數據),目前已經基本是Kubernetes的標準監控方案。
- 是Kubernetes集群范圍資源使用數據的聚合器。Metrics Server從kubelet公開的Summary API中采集度量數據,能夠收集包括了Pod、Node、容器、Service等主要Kubernetes核心資源的度量數據,且對外提供一套標準的API。
使用HPA(Horizontal Pod Autoscaler)配合Metrics Server可以實現基于CPU和內存的自動彈性伸縮,再配合Prometheus還可以實現自定義監控指標的自動彈性伸縮。
HPA主要流程如下圖所示。

HPA的核心有如下2個部分:
- 監控數據來源
最早社區只提供基于CPU和Mem的HPA,隨著應用越來越多搬遷到k8s上以及Prometheus的發展,開發者已經不滿足于CPU和Memory,開發者需要應用自身的業務指標,或者是一些接入層的監控信息,例如:Load Balancer的QPS、網站的實時在線人數等。社區經過思考之后,定義了一套標準的Metrics API,通過聚合API對外提供服務。
? metrics.k8s.io: 主要提供Pod和Node的CPU和Memory相關的監控指標。
? custom.metrics.k8s.io: 主要提供Kubernetes Object相關的自定義監控指標。
? external.metrics.k8s.io:指標來源外部,與任何的Kubernetes資源的指標無關。
- 擴縮容決策算法
HPA controller跟據當前指標和期望指標來計算縮放比例,計算公式如下:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
例如當前的指標值是200m,目標值是100m,那么按照公式計算期望的實例數就會翻倍。那么在實際過程中,可能會遇到實例數值反復伸縮,導致集群震蕩。為了保證穩定性,HPA controller從以下幾個方面進行優化:
? 冷卻時間:在1.11版本以及之前的版本,社區引入了horizontal-pod-autoscaler-downscale-stabilization-window和horizontal-pod-autoScaler-upscale-stabilization-window這兩個啟動參數代表擴容冷卻時間和縮容冷卻時間,這樣保證在冷卻時間內,跳過擴縮容。1.14版本之后引入延遲隊列,保存一段時間內每一次檢測的決策建議,然后根據當前所有有效的決策建議來進行決策,從而保證期望的副本數盡量小的發生變更,保證穩定性。
? 忍受度:可以看成一個緩沖區,當實例變化范圍在忍受范圍之內的話,保持原有的實例數不變。
首先定義ratio = currentMetricValue / desiredMetricValue
當|ratio – 1.0| <= tolerance時,則會忽略,跳過scale。
當|ratio – 1.0| > tolerance時, 就會根據之前的公式計算期望值。
當前社區版本中默認值為0.1
由于當前冷卻時間窗,忍受度都是全局的參數,對于用戶來說,可能應用所需的忍受度和冷卻時間窗都不一致,所以當前CCE在社區的基礎上,提供應用級別的忍受度和冷卻時間窗。
HPA是基于指標閾值進行伸縮的,常見的指標主要是 CPU、內存,當然也可以通過自定義指標,例如QPS、連接數等進行伸縮。但是存在一個問題:基于指標的伸縮存在一定的時延,這個時延主要包含:采集時延(分鐘級) + 判斷時延(分鐘級) + 伸縮時延(分鐘級)。這個分鐘級的時延,可能會導致應用CPU飚高,相應時間變慢。為了解決這個問題,CCE提供了定時策略,對于一些有周期性變化的應用,提前擴容資源,而業務低谷時,定時回收資源。