排解 Windows Server 節點集區問題

Google Kubernetes Engine (GKE) 中執行 Windows Server 節點集區時,可能會遇到 Pod 無法啟動、提取 Windows 容器映像檔時發生錯誤、網路連線問題,或是節點無法啟動等問題。

請參閱本文診斷及解決這些常見問題,確保 Windows 應用程式穩定運作。

如果您是平台管理員和運算子,負責管理含有 Windows 節點集區的 GKE 叢集,或是應用程式開發人員,在 GKE 上部署及執行 Windows 應用程式,請務必詳閱本文資訊。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

如需更一般性的指引,請參閱 Kubernetes 說明文件,瞭解如何偵錯 Pod服務

Containerd 節點問題

如要瞭解如何解決使用 containerd 節點映像檔時發生的問題,請參閱「Windows Server 節點集區的問題」。

Windows Pod 無法啟動

如果基礎映像檔與 Windows Server 主機 OS 版本不相容,可能會導致 Pod 無法啟動。

問題

  • Windows Pod 無法啟動。
  • 節點會回報 NotReady 狀態。

原因

容器映像檔是根據舊版 Windows 基本映像檔建構而成,與主機節點的 Windows Server 版本不相容。

解析度

使用基本 Windows 映像檔 (包含 2020 年 3 月或之後的 Windows 更新) 建構容器映像檔。如要進一步瞭解 Microsoft 容器相容性,請參閱 Microsoft 說明文件,瞭解 2020 年 2 月 Windows Server 容器不相容問題

映像檔提取錯誤

Windows Server 容器映像檔通常比 Linux 映像檔大得多,可能會導致逾時。

問題

  • 錯誤訊息,例如 Failed to pull imagecontext cancelled
  • Pod 會顯示 ErrImagePull 狀態。

原因

Windows Server 容器映像檔及其組成的個別層可能很大。如果容器層過大,kubelet 代理程式在下載及解壓縮容器層時可能會逾時並失敗。

解析度

如要解決這些映像檔提取失敗問題,請嘗試下列解決方法:

  • 增加節點 CPU:容器擷取作業會在核心之間平行執行,因此使用更多核心的機器類型可縮短整體提取時間。
  • 最佳化映像檔層級:將應用程式層級分成較小的層級,以改善 Docker 層級快取,並提高映像檔提取重試成功的機率。詳情請參閱 Docker 儲存空間驅動程式說明文件中的「映像檔和層級」。
  • 手動提取:連線至 Windows Server 節點,並在建立 Pod 之前,手動對容器映像檔執行 docker pull 指令。

如需更多一般建議,請參閱「排解映像檔提取問題」。

映像檔系列已停用

當供應商停止支援時,GKE 會定期淘汰舊版 Windows Server 映像檔系列。這項淘汰作業會禁止使用這些映像檔建立節點集區。

問題

使用 Windows 映像檔建立節點集區時,您會收到類似下列的錯誤訊息:

WINDOWS_SAC image family for 1.18.20-gke.501 has reached end of life, newer
versions are still available.

原因

GKE 不再支援所選的 Windows Server 映像檔系列。

解析度

選擇可用的支援 Windows 映像檔。 如要查看 GKE Windows 節點映像檔的支援終止日期,請按照「對應 GKE 和 Windows 版本」一文所述,使用 gcloud container get-server-config 指令。

建立節點集區時逾時

同時初始化大量 Windows Server 節點可能會導致逾時。

問題

節點集區建立作業在完成前逾時。

原因

如果您要建立大量節點 (例如 500 個),且這是叢集中第一個使用 Windows Server 映像檔的節點集區,節點集區建立作業可能會逾時。

解析度

建立節點集區時,減少初始節點數量。建立節點集區後,您可以增加節點數量。

Windows 節點會變成 NotReady,並顯示以下錯誤:PLEG is not healthy

在單一節點上快速排定多個 Windows 容器,可能會導致 Pod 生命週期事件產生器 (PLEG) 負載過重。

問題

  • Windows 節點會進入 NotReady 狀態。
  • 事件或記錄檔顯示 PLEG is not healthy 錯誤訊息。

原因

如果單一 Windows 節點上快速啟動多個 Pod,就會發生已知的 Kubernetes 問題

解析度

如要從 PLEG 故障中復原,並防止再次發生,請採取下列措施:

  • 重新啟動受影響的 Windows Server 節點。
  • 將 Windows Pod 建立作業限制為每 30 秒最多一個 Pod。

不一致 TerminationGracePeriod

Windows 容器關閉計時器與 Kubernetes 緩衝期設定的差異,可能會導致容器意外終止。

問題

Windows 會在 TerminationGracePeriodSeconds 欄位中設定的持續時間到期前,強制終止容器。

原因

容器的內部 Windows 系統逾時與 Kubernetes Pod 資訊清單中指定的緩衝期不同。

解析度

在映像檔建構期間編輯容器本機登錄機碼,即可修改 Windows 容器逾時設定。據此調整 Pod 資訊清單中的 TerminationGracePeriodSeconds 欄位。

網路連線問題

Windows Server 容器網路與 Google Cloud 網路之間的最大傳輸單位 (MTU) 大小不符,可能會導致封包遭到捨棄。

問題

在 Windows Server 容器中執行的應用程式會發生網路連線失敗或封包遺失的情況。

原因

Windows Server 容器網路通常會假設網路 MTU 為 1500,這與 Google Cloud的 MTU 1460 不相容。

解析度

將容器網路介面 MTU 和 Windows Server 節點網路介面 MTU 值都設為 1460 以下。詳情請參閱 Compute Engine 說明文件中的已知 Windows 容器問題

節點啟動問題

新的 Windows Server 執行個體可能無法完成初始化指令碼,或向控制層註冊。

問題

Windows Server 節點無法初始化或加入叢集。

原因

節點初始化期間發生錯誤,導致節點無法啟動或加入叢集。

解析度

如要找出可能導致問題的開機錯誤,請查看節點的序列埠輸出內容:

gcloud compute instances get-serial-port-output NODE_NAME \
    --zone=COMPUTE_ZONE

更改下列內容:

叢集執行 1.24 以下版本時,Windows 節點中的服務會間歇性無法連線

在執行 1.24 以下版本的叢集上,重新啟動 kube-proxy 元件會導致暫時的網路路由延遲,因為系統會重新處理主機網路服務 (HNS) 負載平衡器規則。

問題

從 Windows 節點上執行的 Pod 間歇性無法連線至服務。

原因

如果 GKE 叢集執行的是 1.24 版或更舊版本,當事件重新啟動 Windows 節點上的 kube-proxy 元件時 (例如節點啟動、節點升級或手動重新啟動),該元件必須同步處理並重新建立所有 HNS 負載平衡器規則。如果叢集有大量這類規則,處理這些規則時可能會出現明顯延遲,每條規則約需 30 秒。在同步延遲期間,從該節點上執行的 Pod 間歇性無法連線至服務。詳情請參閱 GitHub 中的原始問題

解析度

將叢集控制層升級至 1.25 以上版本。新版已大幅改善這項行為,詳情請參閱 GitHub 中的提取要求

後續步驟