CCE的自動伸縮能力是通過節點自動伸縮組件autoscaler實現的,可以按需彈出節點實例,支持多可用區、多實例規格、多種伸縮模式,滿足不同的節點伸縮場景。
當節點伸縮中創建的策略和autoscaler插件中的配置同時生效時(比如不可調度和指標規則同時滿足時),將優先執行不可調度擴容。
- 若不可調度執行成功,則會跳過指標規則邏輯,進入下一次循環。
- 若不可調度執行失敗,將執行指標規則邏輯。
前提條件
使用節點伸縮功能前,需要安裝autoscaler插件,插件版本要求1.13.8及以上。
約束限制
- 僅按需計費節點池支持彈性伸縮。
- 彈性伸縮的策略作用在節點池,當節點池中節點為0時,且按CPU/內存彈性伸縮時,不會觸發節點伸縮。
- 縮容節點會導致與節點關聯的本地持久存儲卷類型的PVC/PV數據丟失,無法恢復,且PVC/PV無法再正常使用。縮容節點時使用了本地持久存儲卷的Pod會從縮容的節點上被驅逐,并重新創建Pod,Pod會一直處于pending狀態,因為Pod使用的PVC帶有節點標簽,由于沖突無法調度成功。
操作步驟
步驟 1 在CCE控制臺,單擊集群名稱進入集群。
步驟 2 單擊左側導航欄的“節點伸縮”,進入創建節點伸縮策略頁面。
- 若插件名稱后方顯示“未安裝”,請單擊插件后方的“安裝”,根據業務需求配置插件參數后單擊“安裝”,等待插件安裝完成。
- 若插件名稱后方顯示“已安裝”,則說明插件已安裝成功。
步驟 3 單擊右上角“創建節點伸縮策略”,參照如下參數設置策略。
- 策略名稱:新建策略的名稱,請自定義。
- 關聯節點池:選擇要關聯的節點池。您可以關聯多個節點池,以使用相同的伸縮策略。
說明節點池新增了優先級功能,彈性擴容時CCE將按照如下策略來選擇節點池進行擴容:
1. 通過預判算法判斷節點池是否能滿足讓Pending的Pod正常調度的條件,包括節點資源大于Pod的request值、nodeSelect、nodeAffinity和taints等是否滿足Pod正常調度的條件;另外還會過濾掉擴容失敗(因為資源不足等原因)還處于15min冷卻時間的節點池。
2. 有多個節點池滿足條件時,判斷節點池設置的優先級(優先級默認值為0,取值范圍為0-100,其中100為最高,0為最低),選擇優先級最高的節點池擴容。
3. 如果有多個節點池處于相同的優先級,或者都沒有配置優先級時,通過最小浪費原則,根據節點池里設置的虛擬機規格,計算剛好能滿足Pending的Pod正常調度,且浪費資源最少的節點池。
4. 如果還是有多個節點池的虛擬機規格都一樣,只是AZ不同,那么會隨機選擇其中一個節點池觸發擴容。
5. 如果出現優先選擇的節點池資源不足,會按照優先級順序自動選擇下一個節點池。
節點池優先級功能詳情請參見創建節點池。
- 執行規則:單擊“添加規則”,在彈出的添加規則窗口中設置如下參數:
規則名稱: 請輸入規則名稱,可自定義。
規則類型: 可選擇“指標觸發”或“周期觸發”,兩種類型區別如下:指標觸發:
觸發條件:請選擇“CPU分配率”或“內存分配率”,輸入百分比的值。該百分比應大于autoscaler插件中配置的縮容百分比。
說明
分配率= 節點池容器組(Pod)資源申請量 / 節點池Pod可用資源量 (Node Allocatable) 。
如果多條規則同時滿足條件,會有如下兩種執行的情況:
如果同時配置了“CPU分配率”和“內存分配率”的規則,兩種或多種規則同時滿足擴容條件時,執行擴容節點數更多的規則。
如果同時配置了“CPU分配率”和“周期觸發”的規則,當達到“周期觸發”的時間值時CPU也滿足擴容條件時,較早執行的A規則會將節點池狀態置為伸縮中狀態,導致B規則無法正常執行。待A規則執行完畢,節點池狀態恢復正常后,B規則也不會執行。
- 配置了“CPU分配率”和“內存分配率”的規則后,策略的檢測周期會因autoscaler每次循環的處理邏輯而變動。只要一次檢測出滿足條件就會觸發擴容(當然還要滿足冷卻時間、節點池狀態等約束條件)。
周期觸發:
觸發時間:可選擇每天、每周、每月或每年的具體時間點,如下圖所示,則為每天15:00觸發。
圖 周期觸發時間

