您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

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

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

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

支持哪些 Windows 操作系统?

AKS 使用 Windows Server 2019 作为主机 OS 版本,并且仅支持进程隔离。 不支持使用其他 Windows Server 版本生成的容器映像。 有关详细信息,请参阅 Windows 容器版本兼容性

Kubernetes 在 Windows 和 Linux 上是否有所不同?

Windows Server 对节点池的支持具有一些限制,Kubernetes 项目中的上游 Windows Server 也具有这些限制。 这些限制并不特定于 AKS。 有关 Kubernetes 中的 Windows Server 上游支持的详细信息,请参阅 Kubernetes 项目的 Kubernetes 中的 Windows 支持简介文档的支持的功能和限制部分。

Kubernetes 历来以 Linux 为中心。 上游 Kubernetes.io 网站中使用的许多示例旨在用于 Linux 节点。 创建使用 Windows Server 容器的部署时,OS 级别的以下注意事项适用:

  • 标识:Linux 通过整数用户标识符 (UID) 标识用户。 用户还具有用于登录的字母数字用户名,Linux 会将其转换为用户的 UID。 同样,Linux 通过整数组标识符 (GID) 标识用户组,并将组名转换为其相应的 GID。 Windows Server 使用更大的二进制安全标识符 (SID),该标识符存储在 Windows Security Access Manager (SAM) 数据库中。 此数据库不在主机与容器之间或容器之间共享。
  • 文件权限:Windows Server 使用基于 SID 的访问控制列表,而不是权限和 UID + GID 的位掩码。
  • 文件路径:Windows Server 上的约定是使用 \,而不是 /。 在装载卷的 Pod 规范中,为 Windows Server 容器正确指定路径。 例如,不要在 Linux 容器中指定装入点 /mnt/volume,而是将要装载的驱动器号和位置(例如 /K/Volume)指定为 K: 驱动器。

Windows 支持哪种磁盘?

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

是否可以在 AKS 中运行仅限 Windows 的群集?

AKS 群集中的主节点(控制平面)由 AKS 服务托管。 托管主组件的节点的操作系统是不公开的。 所有的 AKS 群集在创建时都带有默认的第一个节点池(基于 Linux)。 此节点池包含系统服务,群集需要这些服务才能正常工作。 建议在第一个节点池中至少运行两个节点,以确保群集的可靠性和执行群集操作的能力。 除非删除 AKS 群集本身,否则无法删除第一个基于 Linux 的节点池。

如何修补 Windows 节点?

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

备注

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

支持哪些网络插件?

具有 Windows 节点池的 AKS 群集必须使用 Azure 容器网络接口 (Azure CNI)(高级)网络模型。 不支持 Kubenet(基本)网络。 有关网络模型差异的详细信息,请参阅适用于 AKS 中的应用程序的网络概念。 Azure CNI 网络模型需要对 IP 地址管理进行其他规划和考量。 有关如何规划和实现 Azure CNI 的详细信息,请参阅在 AKS 中配置 Azure CNI 网络

启用 Calico 时,AKS 群集上的 Windows 节点还默认启用直接服务器返回 (DSR)

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

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

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

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

尝试创建新的 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 节点池的服务主体?

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 节点池命名?

名称最多可包含六个字符。 这是 AKS 的当前限制。

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

Windows 节点目前不支持 Kubenet。

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

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

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

AKS 中目前不支持托管组的服务帐户 (gMSA)。

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

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

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

具有 Windows 节点的群集可以有大约 500 个服务,超过它就会导致端口耗尽。

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

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

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

若要在新的 AKS 群集上使用 Azure 混合权益,请使用 --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 混合权益,请使用 --enable-ahub 参数更新群集。

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

若要检查是否在群集上设置了 Azure 混合权益,请使用以下命令:

az vmss show --name myAKSCluster --resource-group MC_CLUSTERNAME

如果群集启用了 Azure 混合权益,则 az vmss show 的输出将如下所示:

"platformFaultDomainCount": 1,
  "provisioningState": "Succeeded",
  "proximityPlacementGroup": null,
  "resourceGroup": "MC_CLUSTERNAME"

是否可以将 Kubernetes Web 仪表板用于 Windows 容器?

是的,可以使用 Kubernetes Web 仪表板访问有关 Windows 容器的信息。 但现在无法直接从 Kubernetes Web 仪表板对正在运行的 Windows 容器运行 kubectl exec。 若要详细了解如何连接到正在运行的 Windows 容器,请参阅使用 RDP 连接到 Azure Kubernetes 服务 (AKS) 群集 Windows Server 节点以进行维护或故障排除

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

若要更改正在运行的 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-engine 项目提供了在 Azure 中运行 Kubernetes 的完全可自定义的简便方法,其中包括 Windows 支持。 有关详细信息,请参阅 AKS 路线图

后续步骤

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