使用 Windows Server 节点池创建集群


在本页面中,您将了解如何使用运行 Microsoft Windows Server 的节点池创建 Google Kubernetes Engine (GKE) 集群。在此集群中,您可以使用 Windows Server 容器。目前不支持 Microsoft Hyper-V 容器。 与 Linux 容器类似,Windows Server 容器提供进程和命名空间隔离机制。

Windows Server 节点需要的资源比典型 Linux 节点更多。Windows Server 节点需要使用额外资源来运行 Windows 操作系统和无法在容器中运行的 Windows Server 组件。由于 Windows Server 节点需要更多资源,因此与 Linux 节点相比,可分配的资源会更少。

使用 Windows Server 节点池创建集群

在本部分中,您将创建一个使用 Windows Server 容器的集群。

为创建此集群,您需要完成以下任务:

  1. 选择您的 Windows Server 节点映像
  2. 更新并配置 gcloud
  3. 创建集群和节点池
  4. 获取 kubectl 凭据
  5. 等待集群初始化

选择您的 Windows Server 节点映像

如需在 GKE 上运行,您需要基于 Windows Server 版本 2019 (LTSC)、Windows Server 版本 20H2 (SAC) 或 Windows Server 版本 2022 (LTSC) 构建 Windows Server 容器节点映像。一个集群可以具有多个使用不同 Windows Server 版本的 Windows Server 节点池,但每个单独的节点池只能使用一个 Windows Server 版本。

在选择节点映像时,请考虑以下事项:

  • 支持时间安排
    • Windows Server 节点映像的支持时间安排由 Microsoft 提供的支持时间安排决定,如操作系统映像的支持政策中所述。您可以使用 gcloud container get-server-config 命令查找 GKE Windows 节点映像的支持结束日期,如映射 GKE 和 Windows 版本部分中所述。
    • Microsoft 仅在 SAC 版本首次发布后的 18 个月内对其提供支持。如果您为节点池映像类型选择 SAC,但不将节点池升级到面向较新 SAC 版本的较新 GKE 版本,在 SAC 版本的支持生命周期结束后,您就无法在节点池中创建新节点。详细了解 Google 针对 Windows Server 操作系统的支持。我们建议使用 LTSC,因为它的支持生命周期更长。
    • 如果您在稳定发布版本中注册 GKE 集群,请勿选择 SAC。由于 Microsoft 仅支持 SAC 版本 18 个月,因此当稳定 GKE 版本仍然可用时,SAC 节点池映像可能不受支持。
  • 版本兼容性和复杂性
    • 只有在您可以升级节点池以及在其中定期运行的容器时,才选择 SAC。GKE 会定期在新的 GKE 版本中更新 Windows 节点池所用的 SAC 版本,因此为您的节点池映像类型选择 SAC 需要您更加频繁地重新构建容器。
    • 如果您不确定要使用哪种 Windows Server 映像类型,我们建议选择 Windows Server LTSC,以避免在升级节点池时出现版本不兼容问题。如需了解详情,请参阅 Microsoft 文档中的 Windows Server 服务渠道:LTSC 和 SAC
    • Windows Server CoreNano Server 均可用作容器的基础映像。
    • Windows Server 容器具有重要的版本兼容性要求:
      • 针对 LTSC 构建的 Windows Server 容器不会在 SAC 节点上运行,反之亦然。
      • 如果没有面向其他 LTSC 或 SAC 版本来重新构建,那么针对特定 LTSC 或 SAC 版本构建的 Windows Server 容器便不会在其他这些版本上运行。
    • 若将 Windows Server 容器映像构建为可面向多个 Windows Server 版本的多架构映像,便可帮助您管理这种版本控制复杂性。
  • 新增功能
    • 新的 Windows Server 功能通常会先引入 SAC 版本。因此,新的 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 以获取最新版本。

创建集群和节点池

