本頁面說明如何建立 Google Kubernetes Engine (GKE) 叢集,並使用執行 Microsoft Windows Server 的節點集區。這個叢集可讓您使用 Windows Server 容器。目前不支援 Microsoft Hyper-V 容器。 與 Linux 容器類似,Windows Server 容器也提供程序和命名空間隔離功能。
Windows Server 節點需要的資源比一般 Linux 節點多。Windows Server 節點需要額外資源才能執行 Windows OS,以及無法在容器中執行的 Windows Server 元件。由於 Windows Server 節點需要更多資源,因此可分配資源會比 Linux 節點少。
使用 Windows Server 節點集區建立叢集
在本節中,您將建立使用 Windows Server 容器的叢集。
如要建立這個叢集,請完成下列工作:
為 GKE 設定 IAM 服務帳戶
GKE 會使用附加至節點的 IAM 服務帳戶,執行記錄和監控等系統工作。這些節點服務帳戶至少必須具備專案的「Kubernetes Engine 預設節點服務帳戶」(roles/container.defaultNodeServiceAccount
) 角色。根據預設,GKE 會使用專案中自動建立的 Compute Engine 預設服務帳戶做為節點服務帳戶。
如要將 roles/container.defaultNodeServiceAccount
角色授予 Compute Engine 預設服務帳戶,請完成下列步驟:
主控台
- 前往「歡迎」頁面:
- 在「專案編號」欄位中,按一下 「複製到剪貼簿」。
- 前往「IAM」(身分與存取權管理)IAM 頁面:
- 按一下「授予存取權」 。
- 在「New principals」(新增主體) 欄位中,指定下列值:
將PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
替換為您複製的專案編號。 - 在「Select a role」(選取角色) 選單中,選取「Kubernetes Engine Default Node Service Account」(Kubernetes Engine 預設節點服務帳戶) 角色。
- 按一下 [儲存]。
gcloud
- 找出 Google Cloud 專案編號:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
將
PROJECT_ID
替換為您的專案 ID。輸出結果會與下列內容相似:
12345678901
- 將
roles/container.defaultNodeServiceAccount
角色指派給 Compute Engine 預設服務帳戶:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER[email protected]" \ --role="roles/container.defaultNodeServiceAccount"
將
PROJECT_NUMBER
替換為上一步的專案編號。
選擇 Windows Server 節點映像檔
如要在 GKE 上執行,Windows Server 容器節點映像檔必須建構在 Windows Server 2019 (LTSC)、Windows Server 20H2 (SAC) 或 Windows Server 2022 (LTSC) 版本上。單一叢集可使用不同 Windows Server 版本的 Windows Server 節點集區,但每個節點集區只能使用一個 Windows Server 版本。
選擇節點映像檔時,請考量下列事項:
- 支援時間:
- Windows Server 節點映像檔的支援時間取決於 Microsoft 提供的支援時間,詳情請參閱「作業系統映像檔支援政策」。如要找出 GKE Windows 節點映像檔的支援終止日期,請使用
gcloud container get-server-config
指令,如「對應 GKE 和 Windows 版本」一節所述。 - Microsoft 只會在 SAC 版本發布後提供 18 個月的支援。如果您為節點集區選擇 SAC 做為映像檔類型,但未將節點集區升級至以較新 SAC 版本為目標的較新 GKE 版本,則在 SAC 版本支援生命週期結束時,您將無法在節點集區中建立新節點。進一步瞭解 Google 對 Windows Server 作業系統的支援。我們建議使用 LTSC,因為支援生命週期較長。
- 如果 GKE 叢集已註冊穩定版發布版本,請勿選擇 SAC。 由於 Microsoft 僅支援 SAC 版本 18 個月,因此在穩定的 GKE 版本仍可使用時,SAC 節點集區映像檔可能會不受支援。
- Windows Server 節點映像檔的支援時間取決於 Microsoft 提供的支援時間,詳情請參閱「作業系統映像檔支援政策」。如要找出 GKE Windows 節點映像檔的支援終止日期,請使用
- 版本相容性和複雜度:
- 只有在可以升級節點集區和定期升級其中執行的容器時,才選擇 SAC。GKE 會在新版 GKE 中,定期更新 Windows 節點集區使用的 SAC 版本,因此為節點集區映像檔類型選擇 SAC 時,您需要更頻繁地重建容器。
- 如果不確定要使用哪種 Windows Server 映像檔類型,建議選擇 Windows Server LTSC,以免升級節點集區時發生版本不相容的問題。詳情請參閱 Microsoft 說明文件中的「Windows Server 服務管道:LTSC 和 SAC」。
- Windows Server Core 和 Nano Server 都可以做為容器的基本映像檔。
- Windows Server 容器有重要的版本相容性需求:
- 為 LTSC 建構的 Windows Server 容器無法在 SAC 節點上執行,反之亦然。
- 專為特定 LTSC 或 SAC 版本建構的 Windows Server 容器,如未重新建構以其他版本為目標,就無法在其他 LTSC 或 SAC 版本上執行。
- 將 Windows Server 容器映像檔建構為多架構映像檔,可指定多個 Windows Server 版本,有助於管理這個版本控制的複雜性。
- 新功能:
- 通常會先在 SAC 版本中推出新的 Windows Server 功能,因此,新的 GKE Windows 功能可能會先在 SAC 節點集區中推出。
- 如果您依附的功能尚未在 LTSC 版本中推出,請考慮使用 SAC。
容器執行階段:
無論是 Windows Server LTSC 或 SAC 節點映像檔,容器執行階段都可以是 Docker 或 containerd。如果 GKE 節點版本為 1.21.1-gke.2200 以上,建議使用 containerd 執行階段。詳情請參閱「節點映像檔」。
更新及設定 gcloud
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
- 請確認您具備建立叢集的適當權限。您至少應具備 Kubernetes Engine 叢集管理員角色。
建立叢集和節點集區
如要執行 Windows Server 容器,叢集必須至少有一個 Windows 和一個 Linux 節點集區。您無法只使用 Windows Server 節點集區建立叢集。執行重要叢集外掛程式時,需要 Linux 節點集區。
由於這項功能十分重要,我們建議您開啟自動調度功能,確保 Linux 節點集區有足夠的容量來執行叢集外掛程式。
gcloud
建立叢集,並填入下列欄位:
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-ip-alias \
--num-nodes=NUMBER_OF_NODES \
--cluster-version=VERSION_NUMBER \
--release-channel CHANNEL
更改下列內容:
CLUSTER_NAME
:您為叢集選擇的名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。--enable-ip-alias
會開啟別名 IP。Windows Server 節點必須使用別名 IP。如要進一步瞭解其優點,請參閱「瞭解使用別名 IP 的原生容器路由」。NUMBER_OF_NODES
:您建立的 Linux 節點數量。您應提供足夠的運算資源來執行叢集外掛程式。這是選填欄位,如未填寫,系統會使用預設值3
。VERSION_NUMBER
:要使用的特定叢集版本,必須為 1.16.8-gke.9 以上版本。如未指定發布版本,GKE 會在該版本適用的最成熟發布版本中註冊叢集。CHANNEL
:要註冊叢集的發布管道,可以是rapid
、regular
、stable
或None
。除非指定下列至少一個標記:--cluster-version
、--release-channel
、--no-enable-autoupgrade
和--no-enable-autorepair
,否則叢集預設會加入regular
發布管道。如果您選擇叢集版本,且不希望叢集註冊發布管道,就必須指定None
。
強烈建議您指定權限最小的 IAM 服務帳戶,供節點使用,不要使用 Compute Engine 預設服務帳戶。如要瞭解如何建立僅具備必要權限的服務帳戶,請參閱「使用最低權限的服務帳戶」。
如要在 gcloud CLI 中指定自訂服務帳戶,請在指令中加入下列標記:
--service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
將 SERVICE_ACCOUNT_NAME 替換為具備最低權限的服務帳戶名稱。
使用下列欄位建立 Windows Server 節點集區:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--image-type=IMAGE_NAME \
--no-enable-autoupgrade \
--machine-type=MACHINE_TYPE_NAME \
--windows-os-version=WINDOWS_OS_VERSION
更改下列內容:
NODE_POOL_NAME
:您為 Windows Server 節點集區選擇的名稱。CLUSTER_NAME
:您在上方建立的叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。IMAGE_NAME
:您可以指定下列其中一個值:WINDOWS_LTSC_CONTAINERD
:搭載 containerd 的 Windows Server LTSC。這是 Windows Server 2022 和 Windows Server 2019 OS 映像檔的映像檔類型WINDOWS_SAC_CONTAINERD
:採用 Containerd 的 Windows Server SAC (2022 年 8 月 9 日後不再支援)WINDOWS_LTSC
:搭載 Docker 的 Windows Server LTSCWINDOWS_SAC
:Windows Server SAC with Docker (2022 年 8 月 9 日後不再支援)
如要進一步瞭解這些節點映像檔,請參閱「選擇 Windows 節點映像檔」一節。
--no-enable-autoupgrade
停用節點自動升級。啟用前,請先參閱「升級 Windows Server 節點集區」。MACHINE_TYPE_NAME
:定義機器類型。n1-standard-2
是建議的最低機器類型,因為 Windows Server 節點需要額外資源。系統不支援f1-micro
和g1-small
機型。每種機器類型的計費方式不同。詳情請參閱機器類型價目表。WINDOWS_OS_VERSION
:定義要用於圖像類型WINDOWS_LTSC_CONTAINERD
的 Windows OS 版本。這是選用旗標。如未指定,系統會使用預設的 LTSC2019 OS 版本。將值設為ltsc2022
,即可建立 Windows Server 2022 節點集區。將值設為ltsc2019
,即可建立 Windows Server 2019 節點集區。
以下範例說明如何建立 Windows Server 2022 節點集區:
gcloud container node-pools create node_pool_name \
--cluster=cluster_name \
--location=us-central1 \
--image-type=WINDOWS_LTSC_CONTAINERD \
--windows-os-version=ltsc2022
以下範例說明如何更新現有的 Windows 節點集區,改用 Windows Server 2022 OS 映像檔:
gcloud container node-pools create node_pool_name \
--cluster=cluster_name \
--location=us-central1 \
--windows-os-version=ltsc2022
控制台
- 在 Google Cloud 控制台中,前往「建立 Kubernetes 叢集」頁面。
- 在「叢集基本資訊」部分中,完成下列操作:
- 輸入叢集的「名稱」。
- 在「位置類型」部分,選取叢集的所需區域或可用區。
- 在「控制層版本」下方,選取「發布版本」或選擇指定「靜態版本」。靜態版本必須為 1.16.8-gke.9 以上。
- 在導覽窗格的「Node Pools」(節點集區) 下方,按一下「default-pool」(預設集區),即可建立 Linux 節點集區。設定這個節點集區時,您應提供充足的運算資源,以執行叢集外掛程式。您也必須要有可用於節點及其資源 (例如防火牆路徑) 的資源配額。
- 按一下頁面頂端的「新增節點集區」add_box,建立 Windows Server 節點集區。
- 在「節點集區詳細資料」部分,完成下列步驟:
- 輸入節點集區的「名稱」。
- 如果是靜態版本節點,請選擇「節點版本」。
- 輸入要在節點集區中建立的節點數量。
在導覽窗格的「節點集區」下方,按一下「節點」。
在「Image type」(映像檔類型) 下拉式選單中,選取下列其中一個節點映像檔:
- 採用 Docker 的 Windows 長期維護通道
- 採用 containerd 的 Windows 長期維護通道
- 採用 Docker 的 Windows 半年通道
- 採用 containerd 的 Windows 半年通道
詳情請參閱「選擇 Windows 節點映像檔」一節。
選擇執行個體要使用的預設機器設定。
n1-standard-2
是建議的最低大小,因為 Windows Server 節點需要額外資源。系統不支援f1-micro
和g1-small
機器類型。每種機器類型的定價方式不同。詳情請參閱機器類型價目表。
在導覽窗格中,選取 Windows Server 節點集區的名稱。系統隨即會帶您返回「節點集區詳細資料」頁面。
- 在「自動化」下方,取消勾選「啟用節點自動升級功能」核取方塊。啟用自動升級功能前,請先參閱「升級 Windows Server 節點集區」一節。
在導覽窗格的「叢集」下方,選取「網路」。
- 在「進階網路選項」底下,確認已選取「啟用虛擬私有雲原生流量轉送功能 (使用別名 IP)」。Windows Server 節點必須使用別名 IP。如要進一步瞭解其優點,請參閱「瞭解使用別名 IP 的原生容器路由」。
點選「建立」。
Terraform
如要使用 Terraform 建立 GKE Standard 叢集和 Windows Server 節點集區,請參閱下列範例:
這個範例使用 Windows Server LTSC 和 containerd。這是 Windows Server 2022 和 Windows Server 2019 作業系統映像檔的映像檔類型。如要進一步瞭解節點映像檔,請參閱「選擇 Windows 節點映像檔」。
如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。
建立 Windows Server 節點集區後,叢集會進入 RECONCILE
狀態幾分鐘,因為控制層正在更新。
取得 kubectl 憑證
使用 get-credentials
指令,啟用 kubectl
來處理您建立的叢集。
gcloud container clusters get-credentials CLUSTER_NAME \
--location CONTROL_PLANE_LOCATION
如要進一步瞭解 get-credentials
指令,請參閱 SDK 的 get-credentials 說明文件。
等待叢集初始化
使用叢集前,請等待幾秒,直到建立 windows.config.common-webhooks.networking.gke.io
為止。這個 Webhook 會將排程容許條件新增至使用 kubernetes.io/os: windows
節點選取器建立的 Pod,確保這些 Pod 可以在 Windows Server 節點上執行。此外,這項功能也會驗證 Pod,確保 Pod 只使用 Windows 支援的功能。
如要確保已建立 Webhook,請執行下列指令:
kubectl get mutatingwebhookconfigurations
輸出內容應顯示正在執行的 Webhook:
NAME CREATED AT
windows.config.common-webhooks.networking.gke.io 2019-12-12T16:55:47Z
現在您有一個叢集,其中包含兩個節點集區 (一個 Linux 和一個 Windows),您可以部署 Windows 應用程式。
對應 GKE 和 Windows 版本
Microsoft 大約每六個月會發布新的 SAC 版本,每兩到三年則會發布新的 LTSC 版本。這些新版本通常會隨 GKE 新的次要版本推出。在 GKE 子版本中,LTSC 和 SAC 版本通常會維持不變。
如要查看 GKE 版本和 Windows Server 版本之間的對應關係,請使用 gcloud beta container get-server-config
指令:
gcloud beta container get-server-config
版本對應會傳回至回應的 windowsVersionMaps
欄位。如要篩選回應,查看叢集中特定 GKE 版本的對應版本,請在 Linux 殼層或 Cloud Shell 中執行下列步驟。
設定下列變數:
CLUSTER_NAME=CLUSTER_NAME \ NODE_POOL_NAME=NODE_POOL_NAME \ CONTROL_PLANE_LOCATION=CONTROL_PLANE_LOCATION
更改下列內容:
CLUSTER_NAME
:叢集名稱。NODE_POOL_NAME
:Windows Server 節點集區的名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
取得節點集區版本,並儲存在
NODE_POOL_VERSION
變數中:NODE_POOL_VERSION=`gcloud container node-pools describe $NODE_POOL_NAME \ --cluster=$CLUSTER_NAME \ --location=$CONTROL_PLANE_LOCATION \ --format="value(version)"`
取得
NODE_POOL_VERSION
的 Windows Server 版本:gcloud beta container get-server-config \ --location=$CONTROL_PLANE_LOCATION \ --format="yaml(windowsVersionMaps.\"$NODE_POOL_VERSION\")"
輸出結果會與下列內容相似:
windowsVersionMaps: 1.18.6-gke.6601: windowsVersions: - imageType: WINDOWS_SAC osVersion: 10.0.18363.1198 supportEndDate: day: 10 month: 5 year: 2022 - imageType: WINDOWS_LTSC osVersion: 10.0.17763.1577 supportEndDate: day: 9 month: 1 year: 2024
取得
WINDOWS_SAC
映像檔類型的 Windows Server 版本:gcloud beta container get-server-config \ --flatten=windowsVersionMaps.\"$NODE_POOL_VERSION\".windowsVersions \ --filter="windowsVersionMaps.\"$NODE_POOL_VERSION\".windowsVersions.imageType=WINDOWS_SAC" \ --format="value(windowsVersionMaps.\"$NODE_POOL_VERSION\".windowsVersions.osVersion)"
輸出結果會與下列內容相似:
10.0.18363.1198
升級 Windows Server 節點集區
Windows Server 容器版本相容性規定表示,升級節點集區前,您可能需要重建容器映像檔,以符合新版 GKE 的 Windows Server 版本。
為確保容器映像檔與節點保持相容,建議您檢查版本對應,並將 Windows Server 容器映像檔建構為多架構映像檔,以便指定多個 Windows Server 版本。然後,您可以更新容器部署作業,以指定適用於目前和下一個 GKE 版本的多元架構映像檔,再手動叫用 GKE 節點集區升級作業。手動升級節點集區:必須定期執行,因為節點版本不能比控制層版本落後超過兩個子版本。
建議您使用 Pub/Sub 訂閱升級通知,主動接收新版 GKE 和 Windows OS 的最新資訊。
建議您只在持續建構以最新 Windows Server 版本為目標的多架構 Windows Server 容器映像檔時,才啟用節點自動升級功能,尤其是使用 Windows Server SAC 做為節點映像檔類型時。節點自動升級較不可能導致 Windows Server LTSC 節點映像檔類型發生問題,但仍有遇到版本不相容問題的風險。
Windows 更新
Windows Server 節點會停用 Windows 更新。自動更新可能會在無法預測的時間重新啟動節點,而且節點啟動後安裝的任何 Windows 更新,都會在 GKE 重新建立節點時遺失。GKE 會定期更新新版 GKE 中使用的 Windows Server 節點映像檔,提供 Windows 更新。Microsoft 發布 Windows 更新後,可能要過一段時間才會在 GKE 中提供。發布重大安全性更新時,GKE 會盡快更新 Windows Server 節點映像檔。
控管 Windows Pod 和服務的通訊方式
您可以使用網路政策,控管 Windows Pod 和服務的通訊方式。
在 GKE 1.22.2 以上版本中,您可以在啟用網路政策的叢集上使用 Windows Server 容器。這項功能適用於使用 WINDOWS_LTSC
或 WINDOWS_LTSC_CONTAINERD
節點映像檔類型的叢集。
如果控制層或節點執行的是舊版,您可以將節點集區升級至 GKE 1.22.2 以上版本,藉此將節點集區遷移至支援網路政策的版本。只有使用 --enable-dataplane-v2
旗標建立叢集時,才能使用這個選項。
啟用網路政策後,所有先前設定的政策 (包括啟用這項功能前無法在 Windows Server 容器上運作的政策) 都會生效。
部分叢集無法在啟用網路政策的叢集上,搭配 Windows Server 容器使用。詳情請參閱「限制」一節。
查看及查詢記錄
系統會在 GKE 叢集中自動啟用記錄功能。您可以使用 Kubernetes Engine 監控,查看 Windows Server 節點上容器的記錄,以及其他服務的記錄。
以下是取得容器記錄的篩選器範例:
resource.type="k8s_container"
resource.labels.cluster_name="your_cluster_name"
resource.labels.namespace_name="your_namespace_id"
resource.labels.container_name="your_container_name"
resource.labels.Pod_name="your_Pod_name"
使用遠端桌面通訊協定 (RDP) 存取 Windows Server 節點
您可以使用 RDP 連線至叢集中的 Windows Server 節點。如需連線操作說明,請參閱 Compute Engine 說明文件中的「連線至 Windows 執行個體」一文。
建構多架構映像檔
您可以手動建構多架構映像檔,也可以使用 Cloud Build 建構工具。 如需操作說明,請參閱「建構 Windows 多架構映像檔」。
使用 gMSA
下列步驟說明如何搭配 Windows Server 節點集區使用群組管理服務帳戶 (gMSA)。
設定叢集中的 Windows Server 節點,自動加入 AD 網域。如需操作說明,請參閱「設定 Windows Server 節點來自動加入 Active Directory 網域」。
建立 gMSA,並授予存取權給網域加入服務自動建立的安全性群組。您必須在具備 AD 網域管理員存取權的電腦上完成這個步驟。
$instanceGroupUri = gcloud container node-pools describe NODE_POOL_NAME --cluster CLUSTER_NAME --format="value(instanceGroupUrls)" $securityGroupName = ([System.Uri]$instanceGroupUri).Segments[-1] $securityGroup = dsquery group -name $securityGroupName $gmsaName = GMSA_NAME $dnsHostName = DNS_HOST_NAME New-ADServiceAccount -Name $gmsaName -DNSHostName $dnsHostName -PrincipalsAllowedToRetrieveManagedPassword $securityGroup Get-ADServiceAccount $gmsaName Test-ADServiceAccount $gmsaName
更改下列內容:
NODE_POOL_NAME
:Windows Server 節點集區的名稱。自動建立的安全群組名稱與 Windows Server 節點集區相同。CLUSTER_NAME
:叢集名稱。GMSA_NAME
:您為新 gMSA 選擇的名稱。DNS_HOST_NAME
:您建立的服務帳戶完整網域名稱 (FQDN)。舉例來說,如果GMSA_NAME
是webapp01
,且網域是example.com
,則DNS_HOST_NAME
為webapp01.example.com
。
請按照「為 Windows Pod 和容器設定 gMSA」教學課程中的操作說明,設定 gMSA。
刪除 Windows Server 節點集區
使用 gcloud
或 Google Cloud 控制台刪除 Windows Server 節點集區。
gcloud
gcloud container node-pools delete NODE_POOL_NAME \
--cluster=CLUSTER_NAME
--location=CONTROL_PLANE_LOCATION
控制台
如要使用 Google Cloud 控制台刪除 Windows Server 節點集區,請按照下列步驟操作:
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下要編輯的叢集旁的more_vert「Actions」(動作),然後按一下edit「Edit」(編輯)。
選取「節點」分頁標籤。
在「Node Pools」(節點集區) 區段下方,按一下要刪除的節點集區旁邊的「Delete」(刪除) delete。
系統提示您進行確認時,再按一下 [Delete] (刪除)。
限制
Windows Server 容器目前不支援部分 Kubernetes 功能。此外,部分功能僅適用於 Linux,不適用於 Windows。如需 Kubernetes 支援和不支援功能的完整清單,請參閱 Kubernetes 說明文件。
除了不支援的 Kubernetes 功能外,部分 GKE 功能也不支援。
對於 GKE 叢集,Windows Server 節點集區不支援下列功能:
- Cloud TPU (
--enable-tpu
) - 影像串流
- 節點內瀏覽權限
(
--enable-intra-node-visibility
) - IP 偽裝代理程式
- Kubernetes Alpha 版叢集 (
--enable-kubernetes-alpha
) - 節點本機 DNS 快取
- 私人使用 E 類 IP 位址
- 私人使用公開 IP 位址
- 網路政策記錄
- Kubernetes
service.spec.sessionAffinity
- GPU (
--accelerator
) - 將每個節點的 Pod 數量上限設為大於預設上限 110
- Filestore CSI 驅動程式
- 以 Docker 為基礎的 Cloud SQL 驗證 Proxy
- IPv4/IPv6 雙重堆疊網路:Windows 節點不支援 IPv6。
Windows 節點集區僅支援 GKE v1.23.4-gke.400 以上版本的本機外部流量政策。
您想搭配 GKE 叢集使用的其他 Google Cloud 產品可能不支援 Windows Server 節點集區。如需具體限制,請參閱該產品的說明文件。
疑難排解
如需偵錯 Pod 和服務的一般指引,請參閱 Kubernetes 說明文件:偵錯 Pod 和服務。
Containerd 節點問題
如要瞭解使用 Containerd 節點映像檔時的已知問題,請參閱「已知問題」。
Windows Pod 無法啟動
如果 Windows Server 容器與嘗試執行容器的 Windows 節點版本不符,Windows Pod 可能無法啟動。
如果 Windows 節點集區的版本為 1.16.8-gke.8 以上,請參閱 Microsoft 的文件,瞭解 2020 年 2 月 Windows Server 容器不相容問題,並使用包含 2020 年 3 月 Windows 更新的基本 Windows 映像檔建構容器映像檔。如果容器映像檔是以較早的 Windows 基礎映像檔建構而成,可能無法在這些 Windows 節點上執行,也可能導致節點失敗,狀態為 NotReady
。
映像檔提取錯誤
Windows Server 容器映像檔及其組成的個別層可能相當龐大。如果容器層過大,Kubelet 可能會逾時,導致下載及解壓縮作業失敗。
如果看到「Failed to pull image」(無法提取映像檔) 或「Image pull context cancelled」(映像檔提取內容已取消) 錯誤訊息,或是 Pod 的狀態為 ErrImagePull
,就可能遇到這個問題。
如果經常發生映像檔提取作業,您應使用 CPU 規格較高的節點集區。容器擷取作業會在核心之間平行執行,因此核心數較多的機器類型可縮短整體提取時間。
如要順利提取 Windows Server 容器,請嘗試下列做法:
將 Windows Server 容器映像檔的應用程式層分成較小的層,以便更快擷取及解壓縮。這可提高 Docker 的層級快取效率,並增加映像檔提取重試成功的機率。如要進一步瞭解層級,請參閱 Docker 文章「儲存空間驅動程式」。
連線至 Windows Server 節點,並在建立 Pod 前,手動對容器映像檔使用
docker pull
指令。為
kubelet
服務設定image-pull-progress-deadline
旗標,以增加提取容器映像檔的逾時時間。連線至 Windows 節點並執行下列 PowerShell 指令,即可設定標記。
從 Windows 登錄檔取得 Kubelet 服務的現有指令列。
PS C:\> $regkey = "HKLM\SYSTEM\CurrentControlSet\Services\kubelet"
PS C:\> $name = "ImagePath"
PS C:\> $(reg query ${regkey} /v ${name} | Out-String) -match ` "(?s)${name}.*(C:.*kubelet\.exe.*)"
PS C:\> $kubelet_cmd = $Matches[1] -replace ` "--image-pull-progress-deadline=.* ","" -replace "\r\n"," "
為 Kubelet 服務設定新的指令列,並新增旗標來延長逾時時間。
PS C:\> reg add ${regkey} /f /v ${name} /t REG_EXPAND_SZ /d "${kubelet_cmd} ` --image-pull-progress-deadline=40m "
確認變更是否成功。
PS C:\> reg query ${regkey} /v ${name}
重新啟動
kubelet
服務,讓新旗標生效。PS C:\> Restart-Service kubelet
確認
kubelet
服務已成功重新啟動。PS C:\> Get-Service kubelet # ensure state is Running
映像檔系列已終止支援
使用 Windows 映像檔建立節點集區時,您會收到類似下列內容的錯誤訊息:
WINDOWS_SAC image family for 1.18.20-gke.501 has reached end of life, newer versions are still available.
如要解決這個錯誤,請選擇可用的 Windows 映像檔,並確認該映像檔受到支援。
如要查看 GKE Windows 節點映像檔的支援終止日期,請按照「對應 GKE 和 Windows 版本」一節所述,使用 gcloud container get-server-config
指令。
建立節點集區時逾時
如果您要建立大量節點 (例如 500 個),且這是叢集中第一個使用 Windows Server 映像的節點集區,節點集區建立作業可能會逾時。
如要解決這個問題,請減少建立的節點數量。您日後可以增加節點數量。
Windows 節點會變成 NotReady
,並顯示「PLEG is not healthy」錯誤
這是已知的 Kubernetes 問題,如果單一 Windows 節點上快速啟動多個 Pod,就會發生這個問題。如要從這種情況復原,請重新啟動 Windows Server 節點。為避免這個問題,建議您限制 Windows Pod 的建立速率,每 30 秒建立一個 Pod。
TerminationGracePeriod 不一致
容器的 Windows 系統逾時時間可能與您設定的緩衝期不同。這項差異可能會導致 Windows 在傳遞至執行階段的寬限期結束前,強制終止容器。
您可以在映像檔建構期間編輯容器本機登錄檔機碼,藉此修改 Windows 超時設定。如果修改 Windows 逾時,您可能也需要調整 TerminationGracePeriodSeconds,以符合該逾時。
網路連線問題
如果 Windows Server 容器發生網路連線問題,可能是因為 Windows Server 容器網路通常會假設網路 MTU 為 1500
,這與 Google Cloud的 MTU 1460
不相容。
確認容器中網路介面的 MTU 和 Windows Server 節點本身的網路介面都設為相同的值 (即 1460
或更小)。如要瞭解如何設定 MTU,請參閱 Windows 容器的已知問題。
節點啟動問題
如果節點無法在叢集中啟動,或無法順利加入叢集,請查看節點序列埠輸出內容中提供的診斷資訊。
執行下列指令,查看序列埠輸出內容:
gcloud compute instances get-serial-port-output NODE_NAME --zone=COMPUTE_ZONE
更改下列內容:
NODE_NAME
:節點名稱。COMPUTE_ZONE
:特定節點的運算區域。
叢集執行 1.24 以下版本時,Windows 節點中的服務間歇性無法連線
在具有大量主機網路服務負載平衡器規則的 Kubernetes 叢集中啟動 Windows 節點時,處理規則會發生延遲。延遲期間,服務會間歇性無法連線,每條規則的延遲時間約為 30 秒,如果規則數量夠多,總延遲時間可能會很長。詳情請參閱 GitHub 中的原始問題。
如果 GKE 叢集執行的是 1.24 版或更舊版本,且任何 Windows 節點發生事件而重新啟動 kube-proxy
(例如節點啟動、節點升級、手動重新啟動),則在元件同步處理所有規則之前,該節點上執行的 Pod 無法連線至任何服務。
如果 GKE 叢集執行 1.25 以上版本,這項行為會大幅改善。如要進一步瞭解這項改良功能,請參閱 GitHub 中的提取要求。如果遇到這個問題,建議將叢集的控制平面升級至 1.25 以上版本。
後續步驟
- 瞭解如何部署 Windows 應用程式。
- 請參閱 Microsoft 的 Windows 容器簡介。
- 請參閱 Microsoft 的指引,瞭解如何選擇容器基本映像檔。
- 請參閱 Microsoft 的「Windows 容器版本相容性」一文。