部署 Windows Server 应用

在本页面中,您将了解如何部署无状态 Windows Server 应用。您还可以了解如何部署有状态 Windows 应用

将 Windows Server 应用部署到标准集群

以下任务将指导您部署 Windows Server 应用:

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

创建集群

如需了解相关说明,请参阅使用 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. 获取服务的状态,并等待外部 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 应用映像。

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

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

    PS C:\> cat C:\ProgramData\docker\config\daemon.json
    
  3. 通过添加以下几行代码,配置 Docker daemon.json 文件,以允许将外部层推送到您的私有注册表:

    {
      "allow-nondistributable-artifacts": ["gcr.io"]
    }
    

    gcr.io 是指 Container Registry,映像将托管在其中。

  4. 重启 Docker 守护程序:

    PS C:\> Restart-Service docker
    
  5. 为应用构建和标记 Docker 映像:

    PS C:\> cd C:\my-app
    
    PS C:\my-app> docker build -t gcr.io/my-project/my-app:v2 .
    

    此命令指示 Docker 使用当前目录中的 Dockerfile 构建映像,并使用名称(例如 gcr.io/my-project/my-app:v2)对其进行标记。

  6. 将应用的 Docker 映像推送到 my-project 中的 gcr.io 注册表。 借助 allow-nondistributable-artifacts 配置集,系统可以将 Windows 基础层推送到您的私有注册表。

    PS C:\my-app> docker push gcr.io/my-project/my-app:v2
    

创建 Deployment 清单文件

下面展示了名为 my-app.yaml 的示例部署清单文件。此示例中的映像是您在上一步中推送的映像 (gcr.io/my- project/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: gcr.io/my-project/my-app:v2

如需将此应用部署到您的专用集群,请运行以下命令:

gcloud container clusters get-credentials var>private-cluster-name
kubectl apply -f my-app.yaml

其中 private-cluster-name 是您创建的集群的名称。

验证 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 映像类型(LTSC 或 SAC)的节点池添加到集群。在具有混合 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 或 SAC 版本的 Windows Server 节点池,我们建议您将容器映像构建为可在集群中使用的所有 Windows Server 版本上运行的多架构映像gke-os-distribution 节点标签不足以防止您的工作负载可能被调度到不兼容的节点上。

在集群中使用 Linux 工作负载和 Windows Server 工作负载

将以下节点选择器添加到您的 Linux 工作负载,以确保始终将其调度到 Linux 节点:

nodeSelector:
   kubernetes.io/os: linux

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