如需运行 Windows Server 容器,您的集群必须至少具有一个 Windows 节点池和一个 Linux 节点池。不能仅使用 Windows Server 节点池创建集群。如需运行关键集群插件,您需要使用 Linux 节点池。

鉴于自动扩缩的重要性,我们建议您启用自动扩缩功能,以确保 Linux 节点池能够运行集群插件。

gcloud

使用以下字段创建集群:

gcloud container clusters create CLUSTER_NAME \
    --enable-ip-alias \
    --num-nodes=NUMBER_OF_NODES \
    --cluster-version=VERSION_NUMBER \
    --release-channel CHANNEL

替换以下内容:

  • CLUSTER_NAME:您为集群选择的名称。
  • --enable-ip-alias 表示启用别名 IP。别名 IP 是 Windows Server 节点的必需设置。如需详细了解使用别名 IP 的优势,请参阅了解使用别名 IP 的原生容器路由
  • NUMBER_OF_NODES:您创建的 Linux 节点数量。您应该提供足够的计算资源以用于运行集群插件。这是一个可选字段,如果省略,则使用默认值 3
  • VERSION_NUMBER:您要使用的特定集群版本,必须为 1.16.8-gke.9 或更高版本。如果您未指定发布渠道,则 GKE 会在该版本可用的最成熟发布渠道中注册您的集群。
  • CHANNEL:用于注册集群的发布版本,可以是 rapidregularstableNone 之一。默认情况下,集群会注册在 regular 发布版本中,除非至少指定了以下标志之一:--cluster-version--release-channel--no-enable-autoupgrade--no-enable-autorepair。如果选择集群版本并且不希望在发布渠道中注册您的集群,则必须指定 None

使用以下字段创建 Windows Server 节点池:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --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:您在上文中创建的集群的名称。
  • IMAGE_NAME:您可以指定以下某个值:

    如需详细了解这些节点映像,请参阅选择 Windows 节点映像部分。

  • --no-enable-autoupgrade 表示停用节点自动升级功能。启用前,请先查看升级 Windows Server 节点池

  • MACHINE_TYPE_NAME:定义机器类型。n1-standard-2 是建议机器类型的最低要求,因为 Windows Server 节点需要更多资源。不支持 f1-microg1-small 机器类型。每种机器类型的计费方式都各不相同。如需了解详情,请参阅机器类型价格表

  • WINDOWS_OS_VERSION:定义要用于映像类型 WINDOWS_LTSC_CONTAINERD 的 Windows 操作系统版本。这是一个可选标志。如果未指定,则使用的默认操作系统版本是 LTSC2019。将值设置为 ltsc2022 可创建 Windows Server 2022 节点池。将值设置为 ltsc2019 可创建 Windows Server 2019 节点池。

以下示例展示了如何创建 Windows Server 2022 节点池:

gcloud container node-pools create node_pool_name \
    --cluster=cluster_name \
    --image-type=WINDOWS_LTSC_CONTAINERD \
    --windows-os-version=ltsc2022

以下示例展示了如何更新现有 Windows 节点池以使用 Windows Server 2022 操作系统映像:

