创建使用可用性区域的 Azure Kubernetes 服务 (AKS) 群集

本文介绍如何创建 AKS 群集,以及如何在可用性区域之间分发节点组件。

开始之前

  • 需要安装并配置 Azure CLI 2.0.76 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 阅读AKS 中可用性区域的概述,了解在 AKS 中使用可用性区域的好处和限制。

Azure 资源管理器模板和可用性区域

使用 Azure 资源管理器模板创建具有可用性区域的 AKS 群集时,请记住以下详细信息:

  • 如果在模板中显式定义了null 值(例如,"availabilityZones": null),则资源管理器模板会视属性为不存在。 这意味着你的群集不会部署在可用性区域中。
  • 如果未在模板中包含"availabilityZones":属性,则群集不会部署在可用性区域中。
  • 无法更新现有群集上的可用性区域的设置,在使用 Azure 资源管理器模板更新 AKS 群集时,此行为会有所不同。 如果你在模板中为可用性区域显式设置了 null 值,并更新了你的群集,则不会更新你的群集的可用性区域。 但是,如果使用 "availabilityZones": [] 之类的语法忽略可用性区域属性,则部署会尝试禁用现有 AKS 群集上的可用性区域,但会失败。

跨可用性区域创建 AKS 群集

使用az aks create命令创建群集时,--zones参数指定部署代理节点的可用性区域。 托管控制平面组件部署到的可用性区域不受此参数控制。 在群集部署期间,它们会自动分布在该区域的所有可用性区域(如果存在)中。

以下示例命令演示了如何创建共包含三个节点的资源组和 AKS 群集。 一个代理节点在区域 1 中,一个在 2 中,还有一个在 3 中。

  1. 使用 az group create 命令创建资源组。

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. 使用带有--zones参数的az aks create命令创建 AKS 群集。

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --generate-ssh-keys \
        --vm-set-type VirtualMachineScaleSets \
        --load-balancer-sku standard \
        --node-count 3 \
        --zones 1 2 3
    

    创建 AKS 群集需要几分钟时间。

    确定新节点所属的区域时,指定的 AKS 节点池会使用由基础 Azure 虚拟机规模集提供的最佳区域均衡。 如果每个区域中的 VM 数相同或与规模集的所有其他区域中的 VM 数只相差 +- 1,则认为该 AKS 节点池“已实现均衡”。

验证跨区域的节点分布

群集准备就绪后,请列出规模集中的代理节点所在的可用性区域。

  1. 使用az aks get-credentials命令获取 AKS 群集凭据:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. 使用kubectl describe命令列出群集中的节点,并筛选topology.kubernetes.io/zone值。

    kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone"
    

    以下示例输出显示了在指定地区和可用性区域之间分布的三个节点,如第一个可用性区域的 chinanorth3-1 和第二个可用性区域的 chinanorth3-2:

    Name:       aks-nodepool1-28993262-vmss000000
                 topology.kubernetes.io/zone=chinanorth3-1
    Name:       aks-nodepool1-28993262-vmss000001
                 topology.kubernetes.io/zone=chinanorth3-2
    Name:       aks-nodepool1-28993262-vmss000002
                 topology.kubernetes.io/zone=chinanorth3-3
    

向代理池添加更多节点时,Azure 平台会自动在指定的可用性区域内分发基础 VM。

在 Kubernetes 版本 1.17.0 及更高版本中,AKS 使用标签topology.kubernetes.io/zone和弃用的failure-domain.beta.kubernetes.io/zone。 可以使用以下命令在上一示例中运行kubectl describe nodes命令获得相同的结果:

kubectl get nodes -o custom-columns=NAME:'{.metadata.name}',REGION:'{.metadata.labels.topology\.kubernetes\.io/region}',ZONE:'{metadata.labels.topology\.kubernetes\.io/zone}'

以下示例类似于具有更详细信息的输出:

NAME                                REGION   ZONE
aks-nodepool1-34917322-vmss000000   chinanorth3   chinanorth3-1
aks-nodepool1-34917322-vmss000001   chinanorth3   chinanorth3-2
aks-nodepool1-34917322-vmss000002   chinanorth3   chinanorth3-3

验证跨区域的 pod 分布

已知标签、注释和排斥中所述,Kubernetes 使用 topology.kubernetes.io/zone 标签在可用的不同区域中自动分发复制控制器或服务中的 pod。 在此示例中,你会测试标签并将群集从3 个扩展到5 个节点,以验证 Pod 是否正确分布。

  1. 使用az aks scale命令将 AKS 群集从3 个扩展到5 个节点,并将--node-count设置为5

    az aks scale \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --node-count 5
    
  2. 扩展操作完成后,使用以下kubectl describe命令跨区域验证 Pod 分布:

    kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone"
    

    以下示例输出显示了在指定地区和可用性区域之间分布的五个节点,如第一个可用性区域的eastus2-1和第二个可用性区域的eastus2-2

    Name:       aks-nodepool1-28993262-vmss000000
                 topology.kubernetes.io/zone=chinanorth3-1
    Name:       aks-nodepool1-28993262-vmss000001
                 topology.kubernetes.io/zone=chinanorth3-2
    Name:       aks-nodepool1-28993262-vmss000002
                 topology.kubernetes.io/zone=chinanorth3-3
    Name:       aks-nodepool1-28993262-vmss000003
                 topology.kubernetes.io/zone=chinanorth3-1
    Name:       aks-nodepool1-28993262-vmss000004
                 topology.kubernetes.io/zone=chinanorth3-2
    
  3. 使用以下kubectl create deploymentkubectl scale命令部署具有三个副本的 NGINX 应用程序:

    kubectl create deployment nginx --image=mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
    kubectl scale deployment nginx --replicas=3
    
  4. 使用以下kubectl describe命令跨区域验证 Pod 分布:

    kubectl describe pod | grep -e "^Name:" -e "^Node:"
    

    以下示例输出显示了在指定地区和可用性区域之间分布的三个 Pod,如第一个可用性区域的 chinanorth3-1 和第二个可用性区域的 chinanorth3-2

    Name:         nginx-6db489d4b7-ktdwg
    Node:         aks-nodepool1-28993262-vmss000000/10.240.0.4
    Name:         nginx-6db489d4b7-v7zvj
    Node:         aks-nodepool1-28993262-vmss000002/10.240.0.6
    Name:         nginx-6db489d4b7-xz6wj
    Node:         aks-nodepool1-28993262-vmss000004/10.240.0.8
    

    从前面的输出中可以看到,第一个 pod 在节点 0 上运行,该节点位于可用性区域 chinanorth3-1 中。 第二个 pod 在节点 2 上运行(对应 chinanorth3-3),第三个 pod 在 chinanorth3-2 的节点 4 上运行。 如果没有任何其他配置,Kubernetes 会在所有三个可用性区域中正确分配 pod。

后续步骤

本文介绍了如何使用可用性区域创建 AKS 群集。 有关高可用性群集的更多注意事项,请参阅 AKS 中业务连续性和灾难恢复的最佳做法