Azure マネージド ディスクで Azure Container Storage を使用する
Azure Container Storage は、コンテナー用にネイティブに構築されたクラウドベースのボリューム管理、デプロイ、オーケストレーション サービスです。 この記事では、Kubernetes ワークロードのバックエンド ストレージとして Azure マネージド ディスクを使用するように Azure Container Storage を構成する方法について説明します。 最後に、Azure マネージド ディスクをストレージとして使用するポッドが得られます。
前提条件
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 リージョンでサポート対象になっているかどうかを確認します。
- Azure Managed Disks で Azure Container Storage を使用するには、汎用 VM (クラスター ノード用に standard_d4s_v5 など) を少なくとも 3 つ用意し、それぞれに仮想 CPU (vCPU) を 4 つ以上を割り当てたノード プールを AKS クラスターに用意する必要があります。
永続ボリュームを作成してアタッチする
次の手順に従って永続ボリュームを作成してアタッチします。
1.ストレージ プールを作成する
まず、YAML マニフェスト ファイルで定義することによって、Kubernetes クラスターのストレージの論理グループであるストレージ プールを作成します。
ストレージ プールを作成するための次のオプションがあります。
- 動的ストレージ プールを作成する
- 事前プロビジョニング済みの Azure マネージド ディスクを使用して事前プロビジョニング済みのストレージ プールを作成する
- 独自の暗号化キーを使って動的ストレージ プールを作成する (オプション)
az aks create
または az aks update
コマンドを使って Azure Container Storage を有効にした場合は、記憶域プールが既に存在している可能性があります。 kubectl get sp -n acstor
を使って記憶域プールの一覧を取得します。 使いたいストレージ プールが既に使用可能な場合は、このステップをスキップして、「使用可能なストレージ クラスを表示する」に進むことができます。
動的ストレージ プールを作成する
次の手順に従って、Azure ディスク用の動的ストレージ プールを作成します。
任意のテキスト エディターを使用して、
code acstor-storagepool.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けます。 ストレージ プールの name の値は何でもかまいません。 skuName には、パフォーマンスと冗長性のレベルを指定します。 使用できる値は、Premium_LRS、Standard_LRS、StandardSSD_LRS、UltraSSD_LRS、Premium_ZRS、PremiumV2_LRS、StandardSSD_ZRS です。 記憶域には、プールの記憶域容量を Gi または Ti で指定します。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: azuredisk namespace: acstor spec: poolType: azureDisk: skuName: Premium_LRS resources: requests: storage: 1Ti
UltraSSD_LRS または PremiumV2_LRS ディスクを使用する場合は、ストレージ プール定義で
IOPSReadWrite
パラメーターとMBpsReadWrite
パラメーターを使用して IOPS とスループットを設定できます。IOPSReadWrite
は、Ultra SSD と Premium v2 LRS ディスクに許容される IOPS 数を表します。 詳細については、「Ultra Disk の IOPS」と「Premium SSD v2 の IOPS」を参照してください。MBpsReadWrite
は、Ultra SSD と Premium v2 LRS ディスクに許容される帯域幅を表します。 MBps とは、1 秒あたり数百万バイト (MB/秒 = 10^6 バイト/秒) を表します。 詳細については、「Ultra Disk のスループット」と「Premium SSD v2 のスループット」を参照してください。apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: azuredisk namespace: acstor spec: poolType: azureDisk: skuName: PremiumV2_LRS iopsReadWrite: 5000 mbpsReadWrite: 200 resources: requests: storage: 1Ti
YAML マニフェスト ファイルを保存してから適用して、ストレージ プールを作成します。
kubectl apply -f acstor-storagepool.yaml
ストレージ プールの作成が完了すると、次のようなメッセージが表示されます。
storagepool.containerstorage.azure.com/azuredisk created
このコマンドを実行して、ストレージ プールの状態を確認することもできます。
<storage-pool-name>
はストレージ プールの name の値に置き換えます。 この例では、値を azuredisk.とします。kubectl describe sp <storage-pool-name> -n acstor
ストレージ プールが作成されると、Azure Container Storage により、名前付け規則 acstor-<storage-pool-name>
を使用してストレージ クラスが自動的に作成されます。 これで、使用できるストレージ クラスを表示し、永続ボリューム要求を作成できるようになりました。
事前にプロビジョニングされたストレージ プールを作成する
既にプロビジョニングされている Azure マネージド ディスクがある場合は、それらのディスクを使って事前にプロビジョニングされたストレージ プールを作成できます。 ディスクは既にプロビジョニングされているため、ストレージ プールの作成時に skuName やストレージ容量を指定する必要はありません。
Azure ディスク用に事前にプロビジョニングされたストレージ プールを作成するには、次の手順に従います。
Azure portal にサインインします。
使うディスクごとに、Azure マネージド ディスクに移動し、[設定]>[プロパティ] を選びます。 [リソース ID] の下の文字列全体をコピーし、テキスト ファイルに配置します。
任意のテキスト エディターを使用して、
code acstor-storagepool.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けます。 ストレージ プールの name の値は何でもかまいません。
<resource-id>
を各マネージド ディスクのリソース ID に置き換えます。 ファイルを保存します。apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: sp-preprovisioned namespace: acstor spec: poolType: azureDisk: disks: - reference <resource-id1> - reference <resource-id2>
YAML マニフェスト ファイルを適用してストレージ プールを作成します。
kubectl apply -f acstor-storagepool.yaml
ストレージ プールの作成が完了すると、次のようなメッセージが表示されます。
storagepool.containerstorage.azure.com/sp-preprovisioned created
このコマンドを実行して、ストレージ プールの状態を確認することもできます。
<storage-pool-name>
はストレージ プールの name の値に置き換えます。 この例の場合、値は sp-preprovisioned になります。kubectl describe sp <storage-pool-name> -n acstor
ストレージ プールが作成されると、Azure Container Storage により、名前付け規則 acstor-<storage-pool-name>
を使用してストレージ クラスが自動的に作成されます。 これで、使用できるストレージ クラスを表示し、永続ボリューム要求を作成できるようになりました。
独自の暗号化キーを使って動的ストレージ プールを作成する (オプション)
Azure Storage アカウント内のすべてのデータは保存時に暗号化されます。 規定では、データは Microsoft のマネージド キーで暗号化されます。 暗号化キーをより詳細に制御するには、ストレージ プールを作成して、作成する永続ボリュームを暗号化するときに、カスタマー マネージド キー (CMK) を指定できます。
サーバー側の暗号化に独自のキーを使うには、Azure Key Vault とキーが必要です。 キー コンテナーの消去保護を有効にする必要があります。また、Azure RBAC アクセス許可モデルを使う必要があります。 詳細については、Linux 上のカスタマー マネージド キーに関する記事を参照してください。
記憶域プールを作成するときは、CMK パラメーターを定義する必要があります。 必要な CMK 暗号化パラメーターは次のとおりです。
- keyVersion には、使うキーのバージョンを指定します
- keyName はキーの名前です
- keyVaultUri は、Azure Key Vault の Uniform Resource Identifier です (たとえば
https://user.vault.azure.net
) - Identity には、コンテナーにアクセスできるマネージド ID を指定します (たとえば
/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourcegroups/MC_user-acstor-westus2-rg_user-acstor-westus2_westus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/user-acstor-westus2-agentpool
)
独自の暗号化キーを使って記憶域プールを作成するには、以下の手順を実行します。 この記憶域プールから作成されるすべての永続ボリュームは、同じキーを使って暗号化されます。
任意のテキスト エディターを使用して、
code acstor-storagepool-cmk.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付け、必要なパラメーターを指定してファイルを保存します。 ストレージ プールの name の値は何でもかまいません。 skuName には、パフォーマンスと冗長性のレベルを指定します。 使用できる値は、Premium_LRS、Standard_LRS、StandardSSD_LRS、UltraSSD_LRS、Premium_ZRS、PremiumV2_LRS、StandardSSD_ZRS です。 記憶域には、プールの記憶域容量を Gi または Ti で指定します。 CMK 暗号化パラメーターは必ず指定してください。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: azuredisk namespace: acstor spec: poolType: azureDisk: skuName: Premium_LRS encryption: { keyVersion: "<key-version>", keyName: "<key-name>", keyVaultUri: "<key-vault-uri>", identity: "<identity>" } resources: requests: storage: 1Ti
YAML マニフェスト ファイルを適用してストレージ プールを作成します。
kubectl apply -f acstor-storagepool-cmk.yaml
ストレージ プールの作成が完了すると、次のようなメッセージが表示されます。
storagepool.containerstorage.azure.com/azuredisk created
このコマンドを実行して、ストレージ プールの状態を確認することもできます。
<storage-pool-name>
はストレージ プールの name の値に置き換えます。 この例では、値を azuredisk.とします。kubectl describe sp <storage-pool-name> -n acstor
ストレージ プールが作成されると、Azure Container Storage により、名前付け規則 acstor-<storage-pool-name>
を使用してストレージ クラスが自動的に作成されます。
2.使用可能なストレージ クラスを表示する
ストレージ プールを使用する準備ができたら、ストレージ クラスを選択して、永続ボリューム要求の作成時と永続ボリュームのデプロイ時にストレージが動的に作成される方式を定義する必要があります。
kubectl get sc
を実行して、使用可能なストレージ クラスを表示します。 acstor-<storage-pool-name>
というストレージ クラスがあることを確認します。
重要
internal が付いているストレージ クラスは使用しないでください。 これは、Azure Container Storage の動作に必要な内部ストレージ クラスです。
3.永続ボリューム要求の作成
永続ボリューム要求 (PVC) を使用して、ストレージ クラスに基づいてストレージを自動的にプロビジョニングします。 新しいストレージ クラスを使用して PVC を作成するには、次の手順に従います。
任意のテキスト エディターを使用して、
code acstor-pvc.yaml
などの YAML マニフェスト ファイルを作成します。次のコードを貼り付けて、ファイルを保存します。 PVC
name
の値はどのような値にもすることができます。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azurediskpvc spec: accessModes: - ReadWriteOnce storageClassName: acstor-azuredisk # replace with the name of your storage class if different resources: requests: storage: 100Gi
YAML マニフェスト ファイルを適用して PVC を作成します。
kubectl apply -f acstor-pvc.yaml
次のような出力が表示されます。
persistentvolumeclaim/azurediskpvc created
次のコマンドを実行して、PVC の状態を確認できます。
kubectl describe pvc azurediskpvc
PVC が作成されると、ポッドで使用できるようになります。
4.ポッドをデプロイして永続ボリュームをアタッチする
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: azurediskpv persistentVolumeClaim: claimName: azurediskpvc containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: azurediskpv
YAML マニフェスト ファイルを適用してポッドをデプロイします。
kubectl apply -f acstor-pod.yaml
次のような出力が表示されます。
pod/fiopod created
ポッドが実行されていること、および永続ボリューム要求がポッドに正常にバインドされていることを確認します。
kubectl describe pod fiopod kubectl describe pvc azurediskpvc
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
Azure ディスクをストレージとして使用するポッドをデプロイし、それを Kubernetes ワークロードに使用できるようになりました。
永続ボリュームとストレージ プールを管理する
永続ボリュームを作成したので、必要に応じてデタッチして再アタッチできます。 ストレージ プールを展開または削除することもできます。
永続ボリュームをデタッチして再アタッチする
永続ボリュームをデタッチするには、永続ボリュームがアタッチされているポッドを削除します。 <pod-name>
はポッドの名前 (fiopod など) に置き換えます。
kubectl delete pods <pod-name>
永続ボリュームを再アタッチするには、「ポッドをデプロイして永続ボリュームをアタッチする」の説明に従って、YAML マニフェスト ファイル内の永続ボリューム要求名を参照するだけです。
永続ボリューム要求がバインドされている永続ボリュームを確認するには、kubectl get pvc <persistent-volume-claim-name>
を実行します。
ストレージ プールを拡張する
Azure Disks によってバックアップされるストレージ プールを拡張して、ダウンタイムなしで迅速にスケールアップできます。 ストレージ プールの縮小は現在サポートされていません。 ストレージ プールの拡張は、Ultra Disks や Premium SSD v2 ではサポートされません。
Note
ストレージ プールを拡張すると、Azure Container Storage と Azure Disks のコストが増加する可能性があります。 Azure コンテナー ストレージの料金ページと、「Azure コンテナー ストレージの課金について理解する」を参照してください。
現時点では、Premium_LRS
、Standard_LRS
、StandardSSD_LRS
、Premium_ZRS
、および StandardSSD_ZRS
SKU を使用するときに、ストレージ プールの拡張に次の制限があります。
- 既存の記憶域プールが 4 TiB (4,096 GiB) 未満の場合は、最大 4,095 GiB まで拡張できます。 エラーを回避するために、現在のストレージ プールが最初に 4 TiB (4,096 GiB) より小さい場合は、4,095 GiB を超えて拡張しないでください。 4 TiB を超えるストレージ プールは、使用可能な最大ストレージ容量まで拡張できます。
Azure Disks の既存のストレージ プールを拡張するには、以下の手順に従います。
テキスト エディターを使って、ストレージ プールの作成に使った YAML マニフェスト ファイル (たとえば
code acstor-storagepool.yaml
) を開きます。YAML マニフェスト ファイル内の指定された storage エントリを目的の値に置き換えます。 この値は、ストレージ プールの現在の容量より大きい必要があります。 たとえば、spec が
storage: 1Ti
に設定されている場合は、それをstorage: 2Ti
に変更します。 事前にプロビジョニングされたストレージ プールを作成した場合、ストレージ プールは事前にプロビジョニングされた Azure ディスクから容量サイズを継承するため、storage エントリは存在しません。 YAML に storage エントリが表示されない場合は、必要なストレージ容量を指定する次のコードを追加し、マニフェスト ファイルを保存します。spec: resources: requests: storage: 2Ti
Note
ストレージ プールに容量がそれぞれ 1 TiB の 2 つのディスクがあり、storage: 4Ti
を読み取るように YAML マニフェスト ファイルを編集した場合、YAML が適用されると両方のディスクが 2 TiB に拡張され、新しい合計容量は 4 TiB になります。
YAML マニフェスト ファイルを適用してストレージ プールを拡張します。
kubectl apply -f acstor-storagepool.yaml
このコマンドを実行して、ストレージ プールの状態を確認します。
<storage-pool-name>
はストレージ プールの name の値に置き換えます。kubectl describe sp <storage-pool-name> -n acstor
"ストレージ プールが拡張中です" のようなメッセージが表示されます。数分後にコマンドを再度実行すると、メッセージは表示されなくなります。
kubectl get sp -A
を実行すると、ストレージ プールに新しいサイズが反映されます。
ストレージ プールを削除する
ストレージ プールを削除する場合は、次のコマンドを実行します。 <storage-pool-name>
はストレージ プール名に置き換えます。
kubectl delete sp -n acstor <storage-pool-name>