gcloud container node-pools create node_pool_name \
    --cluster=cluster_name \
    --windows-os-version=ltsc2022

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 集群基本信息部分,完成以下操作:

    1. 输入集群的名称
    2. 对于位置类型,请为集群选择所需的区域或地区
    3. 控制平面版本下,选择一个发布版本或选择静态版本。静态版本必须为 1.16.8-gke.9 或更高版本。
  4. 在导航窗格的节点池下,点击 default-pool 以创建 Linux 节点池。配置此节点池时,您应该提供足够的计算资源以用于运行集群插件。您还必须具有节点及其资源(例如防火墙路由)的可用资源配额

  5. 在页面顶部,点击 添加节点池以创建 Windows Server 节点池。

  6. 节点池详情部分,完成以下操作:

    1. 输入节点池名称
    2. 对于静态版本节点,请选择节点版本
    3. 输入要在节点池中创建的节点数
  7. 在导航窗格的节点池下,点击节点

    1. 映像类型下拉列表中,选择以下节点映像之一:

      • 带有 Docker 的 Windows 长期服务渠道
      • 带有 Containerd 的 Windows 长期服务渠道
      • 带有 Docker 的 Windows 半年渠道
      • 带有 Containerd 的 Windows 半年渠道

      如需了解详情,请参阅选择 Windows 节点映像部分。

    2. 选择要用于实例的默认机器配置n1-standard-2 是建议的最小大小,因为 Windows Server 节点需要更多资源。不支持 f1-microg1-small 机器类型。每种机器类型的计费方式都各不相同。如需了解详情,请参阅机器类型价格表

  8. 从导航窗格中,选择 Windows Server 节点池的名称。您会返回到节点池详情页面。

    1. 自动化下,取消选中启用节点自动升级 (Enable node auto-upgrade) 复选框。在启用自动升级之前,请先查看升级 Windows Server 节点池部分。
  9. 在导航窗格的集群下,选择网络

    1. 高级网络选项下,确保选中启用 VPC 原生流量路由(使用别名 IP)。别名 IP 是 Windows Server 节点的必需设置。如需详细了解使用别名 IP 的优势,请参阅了解使用别名 IP 的原生容器路由
  10. 点击创建

Terraform

您可以使用 Google Terraform 提供程序创建具有 Windows Server 节点池的 GKE 集群。

将此地址块添加到您的 Terraform 配置:

resource "google_container_cluster" "cluster" {
  project  = "PROJECT_ID"
  name     = "CLUSTER_NAME"
  location = "LOCATION"

  min_master_version = "VERSION_NUMBER"

  # Enable Alias IPs to allow Windows Server networking.
  ip_allocation_policy {
    cluster_ipv4_cidr_block  = "/14"
    services_ipv4_cidr_block = "/20"
  }

  # Removes the implicit default node pool, recommended when using
  # google_container_node_pool.
  remove_default_node_pool = true
  initial_node_count       = 1
}

# Small Linux node pool to run some Linux-only Kubernetes Pods.
resource "google_container_node_pool" "linux_pool" {
  name       = "linux-pool"
  project    = google_container_cluster.cluster.project
  cluster    = google_container_cluster.cluster.name
  location   = google_container_cluster.cluster.location
  node_count = 1

  node_config {
    image_type = "COS_CONTAINERD"
  }
}

# Node pool of Windows Server machines.
resource "google_container_node_pool" "windows_pool" {
  name       = "NODE_POOL_NAME"
  project    = google_container_cluster.cluster.project
  cluster    = google_container_cluster.cluster.name
  location   = google_container_cluster.cluster.location
  node_count = 1

  node_config {
    image_type   = "IMAGE_NAME"
    machine_type = "MACHINE_TYPE_NAME"
  }

  # The Linux node pool must be created before the Windows Server node pool.
  depends_on = [google_container_node_pool.linux_pool]
}

替换以下内容:

  • PROJECT_ID:创建集群的项目 ID。
  • CLUSTER_NAME:GKE 集群的名称。
  • LOCATION:创建集群的位置(区域或可用区)。
  • VERSION_NUMBER:必须为 1.16.8-gke.9 或更高版本。
  • NODE_POOL_NAME:您为 Windows Server 节点池选择的名称。
  • IMAGE_NAME:您可以指定以下某个值:

    如需详细了解这些节点映像,请参阅选择 Windows 节点映像部分。

  • MACHINE_TYPE_NAME:定义机器类型。n1-standard-2 是建议机器类型的最低要求,因为 Windows Server 节点需要更多资源。不支持 f1-microg1-small 机器类型。每种机器类型的计费方式都各不相同。如需了解详情,请参阅机器类型价格表

创建 Windows Server 节点池后,随着控制平面的更新,集群会进入 RECONCILE 状态几分钟。

获取 kubectl 凭据

使用 get-credentials 命令启用 kubectl,以处理您创建的集群。

gcloud container clusters get-credentials CLUSTER_NAME

