可用性ゾーンを使用する 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 クラスターで可用性ゾーンを無効にしようとして、"availabilityZones": []します。

複数の可用性ゾーンでの AKS クラスターの作成

az aks create コマンドを使用してクラスターを作成する場合は、--zones パラメーターで、エージェント ノードのデプロイ先となる可用性ゾーンを指定します。 マネージド コントロール プレーン コンポーネントがデプロイされる可用性ゾーンは、このパラメーターによって制御されません 。 これらは、クラスターのデプロイ中にリージョン内のすべての可用性ゾーン (存在する場合) に自動的に分散されます。

次のコマンド例では、リソース グループと合計 3 つのノードを持つ AKS クラスターを作成する方法を示します。 ゾーン 123 にそれぞれ 1 つずつのエージェント ノードがあります。

  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 Virtual Machine Scale Sets によって提供されるベスト エフォートのゾーン分散を使用します。 スケール セットの各ゾーンの 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"
    

    次の出力例では、指定のリージョンの複数の可用性ゾーンに分散した 3 つのノードが示されています (1 番目の可用性ゾーンは eastus2-1、2 番目の可用性ゾーンは 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 Platform は、基になる 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

複数のゾーンへのポッドの分散を確認する

有名なラベル、注釈、およびテイント」に記載されているように、Kubernetes は topology.kubernetes.io/zone ラベルを使用して、使用可能なさまざまなゾーンにわたってレプリケーション コントローラーまたはサービス内のポッドを自動的に分散します。 この例では、ラベルをテストし、クラスターを 3 ノードから 5 ノードにスケーリングして、ポッドが正しく分散されていることを確認します。

  1. --node-count5 に設定した az aks scale コマンドを使用して、AKS クラスターを 3 から 5 ノードにスケーリングします。

    az aks scale \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --node-count 5
    
  2. スケール操作が完了したら、次の kubectl describe コマンドを使用してゾーン間でのポッドの分散を確認します。

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

    次の出力例では、指定のリージョンの複数の可用性ゾーンに分散した 5 つのノードが示されています (1 番目の可用性ゾーンは eastus2-1、2 番目の可用性ゾーンは 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 deployment コマンドおよび kubectl scale コマンドを使用して、3 つのレプリカを含む 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 コマンドを使用して、ゾーン間のポッドの分散を確認します。

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

    次の出力例では、指定のリージョンの複数の可用性ゾーンに分散した 3 つのポッドが示されています (1 番目の可用性ゾーンは eastus2-1、2 番目の可用性ゾーンは 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
    

    前の出力からわかるように、最初のポッドは、可用性ゾーン eastus2-1 にあるノード 0 で実行されています。 2 つ目のポッドは、eastus2-3 に対応するノード 2 で実行されています。また、3 つ目のポッドは、eastus2-2 のノード 4 で実行されています。 追加の構成を行わなくても、Kubernetes は 3 つすべての可用性ゾーンにポッドを正しく分散させます。

次のステップ

この記事では、可用性ゾーンを使用する AKS クラスターの作成方法について説明しました。 高可用性クラスターの考慮事項について詳しくは、「AKS での事業継続とディザスター リカバリーに関するベスト プラクティス」をご覧ください。