可用性ゾーンを使用する Azure Kubernetes Service (AKS) クラスターを作成するCreate an Azure Kubernetes Service (AKS) cluster that uses availability zones

Azure Kubernetes Service (AKS) クラスターは、ノードやストレージなどのリソースを、基になる Azure インフラストラクチャの複数の論理セクションに分散させます。An Azure Kubernetes Service (AKS) cluster distributes resources such as nodes and storage across logical sections of underlying Azure infrastructure. このデプロイ モデルでは、可用性ゾーンを使用する場合、特定の可用性ゾーン内のノードが、別の可用性ゾーンで定義されているノードと物理的に分離されていることを確認します。This deployment model when using availability zones, ensures nodes in a given availability zone are physically separated from those defined in another availability zone. クラスター全体に構成された複数の可用性ゾーンでデプロイされる AKS クラスターは、ハードウェア障害または計画メンテナンス イベントから保護するための高レベルの可用性を提供します。AKS clusters deployed with multiple availability zones configured across a cluster provide a higher level of availability to protect against a hardware failure or a planned maintenance event.

クラスター内のノード プールを複数のゾーンにまたがるように定義することで、1 つのゾーンがダウンした場合でも、特定のノード プール内のノードは動作を継続できます。By defining node pools in a cluster to span multiple zones, nodes in a given node pool are able to continue operating even if a single zone has gone down. 1 つのデータセンターで物理的な障害が発生した場合でも、ノードのサブセットの障害に耐えられるよう調整できていれば、アプリケーションを引き続き利用できます。Your applications can continue to be available even if there is a physical failure in a single datacenter if orchestrated to tolerate failure of a subset of nodes.

この記事では、AKS クラスターを作成し、複数の可用性ゾーンにノード コンポーネントを分散させる方法について説明します。This article shows you how to create an AKS cluster and distribute the node components across availability zones.

開始する前にBefore you begin

Azure CLI バージョン 2.0.76 以降がインストールされて構成されている必要があります。You need the Azure CLI version 2.0.76 or later installed and configured. バージョンを確認するには、az --version を実行します。Run az --version to find the version. インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。If you need to install or upgrade, see Install Azure CLI.

制限事項とリージョンの可用性Limitations and region availability

現在、AKS クラスターは、次のリージョンの可用性ゾーンを使用して作成できます。AKS clusters can currently be created using availability zones in the following regions:

  • オーストラリア東部Australia East
  • カナダ中部Canada Central
  • 米国中部Central US
  • 米国東部East US
  • 米国東部 2East US 2
  • フランス中部France Central
  • 東日本Japan East
  • 北ヨーロッパNorth Europe
  • 東南アジアSoutheast Asia
  • 英国南部UK South
  • 西ヨーロッパWest Europe
  • 米国西部 2West US 2

可用性ゾーンを使用して AKS クラスターを作成する場合、次の制限事項が適用されます。The following limitations apply when you create an AKS cluster using availability zones:

  • 可用性ゾーンは、クラスターまたはノード プールの作成時にのみ定義できます。You can only define availability zones when the cluster or node pool is created.
  • 可用性ゾーンの設定は、クラスターの作成後は更新できません。Availability zone settings can't be updated after the cluster is created. また、可用性ゾーンを使用するために、既存の非可用性ゾーン クラスターを更新することはできません。You also can't update an existing, non-availability zone cluster to use availability zones.
  • 選択したノード サイズ (VM SKU) を、選択したすべての可用性ゾーンで使用できる必要があります。The chosen node size (VM SKU) selected must be available across all availability zones selected.
  • 可用性ゾーンが有効になっているクラスターでは、複数のゾーンへの分散のために Azure Standard Load Balancer を使用する必要があります。Clusters with availability zones enabled require use of Azure Standard Load Balancers for distribution across zones. このロード バランサーの種類は、クラスターの作成時にのみ定義できます。This load balancer type can only be defined at cluster create time. Standard Load Balancer の詳細と制限事項については、Azure Load Balancer Standard SKU の制限事項に関する記事をご覧ください。For more information and the limitations of the standard load balancer, see Azure load balancer standard SKU limitations.