如需详细了解 get-credentials 命令,请参阅 SDK get-credentials 文档。

等待集群初始化

在使用集群之前,请等待几秒钟,直到 windows.config.common-webhooks.networking.gke.io 创建完毕。该网络钩子会为使用 kubernetes.io/os: windows 节点选择器创建的 Pod 添加调度容忍机制,以确保这些 Pod 可以在 Windows Server 节点上运行。此外,它还会验证 Pod,以确保其仅使用 Windows 上支持的功能。

如需确保该网络钩子成功创建,请运行以下命令:

kubectl get mutatingwebhookconfigurations

输出应显示该网络钩子正在运行:

NAME                                              CREATED AT
windows.config.common-webhooks.networking.gke.io  2019-12-12T16:55:47Z

现在,您的集群已包含两个节点池(一个 Linux 节点池和一个 Windows 节点池),接下来您就可以部署 Windows 应用了。

映射 GKE 和 Windows 版本

Microsoft 大约每 6 个月发布一次新的 SAC 版本,每 2 至 3 年发布一次新的 LTSC 版本。这些新版本通常会在新的 GKE 次要版本中提供。在 GKE 次要版本中,LTSC 和 SAC 版本通常保持不变。

如需查看 GKE 版本和 Windows Server 版本之间的版本映射,请使用 gcloud beta container get-server-config 命令:

gcloud beta container get-server-config

版本映射会在响应的 windowsVersionMaps 字段中返回。如需过滤响应以查看集群中特定 GKE 版本的版本映射,请在 Linux shell 或 Cloud Shell 中执行以下步骤。

  1. 设置以下变量:

    CLUSTER_NAME=CLUSTER_NAME
    NODE_POOL_NAME=NODE_POOL_NAME
    ZONE=COMPUTE_ZONE
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • NODE_POOL_NAME:Windows Server 节点池的名称。
    • COMPUTE_ZONE:集群的计算可用区
  2. 获取节点池版本并将其存储在 NODE_POOL_VERSION 变量中:

    NODE_POOL_VERSION=`gcloud container node-pools describe $NODE_POOL_NAME \
    --cluster $CLUSTER_NAME --zone $ZONE --format="value(version)"`
    
  3. 获取 NODE_POOL_VERSION 的 Windows Server 版本:

    gcloud beta container get-server-config \
        --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
    
  4. 获取 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 操作系统版本的更新。

我们建议,只有在您持续构建面向最新 Windows Server 版本的多架构 Windows Server 容器映像时(尤其是在您将 Windows Server SAC 用作节点映像类型时),才启用节点自动升级。节点自动升级不太可能导致 Windows Server LTSC 节点映像类型的相关问题,但仍有遇到版本不兼容问题的风险。

Windows 更新

Windows Server 节点的 Windows 更新已停用。自动更新可能会导致节点在不可预测的时间点重启,而在 GKE 重新创建节点后,在该节点启动后安装的任何 Windows 更新都将丢失。GKE 对新 GKE 版本中使用的 Windows Server 节点映像定期更新,从而提供 Windows 更新。Microsoft 发布 Windows 更新与 GKE 中提供 Windows 更新之间可能存在延迟。关键安全更新发布后,GKE 会尽快更新 Windows Server 节点映像。

控制 Windows Pod 与 Service 的通信方式

您可以使用网络政策控制 Windows Pod 与 Service 的通信方式。

对于在 GKE 1.22.2 版及更高版本中启用了网络政策的集群,您可以在其上使用 Windows Server 容器。此功能适用于使用 WINDOWS_LTSCWINDOWS_LTSC_CONTAINERD 节点映像类型的集群。

如果您的控制平面或节点运行的是早期版本,您可以将节点池和控制平面升级到 GKE 1.22.2 版或更高版本,从而将节点池迁移到支持网络政策的版本。此选项仅适用于创建时设置了 --enable-dataplane-v2 标志的集群。

