创建 Azure Kubernetes 服务 (AKS) 群集并将其配置为使用 Azure 门户中的虚拟节点

Azure 容器实例 (ACI) 和 Azure Kubernetes 服务 (AKS) 群集中运行的 Pod 之间的网络通信借助虚拟节点来实现。 若要提供此通信,应创建虚拟网络子网并分配委派的权限。 虚拟节点仅适用于使用高级网络 (Azure CNI) 创建的 AKS 群集。 默认情况下,AKS 群集是使用基本网络 (kubenet) 创建的。

本文介绍如何创建虚拟网络和子网,然后通过 Azure 门户部署使用高级网络的 AKS 群集。

注意

有关虚拟节点区域可用性和限制的概述,请参阅在 AKS 中使用虚拟节点

准备阶段

需要在订阅中注册 ACI 服务提供程序。

  • 使用 az provider list 命令检查 ACI 提供程序注册的状态。

    az provider list --query "[?contains(namespace,'Microsoft.ContainerInstance')]" -o table
    

    以下示例输出显示 Microsoft.ContainerInstance 提供程序为 Registered

    Namespace                    RegistrationState    RegistrationPolicy
    ---------------------------  -------------------  --------------------
    Microsoft.ContainerInstance  Registered           RegistrationRequired
    
  • 如果提供程序为 NotRegistered,请使用 az provider register 命令注册它。

    az provider register --namespace Microsoft.ContainerInstance
    

创建 AKS 群集

  1. 导航到 Azure 门户主页。
  2. 选择“创建资源”>“容器”。
  3. Azure Kubernetes 服务 (AKS) 资源上,选择“创建”。
  4. 在“基本信息”页面上,配置以下选项
    • 项目详细信息:选择 Azure 订阅,然后选择或创建一个 Azure 资源组,例如 myResourceGroup
    • 群集详细信息:输入 Kubernetes 群集名称,例如 myAKSCluster。 选择 AKS 群集的区域和 Kubernetes 版本。
  5. 选择“下一步:节点池”,检查 *启用虚拟节点Screenshot that shows creating a cluster with virtual nodes enabled on the Azure portal. The option 'Enable virtual nodes' is highlighted.
  6. 选择“查看 + 创建”。
  7. 验证完成后,选择“创建”。

默认情况下,此过程会创建一个托管群集标识,用于群集通信以及与其他 Azure 服务的集成。 有关详细信息,请参阅使用托管标识。 还可以使用服务主体作为群集标识。

此过程将群集配置为使用高级网络,使虚拟节点使用其自己的 Azure 虚拟网络子网。 子网具有委托的权限,可连接 AKS 群集之间的 Azure 资源。 如果还没有委托的子网,Azure 门户将创建并配置一个 Azure 虚拟网络和子网,与虚拟节点配合。

连接到群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl

  1. 使用 az aks get-credentials 命令将 kubectl 配置为连接到你的 Kubernetes 群集。 以下示例获取名为 myResourceGroup 的资源组中群集名称 myAKSCluster 的凭据:

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. 使用 kubectl get nodes 验证与群集之间的连接。

    kubectl get nodes
    

    以下示例输出显示了创建的单个 VM 节点以及名为 virtual-node-aci-linux 的虚拟 Linux 节点:

    NAME                           STATUS    ROLES     AGE       VERSION
    virtual-node-aci-linux         Ready     agent     28m       v1.11.2
    aks-agentpool-14693408-0       Ready     agent     32m       v1.11.2
    

部署示例应用

  1. 在 Azure 本地 Shell 中,创建一个名为 virtual-node.yaml 的文件并复制到以下 YAML 中:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aci-helloworld
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aci-helloworld
      template:
        metadata:
          labels:
            app: aci-helloworld
        spec:
          containers:
          - name: aci-helloworld
            image: mcr.azk8s.cn/azuredocs/aci-helloworld
            ports:
            - containerPort: 80
          nodeSelector:
            kubernetes.io/role: agent
            beta.kubernetes.io/os: linux
            type: virtual-kubelet
          tolerations:
          - key: virtual-kubelet.io/provider
            operator: Exists
    

    YAML 定义 nodeSelectortoleration,允许在虚拟节点上计划 Pod。 系统从被委派用于虚拟节点的 Azure 虚拟网络子网中为该 Pod 分配了一个内部 IP 地址。

  2. 使用 kubectl apply 命令运行应用程序。

    kubectl apply -f virtual-node.yaml
    
  3. 使用 kubectl get pods 命令和 -o wide 参数查看节点上计划的 Pod。

    kubectl get pods -o wide
    

    以下示例输出显示了在 virtual-node-linux 节点上计划的 virtual-node-helloworld Pod。

    NAME                                     READY     STATUS    RESTARTS   AGE       IP           NODE
    virtual-node-helloworld-9b55975f-bnmfl   1/1       Running   0          4m        10.241.0.4   virtual-node-aci-linux
    

注意

如果使用存储在 Azure 容器注册表中的映像,请配置并使用 Kubernetes 机密。 虚拟节点的限制是无法使用集成的 Microsoft Entra 服务主体身份验证。 如果不使用机密,则在虚拟节点上计划的 Pod 将无法启动并报告错误 HTTP response status code 400 error code "InaccessibleImage"

测试虚拟节点 Pod

若要测试虚拟节点上运行的 Pod,请使用 Web 客户端浏览到演示应用程序。 由于为该 Pod 分配了一个内部 IP 地址,你可以从 AKS 群集上的另一个 Pod 便捷地测试连接性。

  1. 使用以下 kubectl run 命令创建测试 Pod 并向其附加终端会话。

    kubectl run -it --rm virtual-node-test --image=mcr.azk8s.cn/dotnet/runtime-deps:6.0
    
  2. 使用以下 apt-get 命令在 Pod 中安装 curl

    apt-get update && apt-get install -y curl
    
  3. 使用以下 curl 命令访问 Pod 的地址,并提供你的内部 IP 地址。

    curl -L http://10.241.0.4
    

    下面的精简示例输出显示了演示应用程序。

    <html>
    <head>
      <title>Welcome to Azure Container Instances!</title>
    </head>
    [...]
    
  4. 使用 exit 关闭与测试 Pod 的终端会话,这也会删除该 Pod。

    exit
    

后续步骤

在本文中,你在虚拟节点上计划了一个 Pod,并为其分配了一个专用的内部 IP 地址。 如果你想的话,也可以改为创建服务部署,并通过负载均衡器或入口控制器将流量路由到 Pod。 有关详细信息,请参阅在 AKS 中创建基本入口控制器

虚拟节点是 AKS 中缩放解决方案的一个组件。 有关缩放解决方案的详细信息,请参阅以下文章: