AKS 中 Windows Server 节点池的常见问题

在 Azure Kubernetes 服务 (AKS) 中,可以创建在节点上将 Windows Server 作为来宾 OS 运行的节点池。 这些节点可以运行本机 Windows 容器应用程序,例如基于 .NET Framework 生成的应用程序。 Linux 和 Windows 操作系统提供容器支持的方式存在差异。 有些常见的 Linux Kubernetes 和 Pod 相关的功能目前无法用于 Windows 节点池。

本文概述了 AKS 中 Windows Server 节点的一些常见问题和操作系统概念。

Windows 支持哪种磁盘?

Azure 磁盘和 Azure 文件存储是受支持的卷类型,并且在 Windows Server 容器中作为 NTFS 卷进行访问。

Linux 和 Windows 是否支持第 2 代虚拟机 (VM)?

只有 Linux 和 Windows 上的 WS2022 支持 Windows 上的第 2 代 VM。 有关详细信息,请参阅对 Azure 上的第 2 代 VM 的支持

如何修补 Windows 节点?

若要获取用于 Windows 节点的最新补丁,可以升级节点池升级节点映像。 AKS 中的节点上未启用 Windows 更新。 一有补丁可用,AKS 就会发布新节点池映像,用户自己负责升级节点池来保持使用最新的补丁和修补程序。 此修补过程也适用于所使用的 Kubernetes 版本。 AKS 发行说明将指示何时有新版本可用。 有关升级 Windows Server 节点池的详细信息,请参阅升级 AKS 中的节点池。 如果只需要更新节点映像,请参阅 AKS 节点映像升级

注意

只有在升级节点池之前已经执行了群集升级(控制平面升级)的情况下,才会使用更新的 Windows Server 映像。

是否支持保留客户端源 IP?

目前,Windows 节点不支持客户端源 IP 保留

是否可以更改每个节点的最大 Pod 数量?

是。 有关更改的影响和可用的选项,请参阅最大 Pod 数

Windows OS 中的默认 TCP 超时是多长?

Windows OS 中的默认 TCP 超时为 4 分钟。 此值不可配置。 当应用程序使用较长的超时时,同一节点中不同容器之间的 TCP 连接将在四分钟后关闭。

尝试创建新的 Windows 代理池时,为什么会发生错误?

如果群集是在 2020 年 2 月之前创建的,且从未执行过任何群集升级操作,该群集仍将使用旧的 Windows 映像。 你可能会看到类似于以下内容的错误:

“找不到从部署模板中引用的下列映像:发布者:MicrosoftWindowsServer,产品/服务:WindowsServer, Sku:2019-datacenter-core-smalldisk-2004,版本:最新版本。 有关查找可用映像的说明,请参阅通过 Azure PowerShell 查找和使用 Azure 市场 VM 映像。”

修复此错误的方法:

  1. 升级群集控制平面以更新映像产品/服务和发布者。
  2. 创建新的 Windows 代理池。
  3. 将 Windows Pod 从现有 Windows 代理池移动到新的 Windows 代理池。
  4. 删除旧的 Windows 代理池。

尝试部署 Windows Pod 时,为什么会发生错误?

如果在 --max-pods 中指定的值小于要创建的 Pod 数量,可能会发生 No available addresses 错误。

若要修复此错误,请使用具有足够高的 --max-pods 值的 az aks nodepool add 命令:

az aks nodepool add \
    --cluster-name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --name $NODEPOOL_NAME \
    --max-pods 3

有关更多详细信息,请参阅--max-pods文档

为什么我的 VM 节点上有一个名为“sshd”的意外用户?

AKS 在安装 OpenSSH 服务时添加了一个名为“sshd”的用户。 此用户不是恶意用户。 建议客户更新其警报,忽略此意外的用户帐户。

如何轮换 Windows 节点池的服务主体?

Windows 节点池不支持服务主体轮换。 若要更新服务主体,请创建新的 Windows 节点池,并将 Pod 从旧池迁移到新池。 将 Pod 迁移到新池之后,删除旧节点池。

请使用托管标识而非服务主体,托管标识本质上是服务主体的包装器。 有关详细信息,请参阅在 Azure Kubernetes 服务中使用托管标识

如何为群集上的 Windows Server 节点更改管理员密码?

在创建 AKS 群集时,请指定 --windows-admin-password--windows-admin-username 参数,以便为群集上的任何 Windows Server 节点设置管理员凭据。 如果在使用 Azure 门户创建群集时或在使用 Azure CLI 设置 --vm-set-type VirtualMachineScaleSets--network-plugin azure 时未指定管理员凭据,则用户名会默认设置为 azureuser,并会使用一个随机密码。

若要更改管理员密码,请使用 az aks update 命令:

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --windows-admin-password $NEW_PW

重要

执行 az aks update 操作仅升级 Windows Server 节点池,将导致重启。 Linux 节点池不受影响。

在更改 --windows-admin-password 时,新密码必须至少为 14 个字符,并且必须符合 Windows Server 密码要求

我可以创建多少个节点池?

