共用方式為


建立使用可用性區域的 Azure Kubernetes Service (AKS) 叢集

本文說明如何建立 AKS 叢集,並跨多個可用性區域散發節點元件。

開始之前

  • 您必須安裝並設定 Azure CLI 版本 2.0.76 或以後版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI
  • 請閱讀 AKS 中的可用性區域概觀,以了解在 AKS 中使用可用性區域的優點和限制。

Azure Resource Manager 範本和可用性區域

使用 Azure Resource Manager 範本建立具有可用性區域的 AKS 叢集時,請記住下列詳細資料:

  • 如果您在範本中明確定義 null 值,例如 "availabilityZones": null,該範本會將此屬性視為不存在。 這表示您的叢集不會部署在可用性區域中。
  • 如果您未在範本中包含 "availabilityZones": 屬性,則叢集不會部署在可用性區域中。
  • 使用 Azure Resource Manager 範本更新 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. 使用 az aks create 命令搭配 --zones 參數建立 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"
    

    下列範例輸出顯示了跨指定區域和可用性區域散發的三個節點,例如第一個可用性區域的 eastus2-1,以及第二個可用性區域的 eastus2-2

    Name:       aks-nodepool1-28993262-vmss000000
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000001
                topology.kubernetes.io/zone=eastus2-2
    Name:       aks-nodepool1-28993262-vmss000002
                topology.kubernetes.io/zone=eastus2-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   eastus   eastus-1
aks-nodepool1-34917322-vmss000001   eastus   eastus-2
aks-nodepool1-34917322-vmss000002   eastus   eastus-3

驗證跨區域的 Pod 散發

已知的標籤、註釋和污點 (英文) 一文中所述,Kubernetes 會使用 topology.kubernetes.io/zone 標籤自動將 Pod 散發至不同可用區域中的複寫控制器或服務。 在此範例中,您會測試標籤,並將叢集從 3 個節點縮放為 5 個節點,以驗證 Pod 有正確分散。

  1. 使用 az aks scale 命令並將 --node-count 設定為 5,將 AKS 叢集從 3 個節點縮放為 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=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000001
                topology.kubernetes.io/zone=eastus2-2
    Name:       aks-nodepool1-28993262-vmss000002
                topology.kubernetes.io/zone=eastus2-3
    Name:       aks-nodepool1-28993262-vmss000003
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000004
                topology.kubernetes.io/zone=eastus2-2
    
  3. 使用下列 kubectl create deploymentkubectl scale 命令,部署具有三個複本的 NGINX 應用程式:

    kubectl create deployment nginx --image=mcr.microsoft.com/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,例如第一個可用性區域的 eastus2-1,以及第二個可用性區域的 eastus2-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 上執行,此節點位於可用性區域 eastus2-1。 第二個 Pod 在節點 2 (對應至 eastus2-3) 上執行,而第三個節點則是在 eastus2-2 中的節點 4。 如果沒有任何額外組態,Kubernetes 會在這三個可用性區域中之間正確散佈 Pod。

下一步

本文說明了如何使用可用性區域建立 AKS 叢集。 如需更多高可用性叢集的相關考量事項,請參閱因應 AKS 中商務持續性和災害復原的最佳做法