启用网络政策后,所有先前配置的政策(包括在启用该功能之前不适用于 Windows Server 容器的政策)都将变为有效状态。

某些集群不能与启用了网络政策的集群上的 Windows Server 容器搭配使用。如需了解详情,请参阅下面的限制部分。

查看和查询日志

GKE 集群会自动启用日志记录功能。您可以使用 Kubernetes Engine Monitoring 查看容器的日志和 Windows 服务器节点上其他服务的日志。

以下是用于获取容器日志的过滤条件示例:

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

以下步骤介绍了如何将群组管理的服务账号 (gMSA) 与 Windows Server 节点池搭配使用。

  1. 在集群中配置 Windows Server 节点以自动加入 AD 域。有关说明,请参阅配置 Windows Server 节点以自动加入 Active Directory 域

  2. 创建并授予一个 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_NAMEwebapp01,并且网域为 example.com,则 DNS_HOST_NAMEwebapp01.example.com
  3. 按照为 Windows Pod 和容器配置 GMSA 教程中的说明配置 gMSA。

删除 Windows Server 节点池

使用 gcloud 或 Google Cloud 控制台删除 Windows Server 节点池。

gcloud

gcloud container node-pools delete NODE_POOL_NAME \
    --cluster=CLUSTER_NAME

控制台

若要使用 Google Cloud 控制台删除 Windows Server 节点池,请执行以下步骤:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在要修改的集群旁边,点击 操作,然后点击 修改

  3. 选择节点标签页。

  4. 节点池部分下,点击要删除的节点池旁边的 删除

  5. 当系统提示您确认时,再次点击删除

限制

某些 Kubernetes 功能尚不受 Windows Server 容器支持。此外,某些功能是专门针对 Linux,而不适用于 Windows。如需查看受支持和不受支持的 Kubernetes 功能的完整列表,请参阅 Kubernetes 文档

除了不受支持的 Kubernetes 功能外,某些 GKE 功能也不受支持。

对于 GKE 集群,Windows Server 节点池不支持以下功能:

只有 GKE v1.23.4-gke.400 版或更高版本支持 Windows 节点池上的本地外部流量政策

您想要与 GKE 集群搭配使用的其他 Google Cloud 产品可能不支持 Windows Server 节点池。如需了解具体限制,请参阅该产品的文档。

问题排查

如需了解有关调试 PodService 的一般指导信息,请参阅 Kubernetes 文档。

Containerd 节点问题

如需了解使用 Containerd 节点映像的已知问题,请参阅已知问题

Windows Pod 无法启动

若 Windows Server 容器与尝试运行该容器的 Windows 节点之间的版本不匹配,则可能会导致 Windows Pod 无法启动。

如果您的 Windows 节点池版本为 1.16.8-gke.8 或更高版本,请查看关于 2020 年 2 月 Windows Server 容器不兼容问题的 Microsoft 文档,并使用基础 Windows 映像(包含 2020 年 3 月之后的 Windows 更新)构建容器映像。基于较早的基础 Windows 映像构建的容器映像可能无法在这些 Windows 节点上运行,并且还可能会导致节点出现状态为 NotReady 的故障。

映像拉取错误

Windows Server 容器映像及其所含的各个层可能非常大。它们的大小可能会导致 Kubelet 在下载和提取容器层时发生超时和失败。

如果您的 Pod 出现“Failed to pull image”或“Image pull context cancelled”错误消息,或者出现 ErrImagePull 状态,则可能是遇到了此问题。

如果拉取映像频繁发生,则应使用具有更高 CPU 规格的节点池。容器提取会跨核心并行执行,因此具有更多核心的机器类型可以缩短总拉取时间。

