可用性ゾーンを使用する 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 クラスターを作成する方法を示します。 ゾーン 1、2、3 にそれぞれ 1 つずつのエージェント ノードがあります。
az group create
コマンドを使用して、リソース グループを作成します。az group create --name $RESOURCE_GROUP --location $LOCATION
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 ノード プールは "バランスが取れている" と見なされます。
複数のゾーンへのノードの分散を確認する
クラスターの準備ができたら、スケール セット内のエージェント ノードが配置されている可用性ゾーンをリストします。
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"
次の出力例では、指定のリージョンの複数の可用性ゾーンに分散した 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 ノードにスケーリングして、ポッドが正しく分散されていることを確認します。
--node-count
を5
に設定したaz aks scale
コマンドを使用して、AKS クラスターを 3 から 5 ノードにスケーリングします。az aks scale \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --node-count 5
スケール操作が完了したら、次の
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
次の
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
次の
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 での事業継続とディザスター リカバリーに関するベスト プラクティス」をご覧ください。
Azure Kubernetes Service