使用 PowerShell 在 Azure Kubernetes 服务 (AKS) 群集上部署 Windows Server 容器

Azure Kubernetes 服务 (AKS) 是可用于快速部署和管理群集的托管式 Kubernetes 服务。 在本文中,你将使用 Azure PowerShell 部署运行 Windows Server 容器的 AKS 群集。 还可将 Windows Server 容器中的 ASP.NET 示例应用程序部署到群集。

注意

为了开始快速预配 AKS 群集,本文介绍了仅针对评估目的部署具有默认设置的群集的步骤。 在部署生产就绪群集之前,建议熟悉我们的[基线参考体系结构][baseline-reference-architecture],考虑它如何与你的业务需求保持一致。

开始之前

本快速入门假设读者基本了解 Kubernetes 的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念

创建资源组

Azure 资源组是用于部署和管理 Azure 资源的逻辑组。 创建资源组时,系统会要求你指定一个位置。 此位置是资源组元数据的存储位置,如果你在创建资源期间未指定另一个区域,则它是资源在 Azure 中的运行位置。

若要创建资源组,请使用 New-AzResourceGroup cmdlet。 以下示例在“eastus”区域创建名为“myResourceGroup”的资源组 。

New-AzResourceGroup -Name myResourceGroup -Location chinaeast2

以下示例输出显示已成功创建资源组:

ResourceGroupName : myResourceGroup
Location          : chinaeast2
ProvisioningState : Succeeded
Tags              :
ResourceId        : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup

创建 AKS 群集

在本部分中,我们将使用以下配置创建 AKS 群集:

  • 群集配置有两个节点,以确保其可靠运行。 节点是运行 Kubernetes 节点组件和容器运行时的 Azure 虚拟机 (VM)。
  • -WindowsProfileAdminUserName-WindowsProfileAdminUserPassword 参数为群集上的任何 Windows Server 节点设置管理员凭据,并且必须满足 Windows Server 密码复杂性要求
  • 节点池使用 VirtualMachineScaleSets

若要使用 Azure PowerShell 创建 AKS 群集,请执行以下步骤:

  1. 使用以下命令为 Windows Server 容器创建管理员凭据。 此命令提示输入 WindowsProfileAdminUserNameWindowsProfileAdminUserPassword。 密码必须至少为 14 个字符,并且满足 Windows Server 密码复杂性要求

    $AdminCreds = Get-Credential `
        -Message 'Please create the administrator credentials for your Windows Server containers'
    
  2. 使用 New-AzAksCluster cmdlet 创建群集,并指定 WindowsProfileAdminUserNameWindowsProfileAdminUserPassword 参数。

    New-AzAksCluster -ResourceGroupName myResourceGroup `
        -Name myAKSCluster `
        -NodeCount 2 `
        -NetworkPlugin azure `
        -NodeVmSetType VirtualMachineScaleSets `
        -WindowsProfileAdminUserName $AdminCreds.UserName `
        -WindowsProfileAdminUserPassword $secureString `
        -GenerateSshKey
    

    片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。 有时,群集预配的时间可能超过几分钟。 最多允许 10 分钟进行预配。

    如果收到密码验证错误,并且设置的密码满足长度和复杂性要求,请尝试在另一个区域中创建资源组。 然后尝试创建包含新资源组的群集。

    如果在创建节点池时未指定管理员用户名和密码,则用户名将设置为“azureuser”,密码将设置为随机值。 有关详细信息,请参阅 Windows Server 常见问题解答

    无法更改管理员用户名,但可以使用 az aks update 更改 AKS 群集用于 Windows Server 节点的管理员密码。 有关详细信息,请参阅 Windows Server 常见问题解答

    若要运行支持 Windows Server 容器的节点池的 AKS 群集,群集需要采用使用 [Azure CNI(高级)][azure-cni] 网络插件的网络策略。 -NetworkPlugin azure 参数指定 Azure CNI。

添加节点池

默认情况下,将使用可运行 Linux 容器的节点池创建 AKS 群集。 必须添加另一个节点池,该节点池可与 Linux 节点池一起运行 Windows Server 容器。

Windows Server 2022 是 Kubernetes 版本 1.25.0 及更高版本的默认操作系统。 Windows Server 2019 是早期版本的默认操作系统。 如果未指定特定的 OS SKU,Azure 将使用群集使用的 Kubernetes 版本的默认 SKU 创建新的节点池。

若要使用默认 OS SKU,请在不指定 OS SKU 的情况下创建节点池。 节点池是根据群集的 Kubernetes 版本为默认操作系统配置的。

使用 New-AzAksNodePool cmdlet 添加 Windows Server 节点池。 以下命令将创建名为“npwin”的新节点池,并将其添加到 myAKSCluster。 该命令还使用运行 New-AzAksCluster 时创建的默认虚拟网络中的默认子网:

