本文介紹使用節點即時彈性功能時可能遇到的常見問題及解決方案。
索引
分類 | 二級分類 | 跳轉連結 |
節點即時彈性的擴縮容行為 | ||
自訂的擴縮容行為 | ||
擴容行為相關
節點即時彈性可類比判斷的資源有哪些?
已支援根據以下資源進行擴縮容行為的類比和判斷。
cpu
memory
ephemeral-storage
aliyun.com/gpu-mem # 僅支援共用GPU
nvidia.com/gpu
節點即時彈性是否支援根據Pod Request資源在節點池中擴容合適資源的執行個體規格?
已支援。例如,您為開啟Auto Scaling的節點池配置了4 Core 8 GB和12 Core 48 GB的兩種執行個體規格,Pod Request資源為2 Core,當節點即時彈性執行擴容操作時,會優先將Pod調度到4 Core 8 GB的節點上。如果後續4 Core 8 GB升配為8 Core 16 GB,節點即時彈性會自動讓Pod運行在8 Core 16 GB的節點上。
節點池配了多個執行個體規格,節點即時彈性預設如何選擇?
根據節點池配置的執行個體規格,節點即時彈性會定期排除庫存不足的執行個體規格,然後根據執行個體規格的CPU核心數進行排序,逐個檢查是否滿足不可調度的Pod申請的Request資源。一旦有執行個體規格能夠滿足,節點即時彈性會優先選擇這個執行個體規格,不再檢查剩餘的規格。
使用節點即時彈性時,如何即時感知節點池中的執行個體規格庫存變化?
節點即時彈性提供了健康度指標,會定期更新開啟自動調整節點池中的執行個體規格的庫存變化。當執行個體規格的庫存狀態發生變化時,節點即時彈性會發送名稱為InstanceInventoryStatusChanged的Kubernetes Event。您可以訂閱此Event通知,查看節點池庫存健康度,評估當前節點池庫存是否健康,並提前對執行個體規格配置進行分析和調整。詳細資料,請參見查看節點即時彈性健康度。
如何最佳化節點池配置,盡量避免庫存不足而導致擴容失敗?
建議參見以下配置建議,擴大執行個體規格可選範圍:
為節點池配置可選的多執行個體規格,或者配置泛化配置。
為節點池配置多個可用性區域。
為什麼節點即時彈性無法彈出節點?
請檢查是否存在如下情境。
配置節點池的執行個體規格庫存不足。
節點池配置的執行個體規格無法滿足Pod的資源申請(Request)。ECS執行個體規格的資源大小是執行個體的售賣規格,實際運行時需考慮以下資源預留。
執行個體的建立過程中會因虛擬化、作業系統等佔用部分資源。更多資訊,請參見購買執行個體後查看記憶體大小,為什麼和購買時的執行個體規格定義不一致?。
ACK需要佔用一定的節點資源來運行kube組件和system進程(例如kubelet、kube-proxy、Terway、Container Runtime等)。詳細說明及預留策略,請參見節點資源預留策略。
預設節點會安裝系統組件,Pod的申請資源要小於執行個體的規格。
是否參見啟用節點即時彈性完成了授權操作。
開啟自動調整的節點池中擴容執行個體失敗。
為保證後續擴縮準確性和系統的穩定性,節點即時彈性組件在異常節點處理完成前,不會執行擴縮容操作。
縮容行為相關
為什麼節點即時彈性無法縮容節點?
請檢查是否存在如下幾種情境。
是否已開啟僅縮容空節點,而排查的節點為非空節點。
節點Pod的資源申請(Request)閾值高於設定的縮容閾值。
節點上運行著kube-system命名空間的Pod。
節點上的Pod包含強制的調度策略,導致其他節點無法運行此Pod。
節點上的Pod擁有PodDisruptionBudget,且到達了PodDisruptionBudget的最小值。
如有新增節點,節點即時彈性在10分鐘內,不會對該節點進行縮容操作。
什麼類型的Pod可以阻止節點即時彈性移除節點?
當Pod不是由原生Kubernetes Controller建立的Pod(例如非Deployment、ReplicaSet、Job、StatefulSet等對象建立的Pod),或者當節點上的Pod不能被安全地終止或遷移時,節點即時彈性組件可能會阻止移除這個節點。
通過Pod控制擴縮容行為
如何通過Pod控制節點即時彈性的節點縮容?
您可以通過Pod Annotationgoatscaler.io/safe-to-evict
指定在節點即時彈性的縮容過程中,Pod是否會阻止節點被縮容。
阻止節點被縮容:為Pod添加Annotation
"goatscaler.io/safe-to-evict": "false"
。不阻止節點被縮容:為Pod添加Annotation
"goatscaler.io/safe-to-evict": "true"
。
通過節點控制擴縮容行為
節點即時彈性在縮容過程中如何指定需要刪除的節點?
您可以為待移除節點添加goatscaler.io/force-to-delete:true:NoSchedule
汙點。添加後,節點即時彈性會直接執行刪除操作,不會檢查Pod狀態和對Pod排水。這可能會導致服務中斷或資料丟失,請謹慎使用。
如何指定節點不被節點即時彈性縮容?
您可以為目標節點配置節點Annotation "goatscaler.io/scale-down-disabled": "true"
,使其不被節點即時彈性組件縮容。添加Annotation的命令樣本如下。
kubectl annotate node <nodename> goatscaler.io/scale-down-disabled=true
節點即時彈性能否僅縮容空節點?
您可以在節點維度或叢集維度配置是否需要僅縮容空節點。如果您同時在節點維度和叢集維度完成了配置,節點維度優先順序更高。
節點維度:為節點添加Label
goatscaler.io/scale-down-only-empty:true
或goatscaler.io/scale-down-only-empty:false
,分別用於開啟或關閉僅縮容空節點。叢集維度:在Container Service管理主控台的組件管理頁面,定位節點即時彈性組件,按照頁面提示配置ScaleDownOnlyEmptyNodes,取值為true或false,分別用於開啟或關閉僅縮容空節點。
節點即時彈性組件相關
是否有操作會觸發節點即時彈性組件的自動更新?
不會。除系統維護、升級外,ACK不會進行節點即時彈性組件的自動更新。請在Container Service管理主控台的組件管理頁面手動升級。
ACK託管叢集已經完成了角色授權,但節點伸縮活動仍然無法正常運行?
可能是叢集kube-system命名空間下保密字典內不存在addon.aliyuncsmanagedautoscalerrole.token
而導致的。如不存在,請提交工單。
沒有Token時,ACK預設通過WorkRole實現相關能力。請參見下方流程為叢集WorkerRole手動添加AliyunCSManagedAutoScalerRolePolicy的許可權。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊。
在叢集資源地區,單擊Worker RAM 角色後面的連結,然後在RAM控制台,單擊精確授權。
在精確授權面板,預設選擇系統策略,輸入系統策略名稱稱為
AliyunCSManagedAutoScalerRolePolicy
,按照頁面提示完成授權。完成後,重新整理頁面,可查看新增的許可權。
手動重啟kube-system命名空間下的Deployment cluster-autoscaler(節點自動調整)或ack-goatscaler(節點即時彈性),以便許可權立即生效。