Azure ディスクの制限事項Azure disks limitations

Azure マネージド ディスクを使用するボリュームは、現在、ゾーン冗長リソースではありません。Volumes that use Azure managed disks are currently not zone-redundant resources. ボリュームをゾーン間で接続することはできず、ターゲット ポッドをホストする特定のノードと同じゾーンに併置する必要があります。Volumes cannot be attached across zones and must be co-located in the same zone as a given node hosting the target pod.

Kubernetes では、バージョン 1.12 以降で、Azure 可用性ゾーンが認識されています。Kubernetes is aware of Azure availability zones since version 1.12. ユーザーは、複数ゾーンの AKS クラスターで Azure マネージド ディスクを参照して PersistentVolumeClaim オブジェクトをデプロイすることができます。また、適切な可用性ゾーン内にこの PVC を要求するあらゆるポッドのスケジュール設定が Kubernetes によって管理されます。You can deploy a PersistentVolumeClaim object referencing an Azure Managed Disk in a multi-zone AKS cluster and Kubernetes will take care of scheduling any pod that claims this PVC in the correct availability zone.

AKS クラスターの可用性ゾーンの概要Overview of availability zones for AKS clusters

可用性ゾーンとは高可用性を提供するサービスで、アプリケーションとデータをデータセンターの障害から保護します。Availability zones are a high-availability offering that protects your applications and data from datacenter failures. ゾーンは、Azure リージョン内の一意の物理的な場所です。Zones are unique physical locations within an Azure region. それぞれのゾーンは、独立した電源、冷却手段、ネットワークを備えた 1 つまたは複数のデータセンターで構成されています。Each zone is made up of one or more datacenters equipped with independent power, cooling, and networking. 回復性を確保するため、ゾーンが有効になっているすべてのリージョンに常に複数のゾーンがあります。To ensure resiliency, there's always more than one zone in all zone enabled regions. 可用性ゾーンはリージョン内で物理的に分離されているため、データセンターで障害が発生してもアプリケーションとデータは保護されます。The physical separation of availability zones within a region protects applications and data from datacenter failures.

詳しくは、「Azure の可用性ゾーンの概要」をご覧ください。For more information, see What are availability zones in Azure?.

可用性ゾーンを使用してデプロイされる AKS クラスターでは、1 つのリージョン内の複数のゾーンにノードを分散させることができます。AKS clusters that are deployed using availability zones can distribute nodes across multiple zones within a single region. たとえば、 米国東部 2  リージョンのクラスターでは、米国東部 2 の 3 つすべての可用性ゾーンでノードを作成できます。For example, a cluster in the  East US 2 region can create nodes in all three availability zones in East US 2. この AKS クラスターリソースの分散により、特定のゾーンの障害に対する回復力があるため、クラスターの可用性が向上します。This distribution of AKS cluster resources improves cluster availability as they're resilient to failure of a specific zone.

複数の可用性ゾーンへの AKS ノードの分散

1 つのゾーンが使用できなくなった場合でも、クラスターが複数のゾーンに分散していれば、アプリケーションは引き続き実行されます。If a single zone becomes unavailable, your applications continue to run if the cluster is spread across multiple zones.

複数の可用性ゾーンでの AKS クラスターの作成Create an AKS cluster across availability zones

az aks create コマンドを使用してクラスターを作成する場合、--zones パラメーターで、エージェント ノードをデプロイする先のゾーンを定義します。When you create a cluster using the az aks create command, the --zones parameter defines which zones agent nodes are deployed into. クラスターの作成時に --zones パラメーターを定義すると、etcd や API などのコントロール プレーン コンポーネントがリージョン内の使用可能なゾーンに分散されます。The control plane components such as etcd or the API are spread across the available zones in the region if you define the --zones parameter at cluster creation time. コントロール プレーン コンポーネントが分散される特定のゾーンは、初期ノード プールに対して選択されている明示的なゾーンに依存しません。The specific zones which the control plane components are spread across are independent of what explicit zones are selected for the initial node pool.