執行動作 :與上述“觸發條件”或“觸發時間”相對應,達到觸發條件或觸發時間值后所要執行的動作。
您可以單擊“添加規則”,設置多條節點伸縮策略。您最多可以添加1條CPU使用率指標規則、1條內存使用率指標規則,且規則總數小于等于10條。
步驟 4 設置完成后,單擊“確定”。
縮容說明
節點伸縮策略中不能直接設置縮容策略,您可以在安裝autoscaler插件時進行設置。
節點縮容僅支持資源分配率縮容機制,當集群下CPU和內存分配率低于您設置的門限(在安裝/編輯autoscaler插件時設置)時將對節點池下節點啟動縮容(該功能可以關閉)。
圖 自動縮容設置

YAML樣例
節點伸縮策略Yaml樣例如下:
apiVersion: autoscaling.cce.io/v1alpha1
kind: HorizontalNodeAutoscaler
metadata:
creationTimestamp: "2020-02-13T12:47:49Z"
generation: 1
name: xxxx
namespace: kube-system
resourceVersion: "11433270"
selfLink: /apis/autoscaling.cce.io/v1alpha1/namespaces/kube-system/horizontalnodeautoscalers/xxxx
uid: c2bd1e1d-60aa-47b5-938c-6bf3fadbe91f
spec:
disable: false
rules:
- action:
type: ScaleUp
unit: Node
value: 1
cronTrigger:
schedule: 47 20 * * *
disable: false
ruleName: cronrule
type: Cron
- action:
type: ScaleUp
unit: Node
value: 2
disable: false
metricTrigger:
metricName: Cpu
metricOperation: '>'
metricValue: "40"
unit: Percent
ruleName: metricrule
type: Metric
targetNodepoolIds:
- 7d48eca7-3419-11ea-bc29-0255ac1001a8
表 關鍵參數說明
| 參數 | 參數類型 | 描述 |
|---|---|---|
| spec.disable | Bool | 伸縮策略開關,會對策略中的所有規則生效 |
| spec.rules | Array | 伸縮策略中的所有規則 |
| spec.rules[x].ruleName | String | 規則名稱 |
| spec.rules[x].type | String | 規則類型,當前支持“Cron”和“Metric”兩種類型 |
| spec.rules[x].disable | Bool | 規則開關,當前僅支持“false” |
| spec.rules[x].action.type | String | 規則操作類型,當前僅支持“ScaleUp” |
| spec.rules[x].action.unit | String | 規則操作單位,當前僅支持“Node” |
| spec.rules[x].action.value | Integer | 規則操作數值 |
| spec.rules[x].cronTrigger | / | 可選,僅在周期規則中有效 |
| spec.rules[x].cronTrigger.schedule | String | 周期規則的cron表達式 |
| spec.rules[x].metricTrigger | / | 可選,僅在指標規則中有效 |
| spec.rules[x].metricTrigger.metricName | String | 指標規則對應的指標, 當前支持“Cpu”和“Memory”兩種類型 |
| spec.rules[x].metricTrigger.metricOperation | String | 指標規則的比較符,當前僅支持“>” |
| spec.rules[x].metricTrigger.metricValue | String | 指標規則的閾值, 支持1-100之間的所有整數,需以字符串表示 |
| spec.rules[x].metricTrigger.Unit | String | 指標規則閾值的單位,當前僅支持“%” |
| spec.targetNodepoolIds | Array | 伸縮策略關聯的所有節點池 |
| spec.targetNodepoolIds[x] | String | 伸縮策略關聯節點池的uid |