在雲端原生環境中,Kubernetes 的自動擴展能力是降低成本與提升效率的關鍵。然而,當自動化程度提高到能夠自主決定移除或更換伺服器節點時,如何確保應用程式在這種動態變動中不中斷,成為了平台工程師面臨的核心挑戰。微軟針對 Azure Kubernetes Service (AKS) 推出的節點自動配置(Node Auto-Provisioning, NAP)功能,旨在透過自動化管理節點來優化資源利用率,但隨之而來的是節點中斷(Node Disruption)的不可預測性。為了緩解這一問題,微軟發布了新的指導方針,強調必須在工作負載層與基礎設施層同步建立治理機制,才能在追求成本效益的同時,維持系統的可用性。
NAP 的核心技術基於開源的 Karpenter 專案,其運作邏輯是根據目前待處理的工作負載,自動配置最適合的節點,並在發現節點利用率過低時,自動將其移除或合併。這種機制能顯著提升 Bin-packing(裝箱問題)的效率,即將 Pods 盡可能緊湊地排列在最少數量的虛擬機中,從而降低雲端支出。然而,這種自動化的節點移除過程會觸發節點排空(Drain)操作,如果應用程式對此類變動缺乏適應力,就容易導致服務不穩定。
為了讓自動化擴展變得安全且可預測,微軟建議採取雙層防護機制。首先是在應用程式層級使用 Pod Disruption Budgets (PDB),這是一種 Kubernetes 原生機制,用來定義在自願性中斷期間,允許多少個 Pod 副本可以暫時不可用。例如,若設定最多允許一個副本不可用,Kubernetes 在進行節點合併時,會確保始終有足夠的副本在運行。其次是在基礎設施層級利用 NAP 的中斷控制功能,包括合併策略(Consolidation Policies)、中斷預算、節點過期時間(Node Expiration)以及漂移管理(Drift Management)。
這兩者的區別在於:PDB 是為了保護應用程式的可用性,而 NAP 的控制項則是為了調節基礎設施變動的節奏與時機。微軟警告,開發團隊不應過度依賴單一機制,且要避免設定過於嚴苛的 PDB。例如,若將 PDB 設定為 maxUnavailable: 0(即要求 100% 的副本必須始終在線),將會導致 Kubernetes 無法執行任何自願性的 Pod 驅逐。這會造成 NAP 無法完成節點排空,進而導致節點合併、版本升級或遷移操作陷入停滯。因此,團隊必須根據工作負載的實際可用性需求,允許適度的自願中斷,以確保基礎設施的維護能順利進行。
在實際運作中,NAP 的合併能力體現了成本與風險的權衡。當設定為 WhenEmptyOrUnderutilized 時,系統會評估是否能將工作負載遷移到更高效的虛擬機組合中,並移除冗餘容量。運維人員可以透過 consolidateAfter 延遲合併觸發時間,或使用 expireAfter 強制執行節點的最大生命週期。這將基礎設施的優化轉化為一個持續的決策過程:系統在不斷詢問是否能在不違反既定約束的前提下,以更高效的方式運行工作負載。
此外,必須區分自願性中斷與非自願性中斷。PDB 與 NAP 的控制項僅能管理自願性操作(如節點合併、過期替換)。對於硬體故障、主機崩潰或 Azure Spot VM(低價可回收虛擬機)的強制回收等非自願性事件,這些機制無法提供保護。特別是使用 Spot 實例的應用程式,必須在設計上具備容忍中斷的能力,儘管 AKS 能在偵測到即將回收時嘗試配置替代容量,但應用層的韌性才是最終保障。
隨著 Kubernetes 趨向更高程度的自主化,尤其是在支持昂貴的 AI 與大數據工作負載時,平台工程的挑戰已從如何讓集群擴展,轉向如何讓自動化擴展變得安全。微軟的這套指導方針提供了一個可參考的模型:利用應用層的可用性約束保護工作負載,利用基礎設施層的中斷策略控制變動幅度,並明確定義哪些工作負載可以容忍中斷。在自動化程度日益增加的今天,精準控制基礎設施變動的時機與規模,已變得與最初配置容量的能力同樣重要。
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。