AKS クラスターの作成時に既定のエージェント プールのゾーンを定義しなかった場合、コントロール プレーン コンポーネントが可用性ゾーン間で分散されることは保証されません。If you don't define any zones for the default agent pool when you create an AKS cluster, control plane components are not guaranteed to spread across availability zones. az aks nodepool add コマンドを使用して別のノード プールを追加し、新しいノードに --zones を指定することはできますが、コントロール プレーンがゾーン間でどのように分散されているかは変わりません。You can add additional node pools using the az aks nodepool add command and specify --zones for new nodes, but it will not change how the control plane has been spread across zones. 可用性ゾーンの設定は、クラスターまたはノード プールの作成時にのみ定義できます。Availability zone settings can only be defined at cluster or node pool create-time.

次の例では、myResourceGroup という名前のリソース グループに myAKSCluster という名前の AKS クラスターを作成しています。The following example creates an AKS cluster named myAKSCluster in the resource group named myResourceGroup. 合計 3 つのノードが作成されます (ゾーン 1 にエージェント 1 つ、ゾーン 2 にエージェント 1 つ、ゾーン 3 にエージェント 1 つ)。A total of 3 nodes are created - one agent in zone 1, one in 2, and then one in 3.

az group create --name myResourceGroup --location eastus2

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

AKS クラスターの作成には数分かかります。It takes a few minutes to create the AKS cluster.

新しいノードが属するゾーンを決定するとき、指定された AKS node プールは、基になる Azure Virtual Machine Scale Sets によって提供されるベスト エフォートのゾーン分散を使用します。When deciding what zone a new node should belong to, a given AKS node pool will use a best effort zone balancing offered by underlying Azure Virtual Machine Scale Sets. 特定の AKS ノード プールが "バランスが取れている" ものと見なされるのは、スケール セットの各ゾーンの VM 数が同じであるか差が -1 つ以内の場合です。A given AKS node pool is considered "balanced" if each zone has the same number of VMs or +- 1 VM in all other zones for the scale set.

複数のゾーンへのノードの分散を確認するVerify node distribution across zones

クラスターの準備ができたら、スケール セット内のエージェント ノードを一覧表示して、それらがデプロイされている可用性ゾーンを確認します。When the cluster is ready, list the agent nodes in the scale set to see what availability zone they're deployed in.

最初に、az aks get-credentials コマンドを使用して、AKS クラスターの資格情報を取得します。First, get the AKS cluster credentials using the az aks get-credentials command:

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

次に、kubectl describe コマンドを使用して、クラスター内のノードを一覧表示し、failure-domain.beta.kubernetes.io/zone 値でフィルター処理します。Next, use the kubectl describe command to list the nodes in the cluster and filter on the failure-domain.beta.kubernetes.io/zone value. Bash シェルの例を次に示します。The following example is for a Bash shell.

kubectl describe nodes | grep -e "Name:" -e "failure-domain.beta.kubernetes.io/zone"

次の出力例では、指定のリージョンの複数の可用性ゾーンに分散した 3 つのノードが示されています (1 番目の可用性ゾーンは eastus2-1、2 番目の可用性ゾーンは eastus2-2 など)。The following example output shows the three nodes distributed across the specified region and availability zones, such as eastus2-1 for the first availability zone and eastus2-2 for the second availability zone:

Name:       aks-nodepool1-28993262-vmss000000
            failure-domain.beta.kubernetes.io/zone=eastus2-1
Name:       aks-nodepool1-28993262-vmss000001
            failure-domain.beta.kubernetes.io/zone=eastus2-2
Name:       aks-nodepool1-28993262-vmss000002
            failure-domain.beta.kubernetes.io/zone=eastus2-3

エージェント プールにさらにノードを追加すると、Azure Platform は、基になる VM を指定の複数の可用性ゾーンに自動的に分散させます。As you add additional nodes to an agent pool, the Azure platform automatically distributes the underlying VMs across the specified availability zones.

