HPA是針對Pod級別的,但是如果集群的資源不夠了,那就只能對節點進行擴容了。集群節點的彈性伸縮本來是一件非常麻煩的事情,但是好在現在的集群大多都是構建在云上,云上可以直接調用接口添加刪除節點,這就使得集群節點彈性伸縮變得非常方便。
Autoscaler是Kubernetes提供的集群節點彈性伸縮組件,根據Pod調度狀態及資源使用情況對集群的節點進行自動擴容縮容。
前提條件
使用節點伸縮功能前,需要安裝autoscaler插件,插件版本要求1.13.8及以上。
Autoscaler工作原理
Autoscaler(簡稱CA)的主要流程包括兩部分:
- ScaleUp流程: CA會每隔10s檢查一次所有不可調度的Pod,根據用戶設置的策略,選擇出一個符合要求的節點組進行擴容。
- ScaleDown流程:CA每隔10s會掃描一次所有的Node,如果該Node上所有的Pod Requests少于用戶定義的縮容百分比時,CA會模擬將該節點上的Pod是否能遷移到其他節點,如果可以的話,當滿足不被需要的時間窗以后,該節點就會被移除。
如上所述,當集群節點處于一段時間空閑狀態時(默認10min),會觸發集群縮容操作。
當節點存在以下幾種狀態的pod時,不可縮容:
- 節點上的pod有設置PodDisruptionBudget,當移除pod不滿足對應條件時,節點不會縮容。
- 節點上的pod由于一些限制,如親和、反親和或者taints等,無法調度到其他節點,節點不會縮容。
- 節點上的pod擁有"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"這個annotations時,節點不縮容。
- 節點上存在kube-system namespace下的Pod(除kube-system daemonset創建的Pod),節點不縮容。
- 節點上有非controller(deployment/replica set/job/stateful set)創建的Pod,節點不縮容。
AutoScaler架構
AutoScaler架構如下圖所示,主要由以下幾個核心模塊組成:
圖 AutoScaler架構圖

說明
Estimator: 負責擴容場景下,評估滿足當前不可調度Pod時,每個節點池需要擴容的節點數量。
Simulator: 負責縮容場景下,找到滿足縮容條件的節點。
Expander: 負責在擴容場景下,根據用戶設置的不同的策略來,從Estimator選出的節點池中,選出一個最佳的選擇。當前Expander有多種策略:
Random: 隨機選擇一個節點池,如果用戶沒有設置的話,默認是Random。
most-Pods: 選擇此次擴容后能滿足調度最多Pod的節點池,如果有相同的,再隨機選擇一個。
least-waste: 選擇此次擴容完成后,具有最小浪費的CPU或者Mem資源的節點池。
price: 選擇此次擴容所需節點金額最小的節點池。
priority: 根據用戶自定義的權重,選擇權重最高的節點池。
當前CCE提供除Price以外的所有的策略,當前CCE插件默認使用least-waste策略。