AKS 群集最多可以包含 100 个节点池。 这些节点池中最多可以有 1000 个节点。 有关详细信息,请参阅节点池限制

我可以如何为 Windows 节点池命名?

Windows 节点池可以具有六个字符的名称。

Windows 节点是否支持所有功能?

Windows 节点目前不支持 Kubenet。

我是否可以在 Windows 节点上运行入口控制器?

是,支持 Windows Server 容器的入口控制器可以在 AKS 中的 Windows 节点上运行。

我的 Windows Server 容器是否可以使用 gMSA?

组托管服务帐户 (gMSA) 支持已正式适用于 AKS 上的 Windows。 请参阅为 Azure Kubernetes 服务 (AKS) 群集上的 Windows Server 节点启用组托管服务帐户 (GMSA)

是否可以将 Azure Monitor 用于包含 Windows 节点和容器的容器?

可以。 但 Azure Monitor 现为公共预览版,用于从 Windows 容器收集日志(stdout、stderr)和指标。 你仍可从 Windows 容器附加到 stdout 日志的实时传送流。

在具有 Windows 节点的群集上,服务的数量是否有限制?

具有 Windows 节点的群集可以有大约 500 个服务(有时会更少),超过此值就会导致端口耗尽。 此限制适用于外部流量策略设置为“集群”的 Kubernetes 服务。

当服务上的外部流量策略配置为集群时,流量会在节点上经历额外的源 NAT,这也会导致从 TCPIP 动态端口池中保留端口。 此端口池是一个有限的资源(默认情况下约为 16K 端口),与服务的许多活动连接可能会导致动态端口池耗尽,从而导致连接丢失。

如果在配置 Kubernetes 服务时将“外部流量策略”设置为“本地”,则 500 个服务不太可能出现端口耗尽问题。

我是否可以将 Azure 混合权益用于 Windows 节点?

是的。 适用于 Windows Server 的 Azure 混合权益可让你将本地 Windows Server 许可证用于 AKS Windows 节点,从而降低运营成本。

可以在整个 AKS 群集或单个节点上使用 Azure 混合权益。 对于单个节点,需要浏览到节点资源组,并直接向节点应用 Azure 混合权益。 有关将 Azure 混合权益应用到单个节点的详细信息,请参阅适用于 Windows Server 的 Azure 混合权益

若要在新的 AKS 群集上使用 Azure 混合权益,请运行 az aks create 命令并使用 --enable-ahub 参数。

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --load-balancer-sku Standard \
    --windows-admin-password 'Password1234$' \
    --windows-admin-username azure \
    --network-plugin azure
    --enable-ahub

若要在现有 AKS 群集上使用 Azure 混合权益,请运行 az aks update 命令并使用 --enable-ahub 参数来更新群集。

az aks update \
    --resource-group myResourceGroup
    --name myAKSCluster
    --enable-ahub

若要检查群集中的 Windows 节点上是否设置了 Azure 混合权益,请运行 az vmss show 命令并使用 --name--resource-group 参数来查询虚拟机规模集。 若要识别在其中创建 Windows 节点池的规模集的资源组,可以运行 az vmss list -o table 命令。

az vmss show --name myScaleSet --resource-group MC_<resourceGroup>_<clusterName>_<region>

如果规模集中的 Windows 节点已启用 Azure 混合权益,则 az vmss show 的输出将类似于以下内容:

""hardwareProfile": null,
    "licenseType": "Windows_Server",
    "networkProfile": {
      "healthProbe": null,
      "networkApiVersion": null,

如何更改正在运行的容器的时区?

若要更改正在运行的 Windows Server 容器的时区,请通过 PowerShell 会话连接到正在运行的容器。 例如:

kubectl exec -it CONTAINER-NAME -- powershell

在正在运行的容器中,使用 Set-TimeZone 来设置正在运行的容器的时区。 例如:

Set-TimeZone -Id "Russian Standard Time"

若要查看正在运行的容器的当前时区或可用时区列表,请使用 Get-TimeZone

能否使用 Windows 容器保持从客户端连接到 Pod 的会话亲和性?

虽然 Windows Server 2022 OS 版本将支持使用 Windows 容器保持从客户端连接到 Pod 的会话亲和性,但当前通过客户端 IP 实现会话亲和性的方法是通过将所需的 Pod 限制为每个节点运行一个实例并将 Kubernetes 服务配置为将流量定向到本地节点上的 Pod。

使用以下配置:

  1. 使用运行最低版本 1.20 的 AKS 群集。
  2. 将 Pod 限制为每个 Windows 节点只允许一个实例。 可以通过在部署配置中使用反关联来实现这一点。
  3. 在 Kubernetes 服务配置中,设置 externalTrafficPolicy=Local。 这可以确保 Kubernetes 服务仅将流量定向到本地节点内的 Pod。
  4. 在 Kubernetes 服务配置中,设置“sessionAffinity: ClientIP”。 这可以确保 Azure 负载均衡器配置会话亲和性。

后续步骤

若要开始在 AKS 中使用 Windows Server 容器,请参阅创建在 AKS 中运行 Windows Server 的节点池