升级 OS 版本以满足 Azure Kubernetes 服务 (AKS) 上的 Windows 工作负荷

在 Azure Kubernetes 服务 (AKS) 上升级正在运行的 Windows 工作负载的 OS 版本时,需要部署新的节点池以确保每个节点池上的 Windows 版本匹配。 本文介绍在 AKS 上升级 Windows 工作负载 OS 版本的步骤。 此示例侧重展示从 Windows Server 2019 升级到 Windows Server 2022,但从任意 Windows Server 版本升级到另一个版本都可以遵守此过程。

Windows Server OS 版本支持

发布新版本的 Windows Server 操作系统时,AKS 需要支持新版本,并建议升级到最新版本,以落实修补程序、改进和新功能。 从 Windows Server 2022 开始,AKS 对每个 Windows Server 版本提供五年的支持。 在此期间,AKS 将发布支持最新版本 Windows Server OS 的升级版。

注意

  • Kubernetes 版本 1.32 达到生命周期终点 (EOL) 后,Windows Server 2019 将停用。 有关详细信息,请参阅 AKS 发行说明
  • 在 Kubernetes 版本 1.34 达到生命周期终点 (EOL) 后,Windows Server 2022 将停用。 有关详细信息,请参阅 AKS 发行说明

限制

Windows Server 2019 和 Windows Server 2022 无法在 AKS 上的同一节点池中共存。 需要创建一个新的节点池来托管新的 OS 版本。 请务必将上一个节点池的权限和访问权限与新节点池相匹配。

开始之前

  • 将 Dockerfile 中的 FROM 语句更新为新的 OS 版本。
  • 检查应用程序并验证容器应用是否可以在新 OS 版本上运行。
  • 将 AKS 上的已验证容器应用部署到开发或测试环境。
  • 记下本文中使用的新映像名称或标签。

注意

若要了解如何为 Windows 工作负荷生成 Dockerfile,请参阅 Windows 上的 Dockerfile优化 Windows Dockerfile

将 Windows Server 2022 节点池添加到现有群集

更新 YAML 文件

节点选择器是在 Windows 节点上放置 Windows Pod 的最常见和推荐的选项。

  1. 通过添加以下注释将节点选择器添加到 YAML 文件:

          nodeSelector:
            "kubernetes.io/os": windows
    

    该注释会查找任何可用的 Windows 节点并将 pod 放置在该节点上(遵循所有其他调度规则)。 从 Windows Server 2019 升级到 Windows Server 2022 时,需要强制在 Windows 节点和运行最新 OS 版本的节点上进行放置。 为此,一个选项是使用不同的注释:

          nodeSelector:
            "kubernetes.azure.com/os-sku": Windows2022
    
  2. 更新 YAML 文件中的 nodeSelector 后,还需要更新要使用的容器映像。 可以从上一步(通过更改 Dockerfile 上的 FROM 语句创建新版容器化应用程序)获取此信息。

注意

应该使用最初部署应用程序时使用的 YAML 文件。 这可以确保除了 nodeSelector 和容器镜像之外,没有其他配置发生变化。

将更新后的 YAML 文件应用到现有工作负载

  1. 使用 kubectl get nodes 命令查看群集上的节点。

    kubectl get nodes -o wide
    

    以下示例输出显示群集上的所有节点,包括新创建的节点池和现有节点池:

    NAME                                STATUS   ROLES   AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION     CONTAINER-RUNTIME
    aks-agentpool-18877473-vmss000000   Ready    agent   5h40m   v1.23.8   10.240.0.4     <none>        Ubuntu 18.04.6 LTS               5.4.0-1085-azure   containerd://1.5.11+azure-2
    akspoolws000000                     Ready    agent   3h15m   v1.23.8   10.240.0.208   <none>        Windows Server 2022 Datacenter   10.0.20348.825     containerd://1.6.6+azure
    akspoolws000001                     Ready    agent   3h17m   v1.23.8   10.240.0.239   <none>        Windows Server 2022 Datacenter   10.0.20348.825     containerd://1.6.6+azure
    akspoolws000002                     Ready    agent   3h17m   v1.23.8   10.240.1.14    <none>        Windows Server 2022 Datacenter   10.0.20348.825     containerd://1.6.6+azure
    akswspool000000                     Ready    agent   5h37m   v1.23.8   10.240.0.115   <none>        Windows Server 2019 Datacenter   10.0.17763.3165    containerd://1.6.6+azure
    akswspool000001                     Ready    agent   5h37m   v1.23.8   10.240.0.146   <none>        Windows Server 2019 Datacenter   10.0.17763.3165    containerd://1.6.6+azure
    akswspool000002                     Ready    agent   5h37m   v1.23.8   10.240.0.177   <none>        Windows Server 2019 Datacenter   10.0.17763.3165    containerd://1.6.6+azure
    
  2. 使用 kubectl apply 命令将更新后的 YAML 文件应用到现有工作负载,并指定 YAML 文件的名称。

    kubectl apply -f <filename>
    

    以下示例输出显示部署的“已配置”状态:

    deployment.apps/sample configured
    service/sample unchanged
    

    此时,AKS 将开始终止现有 Pod 并将新 Pod 部署到 Windows Server 2022 节点。

  3. 使用 kubectl get pods 命令检查部署的状态。

    kubectl get pods -o wide
    

    以下示例输出显示了默认 default 命名空间中的 Pod:

    NAME                      READY   STATUS    RESTARTS   AGE     IP             NODE              NOMINATED NODE   READINESS GATES
    sample-7794bfcc4c-k62cq   1/1     Running   0          2m49s   10.240.0.238   akspoolws000000   <none>           <none>
    sample-7794bfcc4c-rswq9   1/1     Running   0          2m49s   10.240.1.10    akspoolws000001   <none>           <none>
    sample-7794bfcc4c-sh78c   1/1     Running   0          2m49s   10.240.0.228   akspoolws000000   <none>           <none>
    

安全和身份验证注意事项

如果使用组托管服务帐户 (gMSA),需要更新新节点池的托管标识配置。 gMSA 使用机密(用户帐户和密码),因此运行 Windows Pod 的节点可以针对 Microsoft Entra ID 对容器进行身份验证。 为在 Azure Key Vault 上访问该机密,节点使用允许节点访问资源的托管标识。 由于托管标识按节点池配置,并且 Pod 现在驻留在新节点池中,因此需要更新该配置。 有关详细信息,请参阅为 Azure Kubernetes 服务 (AKS) 群集上的 Windows Server 节点启用组托管服务帐户 (GMSA)

访问其他 Azure 资源时,同一原则适用于任何其他 Pod 或节点池的托管标识。 需要更新托管标识提供的任何访问权限以反映新的节点池。 若要查看更新和登录活动,请参阅如何查看托管标识活动

后续步骤

在本文中,你了解了如何升级 AKS 上的 Windows 工作负荷的 OS 版本。 若要了解有关 AKS 上的 Windows 工作负载的更多信息,请参阅在 Azure Kubernetes 服务 (AKS) 上部署 Windows 容器应用程序