本頁說明如何在 Google Kubernetes Engine (GKE) 叢集上部署無狀態的 Windows Server 應用程式。您也可以瞭解如何部署有狀態的 Windows 應用程式。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Artifact Registry API 和 Google Kubernetes Engine API。 啟用 API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
將 Windows Server 應用程式部署至具有公開節點的叢集
如要將 Windows Server 應用程式部署至只有公開節點的 GKE 叢集,請執行下列工作:
建立具有公開節點的叢集
如果您已有使用 Windows Server 節點集區的 GKE 叢集,請繼續執行下一個步驟。否則,請使用 Windows Server 節點集區建立叢集。
如要佈建具有外部 IP 位址的節點 (公開節點),請在建立叢集時使用 --no-enable-private-nodes
標記。
建立 Deployment 資訊清單檔案
Windows Server 節點會汙損,並使用以下鍵/值組合:node.kubernetes.io/os=windows:NoSchedule
。
這個汙點可確保 GKE 排程器不會嘗試在 Windows Server 節點上執行 Linux 容器。如要在 Windows Server 節點上排定 Windows Server 容器,資訊清單檔案必須包含下列節點選取器:
nodeSelector:
kubernetes.io/os: windows
叢集中執行的許可 Webhook 會檢查新工作負載是否含有這個 Windows 節點選取器,如果有的話,就會將下列容許度套用至工作負載,讓工作負載在受汙染的 Windows Server 節點上執行:
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/os
operator: Equal
value: windows
在某些情況下,您可能需要在資訊清單檔案中明確加入這項容許度。舉例來說,如果您要部署 DaemonSet,並使用多架構容器映像檔在叢集中的所有 Linux 和 Windows Server 節點上執行,則資訊清單檔案不會包含 Windows 節點選取器。您必須明確加入 Windows 汙染的容錯。
資訊清單檔案範例
下列 Deployment 檔案 (iis.yaml
) 會將 Microsoft 的 IIS 映像檔部署至單一 Pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: iis
labels:
app: iis
spec:
replicas: 1
selector:
matchLabels:
app: iis
template:
metadata:
labels:
app: iis
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: iis-server
image: mcr.microsoft.com/windows/servercore/iis
ports:
- containerPort: 80
這個檔案適用於所有工作負載使用相同 Windows Server 節點映像檔類型和版本的叢集。如要瞭解如何使用混合節點映像檔,請參閱「使用混合節點映像檔」一節。
建立及發布 Deployment
建立您在上一個步驟中建立的 Deployment 檔案,並以外部負載平衡器 Deployment 的形式,將其公開為 Kubernetes Service。
如要建立 Deployment 資源,請執行下列指令:
kubectl apply -f iis.yaml
如要將 Deployment 公開為外部負載平衡器,請執行下列指令:
kubectl expose deployment iis \ --type=LoadBalancer \ --name=iis
確認 Pod 正在執行
請驗證 Pod,確保運作正常。
使用
kubectl
檢查 Pod 的狀態:kubectl get pods
請等待傳回的輸出內容顯示 Pod 的狀態為
Running
:NAME READY STATUS RESTARTS AGE iis-5c997657fb-w95dl 1/1 Running 0 28s
取得服務狀態,並等待
EXTERNAL-IP
欄位填入資料:kubectl get service iis
您應該會看到以下的輸出內容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE iis LoadBalancer 10.44.2.112 external-ip 80:32233/TCP 17s
現在,你可以使用瀏覽器開啟 http://EXTERNAL_IP
,查看 IIS 網頁。
將 Windows Server 應用程式部署至含有私人節點的叢集
本節說明如何將 Windows Server 容器應用程式部署至僅啟用私人節點的 GKE 叢集。
Windows Server 容器映像檔有多個層,基礎層由 Microsoft 提供。基礎層會儲存為外部層,而不是像 Linux Docker 映像檔層一樣嵌入映像檔。首次提取 Windows Server 容器映像檔時,通常必須從 Microsoft 伺服器下載基礎層。由於私人節點無法連線至網際網路,因此無法直接從 Microsoft 伺服器提取 Windows Server 基礎容器層。
如要使用已啟用私人節點的叢集,可以設定 Docker Daemon,允許將不可發布的層推送至私人登錄檔。詳情請參閱 Docker GitHub 頁面上的「Allow push of non-distributable artifacts」。
如要將 Windows Server 應用程式部署至已啟用私人節點的叢集,請按照下列步驟操作:
- 建立含有 Windows Server 節點的叢集,並啟用私人節點。
- 建構 Windows Server 應用程式 Docker 映像檔。
- 將應用程式部署至已啟用私人節點的叢集。
- 確認 Pod 正在執行。
建立具有私人節點的叢集
請按照「建立含有 Windows Server 節點的叢集」中的操作說明操作。如要佈建僅含內部 IP 位址的節點 (私人節點),請在建立叢集時使用 --enable-private-nodes
標記。
建構 Windows Server 應用程式 Docker 映像檔
如要建構 Docker 映像檔,請啟動 Compute Engine 執行個體,並使用您要執行應用程式容器的 Windows Server 版本,例如 Windows Server 2019 或 Windows Server 20H2 版。此外,請確認已連上網路。
在 Compute Engine 執行個體中,前往 Docker Daemon 設定:
cat C:\ProgramData\docker\config\daemon.json
設定 Docker
daemon.json
檔案,允許將外部層推送至私人登錄檔,方法是新增下列幾行:{ "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"] }
在本範例中,
REGISTRY_REGION-docker.pkg.dev
是指 Artifact Registry,映像檔會在此處託管。重新啟動 Docker Daemon:
Restart-Service docker
為應用程式建構及標記 Docker 映像檔:
cd C:\my-app
docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
這個指令會指示 Docker 使用目前目錄中的 Dockerfile 建構映像檔,並為映像檔標記名稱,例如
us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2
。將應用程式的 Docker 映像檔推送至專案的 Artifact Registry 存放區。
allow-nondistributable-artifacts
設定集會將 Windows 基礎層推送至您的私人登錄檔。docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
建立 Deployment 資訊清單檔案
以下是名為 my-app.yaml
的 Deployment 資訊清單檔案範例。本範例中的映像檔是您在上一個步驟中推送的映像檔 (REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
)。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: my-server
image: REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
使用
get-credentials
指令,啟用kubectl
來使用您建立的叢集:gcloud container clusters get-credentials CLUSTER_NAME
將
CLUSTER_NAME
替換為您建立的叢集名稱。將
my-app.yaml
檔案中指定的應用程式部署至叢集:kubectl apply -f my-app.yaml
確認 Pod 正在執行
列出所有 Pod,確保應用程式正常運作:
kubectl get pods
您應該會看到狀態為 Running
的 Pod,如下列輸出內容所示:
NAME READY STATUS RESTARTS AGE
my-app-c95fc5596-c9zcb 1/1 Running 0 5m
使用混合節點映像檔
叢集可以包含多個 Windows Server 類型和 Windows Server 版本的節點集區。也可以合併 Windows Server 和 Linux 工作負載。下列各節詳細說明如何設定工作負載,以使用這些類型的叢集。
使用不同 Windows Server 節點映像檔類型的工作負載
您可以將使用不同 Windows Server 映像檔類型的節點集區新增至叢集。在混合 Windows Server 類型的叢集中,您必須確保 Windows Server 容器不會排定到不相容的 Windows Server 節點上。
如果您有一個 Windows Server LTSC 節點集區和一個 Windows Server SAC 節點集區,請將 gke-os-distribution
節點標籤新增至兩個工作負載。
在 Windows Server LTSC 工作負載的資訊清單檔案中加入下列 nodeSelector:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
在 Windows Server SAC 工作負載的資訊清單檔案中加入下列 nodeSelector。
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_sac
新增這個標籤可確保 LTSC 容器映像檔不會排定到不相容的 SAC 節點,反之亦然。
使用不同 Windows Server LTSC OS 版本的工作負載
Windows Server 節點支援 LTSC2022 和 LTSC2019 OS 映像檔。您可以在 nodeSelector 中使用下列鍵值組,指定要使用的 Windows OS 版本 (LTSC2022):cloud.google.com/gke-windows-os-version=2022
。
這個節點標籤可確保 GKE 排程器會選擇正確的 Windows Server 節點,執行 LTSC2022 或 LTSC2019 工作負載。Windows Server 節點都屬於 windows_ltsc_containerd
映像檔類型。節點標籤的值可以是 2022
或 2019
。如果未指定節點標籤,則 LTSC2019 或 LTSC2022 節點都可用於排定容器。如要僅在 Windows Server LTSC2022 節點上排定 Windows Server 容器,資訊清單檔案必須包含下列節點選取器:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
cloud.google.com/gke-windows-os-version: 2022
使用不同 Windows Server 版本的工作負載
如需執行多個不同 LTSC 或 SAC 版本的 Windows Server 節點集區,建議您將容器映像檔建構為多架構映像檔,以便在叢集使用的所有 Windows Server 版本上執行。gke-os-distribution
節點標籤不足以防止工作負載排定在不相容的節點上。
在叢集中使用 Linux 和 Windows Server 工作負載
在 Linux 工作負載中新增下列節點選取器,確保工作負載一律排定至 Linux 節點:
nodeSelector:
kubernetes.io/os: linux
這樣可提供額外保護,避免 Linux 工作負載排定至 Windows Server 節點上,以防 Windows Server 節點意外移除 NoSchedule
汙點。