在 Google Kubernetes Engine (GKE) 中執行 Windows Server 節點集區時,可能會遇到 Pod 無法啟動、提取 Windows 容器映像檔時發生錯誤、網路連線問題,或是節點無法啟動等問題。
請參閱本文,診斷及解決這些常見問題,確保 Windows 應用程式穩定運作。
如果您是管理 GKE 叢集 (含 Windows 節點集區) 的平台管理員和作業人員,或是要在 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 image或context 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 節點映像檔的支援終止日期,請使用 gcloud container get-server-config 指令,如「對應 GKE 和 Windows 版本」一文所述。
建立節點集區時逾時
同時初始化大量 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
更改下列內容:
NODE_NAME:節點名稱。COMPUTE_ZONE:節點的運算可用區。
叢集執行 1.24 或更早版本時,Windows 節點中的服務間歇性無法連線
在執行 1.24 版或更早版本的叢集上,重新啟動 kube-proxy 元件會導致暫時的網路路由延遲,因為主機網路服務 (HNS) 負載平衡器規則會重新處理。
問題
從 Windows 節點上執行的 Pod 間歇性無法連線至服務。
原因
如果 GKE 叢集執行的是 1.24 版或更早版本,當事件重新啟動 Windows 節點上的 kube-proxy 元件時 (例如節點啟動、節點升級或手動重新啟動),該元件必須同步並重新建立所有 HNS 負載平衡器規則。如果叢集有大量這類規則,處理這些規則時可能會出現明顯延遲,每條規則約需 30 秒。在這段同步延遲期間,在該節點上執行的 Pod 會間歇性無法連上 Service。詳情請參閱 GitHub 上的原始問題。
解析度
將叢集控制層升級至 1.25 以上版本。新版已大幅改善這項行為,詳情請參閱 GitHub 中的提取要求。
後續步驟
如果說明文件無法解決您的問題,請參閱「取得支援」一文,瞭解如何取得進一步協助,包括下列主題的建議:
- 向 Cloud Customer Care 團隊申請開立支援案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine標記搜尋類似問題,向社群尋求支援。您也可以加入#kubernetes-engineSlack 頻道,取得更多社群支援。 - 使用公開 Issue Tracker 開啟問題或功能要求。