部署 Windows Server 應用程式

本頁說明如何在 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 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

將 Windows Server 應用程式部署至具有公開節點的叢集

如要將 Windows Server 應用程式部署至只有公開節點的 GKE 叢集,請執行下列工作:

  1. 建立具有公開節點的叢集。
  2. 建立 Deployment 資訊清單檔案。
  3. 建立並公開 Deployment。
  4. 確認 Pod 正在執行。

建立具有公開節點的叢集

如果您已有使用 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 taint 的容許條件。

資訊清單檔案範例

以下 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 服務。

  1. 執行下列指令,建立 Deployment 資源:

    kubectl apply -f iis.yaml
    
  2. 如要將 Deployment 設為外部負載平衡器,請執行下列指令:

    kubectl expose deployment iis \
        --type=LoadBalancer \
        --name=iis
    

確認 Pod 正在執行

驗證 Pod,確認 Pod 運作正常。

  1. 使用 kubectl 檢查 Pod 的狀態:

    kubectl get pods
    
  2. 等待傳回的輸出內容顯示 Pod 狀態為 Running:

    NAME                   READY     STATUS    RESTARTS   AGE
    iis-5c997657fb-w95dl   1/1       Running   0          28s
    
  3. 取得服務狀態,並等待 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 應用程式部署至已啟用私人節點的叢集,請按照下列步驟操作:

  1. 建立含有 Windows Server 節點的叢集,並啟用私人節點。
  2. 建構 Windows Server 應用程式 Docker 映像檔。
  3. 將應用程式部署至啟用私人節點的叢集。
  4. 確認 Pod 正在執行。

建立具有私人節點的叢集

請按照「建立含有 Windows Server 節點的叢集」中的操作說明,如要佈建僅具備內部 IP 位址的節點 (私人節點),請在建立叢集時使用 --enable-private-nodes 旗標。

建構 Windows Server 應用程式 Docker 映像檔

  1. 如要建構 Docker 映像檔,請啟動 Compute Engine 執行個體,並使用您想在應用程式容器上執行的 Windows Server 版本,例如 Windows Server 2019 或 Windows Server 20H2 版。此外,請確認已連上網際網路。

  2. 在 Compute Engine 執行個體中,前往 Docker Daemon 設定:

    cat C:\ProgramData\docker\config\daemon.json
    
  3. 設定 Docker daemon.json 檔案,加入下列幾行程式碼,允許將外部層推送至私人登錄檔:

    {
      "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"]
    }
    

    在本範例中,REGISTRY_REGION-docker.pkg.dev 是指 Artifact Registry,也就是映像檔的代管位置。

  4. 重新啟動 Docker Daemon:

    Restart-Service docker
    
  5. 在 Artifact Registry 建立 Docker 存放區。

  6. 為應用程式建構及標記 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。

  7. 將應用程式的 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
  1. 使用 get-credentials 指令,啟用 kubectl 來處理您建立的叢集:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    將 CLUSTER_NAME 替換為您建立的叢集名稱。

  2. 將 my-app.yaml 檔案中指定的應用程式部署至叢集:

    kubectl apply -f my-app.yaml
    

確認 Pod 正在執行

列出所有 Pod,確保應用程式正常運作:

kubectl get pods

您應該會看到 Pod,狀態為 Running,如下列輸出內容所示:

NAME                     READY   STATUS    RESTARTS   AGE
my-app-c95fc5596-c9zcb   1/1     Running   0          5m

使用混合節點映像檔

叢集可以包含多個 Windows Server 版本的節點集區。也可以合併 Windows Server 和 Linux 工作負載。如要瞭解如何設定工作負載以使用這些類型的叢集,請參閱下列各節。

使用不同 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 版本執行 Windows Server 節點集區,建議將容器映像檔建構為多架構映像檔,以便在叢集使用的所有 Windows Server 版本上執行。gke-os-distribution 節點標籤不足以防止工作負載排程到不相容的節點上。

在叢集中使用 Linux 和 Windows Server 工作負載

在 Linux 工作負載中新增下列節點選取器,確保工作負載一律排定至 Linux 節點:

nodeSelector:
   kubernetes.io/os: linux

這樣一來,即使不小心從 Windows Server 節點移除 NoSchedule 汙點,也能提供額外保護,避免 Linux 工作負載排程至 Windows Server 節點。