尝试使用以下选项成功拉取 Windows Server 容器:

  • 将 Windows Server 容器映像的应用层拆分为多个更便于拉取和提取的较小层。这样可以提高 Docker 层缓存的效率,以及映像拉取的重试成功概率。如需详细了解各映像层,请参阅 Docker 文章关于映像、容器和存储驱动程序

  • 在创建 Pod 之前,连接到 Windows Server 节点并在容器映像上手动使用 docker pull 命令。

  • kubelet 服务设置 image-pull-progress-deadline 标志,以增加容器映像的拉取超时时间。

    通过连接到 Windows 节点并运行以下 PowerShell 命令来设置此标志。

    1. 从 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"," "
      
    2. 为 Kubelet 服务设置新的命令行,并添加一个额外标志来增加超时时间。

      PS C:\> reg add ${regkey} /f /v ${name} /t REG_EXPAND_SZ /d "${kubelet_cmd} `
      --image-pull-progress-deadline=40m "
      
    3. 确认更改成功。

      PS C:\> reg query ${regkey} /v ${name}
      
    4. 重启 kubelet 服务,以使新标志生效。

      PS C:\> Restart-Service kubelet
      
    5. 确认 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 映像。 您可以使用 gcloud container get-server-config 命令查找 GKE Windows 节点映像的支持结束日期,如映射 GKE 和 Windows 版本部分中所述。

创建节点池期间超时

如果您要创建大量节点(例如 500 个),并且节点池是集群中使用 Windows Server 映像的第一个节点池,则其创建可能会超时。

如需解决此问题,请减少要创建的节点数。您可以稍后增加节点数。

Windows 节点变为 NotReady,出现错误:“PLEG 运行状况不佳”

这是一个已知的 Kubernetes 问题,在单个 Windows 节点上以非常快的速度启动多个 Pod 时,就会发生此问题。如需从此情况中恢复,请重启 Windows Server 节点。为避免此问题,建议的一种解决方法是将创建 Windows Pod 的速率限制为每 30 秒创建一个 Pod。

不一致的 TerminationGracePeriod

容器的 Windows 系统超时设置可能与您配置的宽限期不同。这种差异可能会导致 Windows 在传递到运行时的宽限期结束之前强制终止容器。

您可以通过在构建映像时修改容器本地注册表项来修改 Windows 超时设置。如果您修改了 Windows 超时设置,则可能还需要调整 TerminationGracePeriodSeconds 以使其匹配。

网络连接问题

如果您在 Windows Server 容器中遇到网络连接问题,可能是因为 Windows Server 容器网络通常假定网络 MTU 为 1500,而该 MTU 与 Google Cloud 的 MTU 1460 不兼容。

请检查容器中网络接口的 MTU 与 Windows Server 节点本身的网络接口的 MTU 是否设置为同一值(即 1460 或更小)。如需了解如何设置 MTU,请参阅 Windows 容器的已知问题

节点启动问题

如果节点未能在集群中启动或无法成功加入集群,请查看节点的串行端口输出中提供的诊断信息。

运行以下命令以查看串行端口输出:

gcloud compute instances get-serial-port-output NODE_NAME --zone=COMPUTE_ZONE

替换以下内容:

  • NODE_NAME:节点的名称。
  • COMPUTE_ZONE:特定节点的计算可用区

在运行 1.24 或更早版本的集群中,Windows 节点间歇性无法访问 Service

在具有大量主机网络服务负载均衡器规则的 Kubernetes 集群中,启动 Windows 节点时,规则的处理会发生延迟。在延迟期间,Service 间歇性无法访问,每条规则约造成 30 秒延迟;如果规则数量足够多,总体延迟会很明显。如需了解详情,请参阅 GitHub 中的原问题

对于运行 1.24 版或更早版本的 GKE 集群,如果有任何 Windows 节点中出现重启了 kube-proxy 的事件(例如节点启动、节点升级、手动重启),该节点上运行的 Pod 访问的任何 Service 都将无法访问,直至相应组件完成所有规则的同步为止。

在运行 1.25 版或更高版本的 GKE 集群中,此行为将得到显著改进。如需详细了解此改进,请参阅 GitHub 中的拉取请求。如果遇到此问题,我们建议您将集群的控制平面升级到 1.25 版或更高版本。

后续步骤