ローカル NVMe およびボリューム レプリケーションとともに Azure Container Storage を使う
Azure Container Storage は、コンテナー用にネイティブに構築されたクラウドベースのボリューム管理、デプロイ、オーケストレーション サービスです。 この記事では、Kubernetes ワークロードのバックエンド ストレージとしてローカル NVMe およびボリューム レプリケーションが有効なエフェメラル ディスクを使用するように Azure Container Storage を構成する方法について説明します。 最後に、ローカル NVMe をストレージとして使用するポッドが得られます。 レプリケーションでは、異なるノード上のボリューム間でデータをコピーし、レプリカが失われたときにボリュームを復元し、エフェメラル ディスクの回復性を提供します。
エフェメラル ディスクとは
アプリケーションでミリ秒未満のストレージ待ち時間が必要な場合は、Azure Container Storage でエフェメラル ディスクを使用してパフォーマンス要件を満たすことができます。 エフェメラルとは、ディスクが AKS クラスターをホストするローカル仮想マシン (VM) にデプロイされ、Azure ストレージ サービスに保存されないことを意味します。 VM を停止または割り当て解除すると、これらのディスク上のデータは失われます。
使用できるエフェメラル ディスクには、ローカル NVMe と一時 SSD の 2 種類があります。 NVMe は、ストレージと CPU 間の高速データ転送用に設計されています。 アプリケーションが、一時 SSD よりも高い IOPS またはスループットを必要とする場合、またはより多くのストレージ領域を必要とする場合は、NVMe を選択します。 Azure Container Storage は、ローカル NVMe の同期データ レプリケーションのみをサポートする点に注意してください。
これらのディスクの一時性という性質により、Azure Container Storage は、エフェメラル ディスクを使用する場合、既定で汎用エフェメラル ボリュームの使用をサポートします。 ただし、特定のユース ケースでは、データが永続的でない場合でも永続ボリュームが必要になる場合があります。たとえば、永続ボリュームを使用するようにハードコーディングされた既存の YAML ファイルまたはデプロイ テンプレートを使用する場合や、ワークロードが持続性のためにアプリケーション レベルのレプリケーションをサポートしている場合などです。 このような場合は、Azure Container Storage のインストールを更新し、永続ボリューム要求定義に注釈 acstor.azure.com/accept-ephemeral-storage=true
を追加して、エフェメラル ディスク ストレージ プールからの永続ボリュームの作成をサポートできます。
前提条件
Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
この記事では、最新バージョン (2.35.0 以降) の Azure CLI が必要です。 「Azure CLI のインストール方法」を参照してください。 Azure Cloud Shell の Bash 環境を使用している場合は、最新バージョンが既にインストールされています。 Azure Cloud Shell ではなくローカルでコマンドを実行する場合は、必ず管理特権で実行してください。 詳細については、「Azure Cloud Shell の概要」を参照してください。
Kubernetes コマンド ライン クライアント
kubectl
が必要です。 Azure Cloud Shell を使用している場合は既にインストールされています。または、az aks install-cli
コマンドを実行してローカルにインストールできます。Azure Container Storage をまだインストールしていない場合は、Azure Kubernetes Service での Azure Container Storage の使用に関する記事の手順に従ってください。
ターゲット リージョンが Azure Container Storage リージョンでサポート対象になっているかどうかを確認します。
ローカル NVMe をサポートする VM の種類を選択する
ローカル NVMe ディスクは、特定の種類の VM でのみ使用できます。たとえば、ストレージ最適化 VM SKU、GPU アクセラレーション VM SKU。 ローカル NVMe を使用する場合は、次のいずれかの VM SKU を選択します。
次のコマンドを実行して、ノード プールで使用されている VM の種類を取得します。 <resource group>
と <cluster name>
を独自の値に置き換えます。 PoolName
または VmSize
に値を指定する必要はないため、クエリはここに示されているとおりにしておきます。
az aks nodepool list --resource-group <resource group> --cluster-name <cluster name> --query "[].{PoolName:name, VmSize:vmSize}" -o table
出力の例を次に示します。
PoolName VmSize
---------- ---------------
nodepool1 standard_l8s_v3
各 VM に少なくとも 4 つの仮想 CPU (vCPU) があり、各ノード プールに少なくとも 3 つのノードがあることをお勧めします。
汎用エフェメラル ボリュームを作成してアタッチする
次の手順に従って汎用エフェメラル ボリュームを作成してアタッチします。
1.ボリューム レプリケーションが有効なストレージ プールを作成する
まず、YAML マニフェスト ファイルで定義することによって、Kubernetes クラスターのストレージの論理グループであるストレージ プールを作成します。
az aks create
または az aks update
コマンドを使って Azure Container Storage を有効にした場合は、記憶域プールが既に存在している可能性があります。 kubectl get sp -n acstor
を使って記憶域プールの一覧を取得します。 使いたい記憶域プールが既に使用可能な場合は、このセクションをスキップして、「使用可能なストレージ クラスを表示する」に進むことができます。
ローカル NVMe とレプリケーションを使用してストレージ プールを作成するには、次の手順に従います。 Azure Container Storage は、現在 3 つのレプリカ構成と 5 つのレプリカ構成をサポートしています。 3 つのレプリカを指定する場合、AKS クラスターに少なくとも 3 つのノードが必要です。 5 つのレプリカを指定する場合、少なくとも 5 つのノードが必要です。
Note
エフェメラル ディスク ストレージ プールは使用可能なすべての NVMe ディスクを使用するため、新しいストレージ プールを作成する前に、既存のすべてのローカル NVMe ストレージ プールを削除する必要があることに注意してください。
任意のテキスト エディターを使用して、
code acstor-storagepool.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けて、ファイルを保存します。 ストレージ プールの name の値は何でもかまいません。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme replicas: 3
YAML マニフェスト ファイルを適用してストレージ プールを作成します。
kubectl apply -f acstor-storagepool.yaml
ストレージ プールの作成が完了すると、次のようなメッセージが表示されます。
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
このコマンドを実行して、ストレージ プールの状態を確認することもできます。
<storage-pool-name>
はストレージ プールの name の値に置き換えます。 この例では、値は ephemeraldisk-nvme になります。kubectl describe sp <storage-pool-name> -n acstor
ストレージ プールが作成されると、Azure Container Storage により、名前付け規則 acstor-<storage-pool-name>
を使用してストレージ クラスが自動的に作成されます。
2.使用可能なストレージ クラスを表示する
ストレージ プールを使用する準備ができたら、ストレージ クラスを選択して、ボリュームの作成とデプロイ時にストレージが動的に作成される方式を定義する必要があります。
kubectl get sc
を実行して、使用可能なストレージ クラスを表示します。 acstor-<storage-pool-name>
というストレージ クラスがあることを確認します。
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
重要
internal が付いているストレージ クラスは使用しないでください。 これは、Azure Container Storage の動作に必要な内部ストレージ クラスです。
3.汎用エフェメラル ボリュームを使用してポッドをデプロイする
Fio (フレキシブル I/O テスター) を使用して、汎用エフェメラル ボリュームを使用する、ベンチマークおよびワークロード シミュレーション用のポッドを作成します。
任意のテキスト エディターを使用して、
code acstor-pod.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けて、ファイルを保存します。
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralvolume volumes: - name: ephemeralvolume ephemeral: volumeClaimTemplate: metadata: labels: type: my-ephemeral-volume spec: accessModes: [ "ReadWriteOnce" ] storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 1Gi
ボリュームのストレージ サイズを変更する際には、そのサイズが単一ノードのエフェメラル ディスクの利用可能な容量より小さいことを確認します。 「ノード エフェメラル ディスク容量を確認する」を参照してください。
YAML マニフェスト ファイルを適用してポッドをデプロイします。
kubectl apply -f acstor-pod.yaml
次のような出力が表示されます。
pod/fiopod created
ポッドが実行されていること、およびエフェメラル ボリューム要求がポッドに正常にバインドされていることを確認します。
kubectl describe pod fiopod kubectl describe pvc fiopod-ephemeralvolume
fio テストをチェックして、その現在の状態を確認します。
kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
ボリューム レプリケーションが有効なローカル NVMe を使用するポッドをデプロイしたので、それを Kubernetes ワークロードに使用できます。
永続ボリュームを作成してアタッチする
エフェメラル ディスク ストレージ プールから永続ボリュームを作成するには、永続ボリューム要求 (PVC) に注釈を含め、データが一時的であっても永続ボリュームを確実に使用できるようにする必要があります。 さらに、永続ボリューム要求を作成する前に、クラスターの PersistentVolumeWithAnnotation
値で --ephemeral-disk-volume-type
フラグを有効にする必要があります。
次の手順に従って永続ボリュームを作成してアタッチします。
1.Azure Container Storage のインストールの更新
次のコマンドを実行して、エフェメラル ディスク ストレージ プールから永続ボリュームを作成できるように Azure Container Storage のインストールを更新します。
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage ephemeralDisk --storage-pool-option NVMe --ephemeral-disk-volume-type PersistentVolumeWithAnnotation
2.ボリューム レプリケーションが有効なストレージ プールを作成する
ローカル NVMe とレプリケーションを使用してストレージ プールを作成するには、次の手順に従います。 Azure Container Storage は、現在 3 つのレプリカ構成と 5 つのレプリカ構成をサポートしています。 3 つのレプリカを指定する場合、AKS クラスターに少なくとも 3 つのノードが必要です。 5 つのレプリカを指定する場合、少なくとも 5 つのノードが必要です。
Note
エフェメラル ディスク ストレージ プールは使用可能なすべての NVMe ディスクを使用するため、新しいストレージ プールを作成する前に、既存のすべてのローカル NVMe ストレージ プールを削除する必要があることに注意してください。
任意のテキスト エディターを使用して、
code acstor-storagepool.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けて、ファイルを保存します。 ストレージ プールの name の値は何でもかまいません。 レプリカを「3」または「5」に設定します。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme replicas: 3
YAML マニフェスト ファイルを適用してストレージ プールを作成します。
kubectl apply -f acstor-storagepool.yaml
ストレージ プールの作成が完了すると、次のようなメッセージが表示されます。
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
このコマンドを実行して、ストレージ プールの状態を確認することもできます。
<storage-pool-name>
はストレージ プールの name の値に置き換えます。 この例では、値は ephemeraldisk-nvme になります。kubectl describe sp <storage-pool-name> -n acstor
ストレージ プールが作成されると、Azure Container Storage により、名前付け規則 acstor-<storage-pool-name>
を使用してストレージ クラスが自動的に作成されます。
3.使用可能なストレージ クラスを表示する
ストレージ プールを使用する準備ができたら、ストレージ クラスを選択して、ボリュームの作成とデプロイ時にストレージが動的に作成される方式を定義する必要があります。
kubectl get sc
を実行して、使用可能なストレージ クラスを表示します。 acstor-<storage-pool-name>
というストレージ クラスがあることを確認します。
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
重要
internal が付いているストレージ クラスは使用しないでください。 これは、Azure Container Storage の動作に必要な内部ストレージ クラスです。
4.永続ボリューム要求の作成
永続ボリューム要求 (PVC) を使用して、ストレージ クラスに基づいてストレージを自動的にプロビジョニングします。 新しいストレージ クラスを使用して PVC を作成するには、次の手順に従います。
任意のテキスト エディターを使用して、
code acstor-pvc.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けて、ファイルを保存します。 PVC
name
の値はどのような値にもすることができます。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ephemeralpvc annotations: acstor.azure.com/accept-ephemeral-storage: "true" spec: accessModes: - ReadWriteOnce storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 100Gi
ボリュームのストレージ サイズを変更する際には、そのサイズが単一ノードのエフェメラル ディスクの利用可能な容量より小さいことを確認します。 「ノード エフェメラル ディスク容量を確認する」を参照してください。
YAML マニフェスト ファイルを適用して PVC を作成します。
kubectl apply -f acstor-pvc.yaml
次のような出力が表示されます。
persistentvolumeclaim/ephemeralpvc created
次のコマンドを実行して、PVC の状態を確認できます。
kubectl describe pvc ephemeralpvc
PVC が作成されると、ポッドで使用できるようになります。
5.ポッドをデプロイして永続ボリュームをアタッチする
Fio (フレキシブル I/O テスター) を使用してベンチマークおよびワークロード シミュレーション用にポッドを作成し、永続ボリュームのマウント パスを指定します。 claimName には、永続ボリューム要求の作成時に使用した name の値を使用します。
任意のテキスト エディターを使用して、
code acstor-pod.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けて、ファイルを保存します。
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor volumes: - name: ephemeralpv persistentVolumeClaim: claimName: ephemeralpvc containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralpv
YAML マニフェスト ファイルを適用してポッドをデプロイします。
kubectl apply -f acstor-pod.yaml
次のような出力が表示されます。
pod/fiopod created
ポッドが実行されていること、および永続ボリューム要求がポッドに正常にバインドされていることを確認します。
kubectl describe pod fiopod kubectl describe pvc ephemeralpvc
fio テストをチェックして、その現在の状態を確認します。
kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
ボリューム レプリケーションが有効なローカル NVMe を使用するポッドをデプロイしたので、それを Kubernetes ワークロードに使用できます。
ボリュームとストレージ プールを管理する
このセクションでは、エフェメラル ディスクの利用可能な容量を確認する方法、永続ボリュームをデタッチして再アタッチする方法、ストレージ プールを拡張または削除する方法、パフォーマンスを最適化する方法を学習します。
ノード エフェメラル ディスク容量を確認する
エフェメラル ボリュームは、単一ノードに割り当てられます。 エフェメラル ボリュームのサイズを構成する際には、そのサイズを単一ノードのエフェメラル ディスクの利用可能な容量より小さくする必要があります。
次のコマンドを実行して、単一ノードのエフェメラル ディスクの利用可能な容量を確認します。
$ kubectl get diskpool -n acstor
NAME CAPACITY AVAILABLE USED RESERVED READY AGE
ephemeraldisk-nvme-diskpool-jaxwb 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-wzixx 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-xbtlj 75660001280 75031990272 628011008 560902144 True 21h
この例では、単一ノードのエフェメラル ディスクの利用可能な容量は、75031990272
バイトまたは 69 GiB です。
永続ボリュームをデタッチして再アタッチする
永続ボリュームをデタッチするには、永続ボリュームがアタッチされているポッドを削除します。
kubectl delete pods <pod-name>
永続ボリュームを再アタッチするには、「ポッドをデプロイして永続ボリュームをアタッチする」の説明に従って、YAML マニフェスト ファイル内の永続ボリューム要求名を参照するだけです。
永続ボリューム要求がバインドされている永続ボリュームを確認するには、次を実行します。
kubectl get pvc <persistent-volume-claim-name>
ストレージ プールを拡張する
ローカル NVMe によってサポートされるストレージ プールを拡張すると、ダウンタイムなしで迅速にスケールアップできます。 ストレージ プールの縮小は現在サポートされていません。
エフェメラル ディスクによってサポートされるストレージ プールは AKS クラスター ノード (VM) 上のローカル ストレージ リソースを使用するため、ストレージ プールを拡張するには、クラスターに別のノードを追加する必要があります。 ストレージ プールを拡張するには、次の手順に従います。
次のコマンドを実行して、AKS クラスターにノードを追加します。
<cluster-name>
、<nodepool name>
、および<resource-group-name>
を独自の値に置き換えます。 ノード プールの名前を取得するには、kubectl get nodes
を実行します。az aks nodepool add --cluster-name <cluster name> --name <nodepool name> --resource-group <resource group> --node-vm-size Standard_L8s_v3 --node-count 1 --labels acstor.azure.com/io-engine=acstor
kubectl get nodes
を実行すると、ノードがクラスターに追加されたことがわかります。kubectl get sp -A
を実行すると、ストレージ プールの容量が増えたことがわかります。
ストレージ プールを削除する
ストレージ プールを削除する場合は、次のコマンドを実行します。 <storage-pool-name>
はストレージ プール名に置き換えます。
kubectl delete sp -n acstor <storage-pool-name>
ローカル NVMe 使用時のパフォーマンスの最適化
ワークロードのパフォーマンス要件に応じて、Basic、Standard、Premium という 3 つの異なるパフォーマンス レベルから選択できます。 各レベルでは異なる範囲の IOPS が提供され、選択したレベルは、Azure Container Storage のコンポーネントがインストール先のノードで消費する vCPU の数に影響を与えます。 パフォーマンス レベルを更新しない場合は、Standard が既定の構成となります。
単一ゾーン レプリケーション
階層 | vCPU の数 | 100% 読み取り IOPS | 100% 書き込み IOPS |
---|---|---|---|
Basic |
VM コアの合計数の 12.5% | 最大 120,000 | 最大 45,000 |
Standard (既定) |
VM コアの合計数の 25% | 最大 220,000 | 最大 90,000 |
Premium |
VM コアの合計数の 50% | 最大 550,000 | 最大 180,000 |
マルチゾーン レプリケーション
階層 | vCPU の数 | 100% 読み取り IOPS | 100% 書き込み IOPS |
---|---|---|---|
Basic |
VM コアの合計数の 12.5% | 最大 120,000 | 最大 45,000 |
Standard (既定) |
VM コアの合計数の 25% | 最大 220,000 | 最大 90,000 |
Premium |
VM コアの合計数の 50% | 最大 550,000 | 最大 180,000 |
Note
RAM と hugepage の消費量はすべてのレベルで一貫しており、RAM は 1 GiB、hugepage は 2 GiB です。
ニーズに最適なパフォーマンス レベルを特定したら、次のコマンドを実行して、Azure Container Storage のインストールのパフォーマンス レベルを更新できます。 <performance tier>
は、basic、standard、または premium に置き換えてください。
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type> --ephemeral-disk-nvme-perf-tier <performance-tier>