部署 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 以获取最新版本。

将 Windows Server 应用部署到集群

如需将 Windows Server 应用部署到 GKE 公共集群,您需要执行以下任务:

  1. 创建集群。
  2. 创建 Deployment 清单文件。
  3. 创建和公开 Deployment。
  4. 验证 Pod 是否正在运行。

创建集群

如果您已有使用 Windows Server 节点池的 GKE 集群,请继续执行下一步。否则,请使用 Windows Server 节点池创建集群

创建 Deployment 清单文件

Windows Server 节点已使用以下键值对添加了污点node.kubernetes.io/os=windows:NoSchedule

此污点可确保 GKE 调度器不会尝试在 Windows Server 节点上运行 Linux 容器。如需在 Windows Server 节点上调度 Windows Server 容器,您的清单文件必须包含以下节点选择器:

nodeSelector:
 kubernetes.io/os: windows

在集群中运行的准入网络钩子会检查新工作负载中是否存在此 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 进行公开。

  1. 要创建 Deployment 资源,请运行以下命令:

    kubectl apply -f iis.yaml
    
  2. 要将 Deployment 公开为外部负载均衡器,请运行以下命令:

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

验证 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 容器应用部署到专用集群

Windows Server 容器映像具有多个层,基础层由 Microsoft 提供。基础层存储为外部层,而不会像 Linux Docker 映像层一样嵌入到映像中。首次拉取 Windows Server 容器映像时,通常必须从 Microsoft 服务器下载基础层。由于专用集群节点无法连接到互联网,因此无法直接从 Microsoft 服务器拉取 Windows Server 基础容器层。

要使用专用集群,您可以将 Docker 守护程序配置为允许将不可分发的层推送到私有注册表。如需了解详情,请参阅 Docker 的 GitHub 页面上的允许推送不可分发的制品

如需将 Windows Server 应用部署到专用集群,请执行以下操作:

  1. 创建具有 Windows Server 节点的专用集群。
  2. 构建 Windows Server 应用 Docker 映像。
  3. 将应用部署到专用集群。
  4. 验证 Pod 是否正在运行。

创建专用集群

按照创建具有 Windows Server 节点的集群创建专用集群中的说明进行创建,并向专用集群添加 Windows 节点池。

构建 Windows Server 应用 Docker 映像

  1. 如需构建 Docker 映像,请使用您要在其中运行应用容器的 Windows Server 版本(例如 Windows Server 2019 或 Windows Server 20H2 版)启动 Compute Engine 实例。此外,请确保您已连接到互联网。

  2. 在 Compute Engine 实例中,转到 Docker 守护程序配置:

    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 守护程序:

    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 版本的节点池。它们还可以组合 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 操作系统版本的工作负载

Windows Server 节点支持 LTSC2022 和 LTSC2019 操作系统映像。可以在 nodeSelector 中使用以下键值对指定要使用的 Windows 操作系统版本 (LTSC2022):cloud.google.com/gke-windows-os-version=2022

此节点标签可确保 GKE 调度器选择正确的 Windows Server 节点来运行 LTSC2022 或 LTSC2019 工作负载。Windows Server 节点都属于映像类型 windows_ltsc_containerd。节点标签的值可以是 20222019。如果未指定节点标签,则可以使用 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

这样可以提供额外的保护措施,以避免在 NoSchedule 污点意外地从 Windows Server 节点中移除时 Linux 工作负载被调度到 Windows Server 节点上。