创建使用可用性区域的 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 中。
使用
az group create
命令创建资源组。az group create --name $RESOURCE_GROUP --location $LOCATION
使用带有
--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 节点池“已实现均衡”。
验证跨区域的节点分布
群集准备就绪后,请列出规模集中的代理节点所在的可用性区域。
使用
az aks get-credentials
命令获取 AKS 群集凭据:az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
使用
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 是否正确分布。
使用
az aks scale
命令将 AKS 群集从3 个扩展到5 个节点,并将--node-count
设置为5
。az aks scale \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --node-count 5
扩展操作完成后,使用以下
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
使用以下
kubectl create deployment
和kubectl scale
命令部署具有三个副本的 NGINX 应用程序:kubectl create deployment nginx --image=mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine kubectl scale deployment nginx --replicas=3
使用以下
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 中业务连续性和灾难恢复的最佳做法。