New-AzAksNodePool -ResourceGroupName myResourceGroup `
    -ClusterName myAKSCluster `
    -VmSetType VirtualMachineScaleSets `
    -OsType Windows `
    -Name npwin

连接到群集

使用 Kubernetes 命令行客户端 kubectl 来管理 Kubernetes 群集。 若要在本地安装 kubectl,可以使用 Install-AzAzAksCliTool cmdlet。

  1. 使用 Import-AzAksCredential cmdlet 将 kubectl 配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。

    Import-AzAksCredential -ResourceGroupName myResourceGroup -Name myAKSCluster
    
  2. 使用 kubectl get 命令验证与群集的连接,这将返回群集节点的列表。

    kubectl get nodes
    

    以下示例输出显示了群集中的所有节点。 请确保所有节点的状态为“就绪”:

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-nodepool1-20786768-vmss000000   Ready    agent   22h   v1.27.7
    aks-nodepool1-20786768-vmss000001   Ready    agent   22h   v1.27.7
    aksnpwin000000                      Ready    agent   21h   v1.27.7
    

部署应用程序

Kubernetes 清单文件定义群集的所需状态,例如,要运行哪些容器映像。 在本文中,你使用清单创建在 Windows Server 容器中运行 ASP.NET 示例应用程序所需的所有对象。 此清单包括用于 ASP.NET 示例应用程序的 Kubernetes 部署,以及用于从 Internet 访问应用程序的外部 Kubernetes 服务

ASP.NET 示例应用程序作为 .NET Framework 示例的一部分提供并在 Windows Server 容器中运行。 AKS 要求 Windows Server 容器基于 Windows Server 2019 或更高版本的映像。 Kubernetes 清单文件还必须定义节点选择器,以指示 AKS 群集在可运行 Windows Server 容器的节点上运行 ASP.NET 示例应用程序的 Pod。

  1. 创建名为 sample.yaml 的文件,并将其复制到以下 YAML 定义中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample
      labels:
        app: sample
    spec:
      replicas: 1
      template:
        metadata:
          name: sample
          labels:
            app: sample
        spec:
          nodeSelector:
            "kubernetes.io/os": windows
          containers:
          - name: sample
            image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp
            resources:
              limits:
                cpu: 1
                memory: 800M
            ports:
              - containerPort: 80
      selector:
        matchLabels:
          app: sample
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sample
    spec:
      type: LoadBalancer
      ports:
      - protocol: TCP
        port: 80
      selector:
        app: sample
    

    有关 YAML 清单文件的明细,请参阅部署和 YAML 清单

  2. 使用 kubectl apply 命令部署应用程序,并指定 YAML 清单的名称。

    kubectl apply -f sample.yaml
    

    以下示例输出显示已成功创建部署和服务:

    deployment.apps/sample created
    service/sample created
    

测试应用程序

应用程序运行时,Kubernetes 服务将向 Internet 公开应用程序前端。 此过程可能需要几分钟才能完成。 有时,服务预配的时间可能超过几分钟。 最多允许 10 分钟进行预配。

  1. 使用 kubectl get pods 命令查看已部署的 Pod 的状态。 在继续操作之前,将所有 Pod 都设置为 Running

    kubectl get pods
    
  2. 使用带有 --watch 参数的 kubectl get service 命令来监视进度。

    kubectl get service sample --watch
    

    最初,输出将示例服务的 EXTERNAL-IP 显示为“挂起”:

    NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    sample             LoadBalancer   10.0.37.27   <pending>     80:30572/TCP   6s
    

    EXTERNAL-IP 地址从 pending 更改为实际公共 IP 地址时,请使用 CTRL-C 停止 kubectl 监视进程。 以下示例输出显示向服务分配的有效公共 IP 地址:

    sample  LoadBalancer   10.0.37.27   52.179.23.131   80:30572/TCP   2m
    
  3. 查看示例应用的实际效果,方法是打开 Web 浏览器并转到服务的外部 IP 地址。

    屏幕截图显示如何浏览到 ASP.NET 示例应用程序。

删除资源

如果不打算学习 AKS 教程,则删除群集以避免产生 Azure 费用。 调用 Remove-AzResourceGroup cmdlet 删除资源组、容器服务及所有相关资源。

Remove-AzResourceGroup -Name myResourceGroup

注意

AKS 群集是使用系统分配的托管标识(本快速入门中使用的默认标识选项)创建的。 Azure 平台会管理此标识,因此不需要删除它。

后续步骤

在本快速入门中,你部署了 Kubernetes 群集,然后在该群集的 Windows Server 容器中部署了一个 ASP.NET 示例应用程序。 此示例应用程序仅用于演示目的,并未展示出适用于 Kubernetes 应用程序的所有最佳做法。

若要详细了解 AKS 并演练一个从编码到部署的完整示例,请继续阅读 Kubernetes 群集教程。