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提供Prometheus和Metrics Server插件來實現該能力:
- 是一套開源的系統監控報警框架,能夠采集豐富的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
HPA是基于指標閾值進行伸縮的,常見的指標主要是 CPU、內存,當然也可以通過自定義指標,例如QPS、連接數等進行伸縮。但是存在一個問題:基于指標的伸縮存在一定的時延,這個時延主要包含:采集時延(分鐘級) + 判斷時延(分鐘級) + 伸縮時延(分鐘級)。這個分鐘級的時延,可能會導致應用CPU飚高,響應時間變慢。為了解決這個問題,CCE提供了定時策略,對于一些有周期性變化的應用,提前擴容資源,而業務低谷時,定時回收資源。