新しい Kubernetes バージョン (1.17.0 以降以降) では、AKS では非推奨の failure-domain.beta.kubernetes.io/zone に加えて新しいラベル topology.kubernetes.io/zone が使用されていることに注意してください。Note that in newer Kubernetes versions (1.17.0 and later), AKS is using the newer label topology.kubernetes.io/zone in addition to the deprecated failure-domain.beta.kubernetes.io/zone. 次のスクリプトを実行すると、上記と同じ結果を得ることができます。You can get the same result as above with by running the following script:

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

これにより、さらに簡潔な出力が得られます。Which will give you a more succinct output:

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

複数のゾーンへのポッドの分散を確認するVerify pod distribution across zones

有名なラベル、注釈、およびテイント」に記載されているように、Kubernetes は failure-domain.beta.kubernetes.io/zone ラベルを使用して、使用可能なさまざまなゾーンにわたってレプリケーション コントローラーまたはサービス内のポッドを自動的に分散します。As documented in Well-Known Labels, Annotations and Taints, Kubernetes uses the failure-domain.beta.kubernetes.io/zone label to automatically distribute pods in a replication controller or service across the different zones available. これをテストするには、クラスターを 3 ノードから 5 ノードにスケールアップして、正しいポッド拡散を確認します。In order to test this, you can scale up your cluster from 3 to 5 nodes, to verify correct pod spreading:

az aks scale \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 5

数分後にスケール操作が完了すると、Bash シェルのコマンド kubectl describe nodes | grep -e "Name:" -e "failure-domain.beta.kubernetes.io/zone" によって、次の例のような出力が得られます。When the scale operation completes after a few minutes, the command kubectl describe nodes | grep -e "Name:" -e "failure-domain.beta.kubernetes.io/zone" in a Bash shell should give an output similar to this sample:

Name:       aks-nodepool1-28993262-vmss000000
            failure-domain.beta.kubernetes.io/zone=eastus2-1
Name:       aks-nodepool1-28993262-vmss000001
            failure-domain.beta.kubernetes.io/zone=eastus2-2
Name:       aks-nodepool1-28993262-vmss000002
            failure-domain.beta.kubernetes.io/zone=eastus2-3
Name:       aks-nodepool1-28993262-vmss000003
            failure-domain.beta.kubernetes.io/zone=eastus2-1
Name:       aks-nodepool1-28993262-vmss000004
            failure-domain.beta.kubernetes.io/zone=eastus2-2

ゾーン 1 とゾーン 2 に 2 つのノードが追加されました。We now have two additional nodes in zones 1 and 2. 3 つのレプリカで構成されるアプリケーションをデプロイできます。You can deploy an application consisting of three replicas. 例として NGINX を使用します。We will use NGINX as an example:

kubectl create deployment nginx --image=nginx
kubectl scale deployment nginx --replicas=3

ポッドが実行されているノードを表示すると、3 つの異なる可用性ゾーンに対応するノードでポッドが実行されていることがわかります。By viewing nodes where your pods are running, you see pods are running on the nodes corresponding to three different availability zones. たとえば、Bash シェルでコマンド kubectl describe pod | grep -e "^Name:" -e "^Node:" を使用すると、次のような出力が表示されます。For example, with the command kubectl describe pod | grep -e "^Name:" -e "^Node:" in a Bash shell you would get an output similar to this:

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 で実行されています。As you can see from the previous output, the first pod is running on node 0, which is located in the availability zone eastus2-1. 2 つ目のポッドは、eastus2-3 に対応するノード 2 で実行されています。また、3 つ目のポッドは、eastus2-2 のノード 4 で実行されています。The second pod is running on node 2, which corresponds to eastus2-3, and the third one in node 4, in eastus2-2. 追加の構成を行うことなく、Kubernetes は 3 つの可用性ゾーンすべてにわたってポッドを正しく分散します。Without any additional configuration, Kubernetes is spreading the pods correctly across all three availability zones.

次のステップNext steps

この記事では、可用性ゾーンを使用する AKS クラスターの作成方法について詳しく説明します。This article detailed how to create an AKS cluster that uses availability zones. 高可用性クラスターの考慮事項について詳しくは、「AKS での事業継続とディザスター リカバリーに関するベスト プラクティス」をご覧ください。For more considerations on highly available clusters, see Best practices for business continuity and disaster recovery in AKS.