ローカル 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 を選択します。 一時 SSD では、レプリケーションは現在サポートされていません。

前提条件

  • 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 の種類を選択する

エフェメラル ディスクは、特定の種類の VM でのみ使用できます。 ローカル NVMe を使用する予定の場合は、standard_l8s_v3 などの、ストレージ最適化 VM が必要です。

次のコマンドを実行すると、ノード プールで使用される VM の種類を取得できます。

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.ボリューム レプリケーションが有効なストレージ プールを作成する

ローカル NVMe とレプリケーションを使用してストレージ プールを作成するには、次の手順に従います。 Azure Container Storage は、現在 3 つのレプリカ構成と 5 つのレプリカ構成をサポートしています。 3 つのレプリカを指定する場合、AKS クラスターに少なくとも 3 つのノードが必要です。 5 つのレプリカを指定する場合、少なくとも 5 つのノードが必要です。

Note

エフェメラル ディスク ストレージ プールは使用可能なすべての NVMe ディスクを使用するため、新しいストレージ プールを作成する前に、既存のすべてのローカル NVMe ストレージ プールを削除する必要があることに注意してください。

  1. 任意のテキスト エディターを使用して、code acstor-storagepool.yaml などの YAML マニフェスト ファイルを作成します。

  2. 次のコードを貼り付けて、ファイルを保存します。 ストレージ プールの name の値は何でもかまいません。 レプリカを「3」または「5」に設定します。

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: nvme
      namespace: acstor
    spec:
      poolType:
        ephemeralDisk:
          diskType: nvme
          replicas: 3
    
  3. YAML マニフェスト ファイルを適用してストレージ プールを作成します。

    kubectl apply -f acstor-storagepool.yaml 
    

    ストレージ プールの作成が完了すると、次のようなメッセージが表示されます。

    storagepool.containerstorage.azure.com/nvme created
    

    このコマンドを実行して、ストレージ プールの状態を確認することもできます。 <storage-pool-name> はストレージ プールの name の値に置き換えます。 この例では、値は 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        containerstorage.csi.azure.com   Delete          WaitForFirstConsumer   true                   2m27s

重要

internal が付いているストレージ クラスは使用しないでください。 これは、Azure Container Storage の動作に必要な内部ストレージ クラスです。

3.永続ボリューム要求の作成

永続ボリューム要求 (PVC) を使用して、ストレージ クラスに基づいてストレージを自動的にプロビジョニングします。 新しいストレージ クラスを使用して PVC を作成するには、次の手順に従います。

  1. 任意のテキスト エディターを使用して、code acstor-pvc.yaml などの YAML マニフェスト ファイルを作成します。

  2. 次のコードを貼り付けて、ファイルを保存します。 PVC name の値はどのような値にもすることができます。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ephemeralpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different
      resources:
        requests:
          storage: 100Gi
    

    ボリュームのストレージ サイズを変更する際には、そのサイズが単一ノードのエフェメラル ディスクの利用可能な容量より小さいことを確認します。 「ノード エフェメラル ディスク容量を確認する」を参照してください。

  3. YAML マニフェスト ファイルを適用して PVC を作成します。

    kubectl apply -f acstor-pvc.yaml
    

    次のような出力が表示されます。

    persistentvolumeclaim/ephemeralpvc created
    

    次のコマンドを実行して、PVC の状態を確認できます。

    kubectl describe pvc ephemeralpvc
    

PVC が作成されると、ポッドで使用できるようになります。

4.ポッドをデプロイして永続ボリュームをアタッチする

Fio (フレキシブル I/O テスター) を使用してベンチマークおよびワークロード シミュレーション用にポッドを作成し、永続ボリュームのマウント パスを指定します。 claimName には、永続ボリューム要求の作成時に使用した name の値を使用します。

  1. 任意のテキスト エディターを使用して、code acstor-pod.yaml などの YAML マニフェスト ファイルを作成します。

  2. 次のコードを貼り付けて、ファイルを保存します。

    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
    
  3. YAML マニフェスト ファイルを適用してポッドをデプロイします。

    kubectl apply -f acstor-pod.yaml
    

    次のような出力が表示されます。

    pod/fiopod created
    
  4. ポッドが実行されていること、および永続ボリューム要求がポッドに正常にバインドされていることを確認します。

    kubectl describe pod fiopod
    kubectl describe pvc ephemeralpvc
    
  5. 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) 上のローカル ストレージ リソースを使用するため、ストレージ プールを拡張するには、クラスターに別のノードを追加する必要があります。 ストレージ プールを拡張するには、次の手順に従います。

  1. 次のコマンドを実行して、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
    
  2. kubectl get nodes を実行すると、ノードがクラスターに追加されたことがわかります。

  3. kubectl get sp -A を実行すると、ストレージ プールの容量が増えたことがわかります。

ストレージ プールを削除する

ストレージ プールを削除する場合は、次のコマンドを実行します。 <storage-pool-name> はストレージ プール名に置き換えます。

kubectl delete sp -n acstor <storage-pool-name>

こちらもご覧ください