ローカル 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.ストレージ プールを作成する

まず、YAML マニフェスト ファイルで定義することによって、Kubernetes クラスターのストレージの論理グループであるストレージ プールを作成します。

az aks create または az aks update コマンドを使って Azure Container Storage を有効にした場合は、記憶域プールが既に存在している可能性があります。 kubectl get sp -n acstor を使って記憶域プールの一覧を取得します。 使いたい記憶域プールが既に使用可能な場合は、このセクションをスキップして、「使用可能なストレージ クラスを表示する」に進むことができます。

ローカル NVMe を使用してストレージ プールを作成するには、次の手順に従います。

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

  2. 次のコードを貼り付けて、ファイルを保存します。 ストレージ プールの name の値は何でもかまいません。

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: ephemeraldisk-nvme
      namespace: acstor
    spec:
      poolType:
        ephemeralDisk: {}
    
  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 テスター) を使用して、汎用エフェメラル ボリュームを使用する、ベンチマークおよびワークロード シミュレーション用のポッドを作成します。

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

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

    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
    

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

  3. YAML マニフェスト ファイルを適用してポッドをデプロイします。

    kubectl apply -f acstor-pod.yaml
    

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

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

    kubectl describe pod fiopod
    kubectl describe pvc fiopod-ephemeralvolume
    
  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 です。

ストレージ プールを拡張する

ローカル 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>

こちらもご覧ください