Azure Kubernetes Service (AKS) で Azure ディスクを使用してボリュームを作成して使用する
永続ボリュームとは、Kubernetes ポッドで使用するためにプロビジョニングされているストレージの一部です。 永続ボリュームは 1 つまたは複数のポッドで使用でき、動的または静的にプロビジョニングできます。 この記事では、Azure Disks の永続ボリュームを Azure Kubernetes Service (AKS) クラスターで動的に作成する方法について説明します。
Note
Azure ディスクは、"アクセス モード" の種類を ReadWriteOnce としてのみマウントでき、この場合、ディスクの利用は、AKS 内の 1 ノードに限られます。 このアクセス モードでは、ポッドが同じノードで実行されている場合でも、複数のポッドがボリュームにアクセスできます。 詳しくは、「Kubernetes PersistentVolume アクセス モード」をご覧ください。
この記事で取り上げるテクニック:
- 動的永続ボリューム (PV) を使用するには、Container Storage Interface (CSI) ドライバーをインストールし、1 つ以上の Azure マネージド ディスクを動的に作成してポッドに接続します。
- 静的 PV を使用するには、1 つ以上の Azure マネージド ディスクを作成するか、既存の Azure マネージド ディスクを使用し、そのディスクをポッドに接続します。
Kubernetes ボリュームの詳細については、AKS でのアプリケーションのストレージ オプションに関するページを参照してください。
開始する前に
Azure CLI バージョン 2.0.59 以降がインストールされ、構成されていることを確認してください。 バージョンを確認するには、
az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。Azure Disk CSI ドライバーには、ノードあたりのボリューム制限があります。 ボリューム数は、ノード/ノード プールのサイズに基づいて変わります。 kubectl get コマンドを実行して、ノードごとに割り当てることができるボリュームの数を確認します。
kubectl get CSINode <nodename> -o yaml
ノードごとのボリューム制限がワークロードの問題である場合は、CSI ドライバーではなく永続ボリュームに Azure コンテナー ストレージを使用することを検討してください。
ボリュームを動的にプロビジョニングする
このセクションでは、1 つ以上の永続ボリュームをプロビジョニングするクラスター管理者向けのガイダンス (ワークロードで使用する Azure Disk Storage の詳細を含む) を提供します。 永続ボリューム要求 (PVC) では、ストレージ クラス オブジェクトが使用され、Azure Disk Storage コンテナーが動的にプロビジョニングされます。
動的 PersistentVolumes のストレージ クラス パラメータ
次の表には、PersistentVolumeClaim のカスタム ストレージ クラスを定義するために使用できるパラメータが含まれています。
名前 | 意味 | 使用できる値 | Mandatory | 既定値 |
---|---|---|---|---|
skuName | Azure Disk ストレージ アカウントの種類 (別名: storageAccountType ) |
Standard_LRS 、Premium_LRS 、StandardSSD_LRS 、PremiumV2_LRS 、UltraSSD_LRS 、Premium_ZRS 、StandardSSD_ZRS |
いいえ | StandardSSD_LRS |
fsType | ファイル システムの種類 | ext4 、ext3 、ext2 、xfs 、btrfs (Linux の場合)、ntfs (Windows の場合) |
いいえ | ext4 (Linux の場合)、ntfs (Windows の場合) |
cachingMode | Azure Data Disk Host Cache 設定 (PremiumV2_LRS と UltraSSD_LRS は None キャッシュ モードしかサポートしていません) |
None 、ReadOnly 、ReadWrite |
いいえ | ReadOnly |
resourceGroup | Azure Disks のリソース グループを指定します | 既存のリソース グループ名 | いいえ | 空の場合、ドライバーでは、現在の AKS クラスターと同じリソース グループ名が使われます |
DiskIOPSReadWrite | UltraSSD ディスクまたは Premium SSD v2 IOPS 機能 (最小: 2 IOPS/GiB) | 100 から 160000 | いいえ | 500 |
DiskMBpsReadWrite | UltraSSD ディスクまたは Premium SSD v2 スループット機能 (最小: 0.032/GiB) | 1 から 2000 | いいえ | 100 |
LogicalSectorSize | Ultra ディスクの論理セクター サイズ (バイト単位)。 サポートされている値は 512 と 4096 です。 既定値は 4096 です。 | 512 、4096 |
いいえ | 4096 |
tags | Azure Disk タグ | タグの形式: key1=val1,key2=val2 |
いいえ | "" |
diskEncryptionSetID | 保存時の暗号化を有効にするために使用するディスク暗号化セットの ResourceId | 形式: /subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} |
いいえ | "" |
diskEncryptionType | ディスク暗号化セットの暗号化の種類。 | EncryptionAtRestWithCustomerKey (既定)、EncryptionAtRestWithPlatformAndCustomerKeys |
いいえ | "" |
writeAcceleratorEnabled | Azure ディスク上の書き込みアクセラレータ | true 、false |
いいえ | "" |
networkAccessPolicy | ディスクまたはスナップショットの SAS URI の生成を妨げるための NetworkAccessPolicy プロパティ | AllowAll 、DenyAll 、AllowPrivate |
いいえ | AllowAll |
diskAccessID | ディスク上のプライベート エンドポイントを使用するための DiskAccess リソースの Azure リソース ID | いいえ | `` | |
enableBursting | ディスクのプロビジョニングされたパフォーマンス ターゲットを超えてオンデマンド バーストを有効にします。 オンデマンド バーストは、Premium ディスクに、ディスク サイズが 512 GB より大きい場合にのみ適用する必要があります。 Ultra ディスクと共有ディスクはサポートされていません。 バーストは既定で無効になっています。 | true 、false |
いいえ | false |
useragent | 顧客の使用状況属性に使用されるユーザー エージェント | いいえ | driverName/driverVersion compiler/version (OS-ARCH) の形式の生成された Useragent |
|
subscriptionID | Azure ディスクを作成する Azure サブスクリプション ID を指定します。 | Azure サブスクリプション ID | いいえ | 空でない場合は、resourceGroup を指定する必要があります。 |
--- | 次のパラメーターは v2 専用です | --- | --- | --- |
maxShares | ディスクに対して許可する共有ディスク マウントの合計数。 値を 2 以上に設定すると、接続レプリカが有効になります。 | サポートされる値は、ディスク サイズによって異なります。 サポートされる値については、「Azure マネージド ディスクの共有」を参照してください。 | いいえ | 1 |
maxMountReplicaCount | 保持するレプリカ接続の数。 | この値は、[0..(maxShares - 1)] の範囲内にする必要があります |
いいえ | accessMode が ReadWriteMany の場合、既定値は 0 です。 それ以外の場合、既定値は maxShares - 1 です |
組み込みストレージ クラス
ストレージ クラスは、保存の単位を永続ボリュームを使用して動的に作成する方法を定義します。 Kubernetes ストレージ クラスの詳細については、Kubernetes ストレージ クラスに関する記事を参照してください。
各 AKS クラスターには 4 つの事前作成されたストレージ クラスが含まれ、そのうち 2 つが Azure ディスクで動作するように構成されています。
- default ストレージ クラスは、Standard SSD Azure ディスクをプロビジョニングします。
- Standard ストレージでは、Standard SDD が使用されており、信頼性の高いパフォーマンスを実現しながらコスト効率にも優れたストレージを提供します。
- managed-csi-premium ストレージ クラスは、Premium Azure ディスクをプロビジョニングします。
- Premium ディスクでは、SSD ベースの高性能で待ち時間の短いディスクが使用されています。 運用ワークロードを実行している VM に最適です。 AKS で Azure Disk CSI ドライバーを使用する場合は、Standard SSD ローカル冗長ストレージ (LRS) によってサポートされる
managed-csi
ストレージ クラスを使用することもできます。
- Premium ディスクでは、SSD ベースの高性能で待ち時間の短いディスクが使用されています。 運用ワークロードを実行している VM に最適です。 AKS で Azure Disk CSI ドライバーを使用する場合は、Standard SSD ローカル冗長ストレージ (LRS) によってサポートされる
- Kubernetes バージョン 1.29 以降では、複数の可用性ゾーンに Azure Kubernetes Service (AKS) クラスターをデプロイすると、AKS はゾーン冗長ストレージ (ZRS) を利用して、組み込みのストレージ クラス内にマネージド ディスクを作成します。
- ZRS により、ユーザーが選んだリージョン内の複数の Azure 可用性ゾーン間での Azure マネージド ディスクの同期レプリケーションが保証されます。 この冗長性戦略により、アプリケーションの回復性が強化され、データセンターの障害からデータが保護されます。
- ただし、ゾーン冗長ストレージ (ZRS) は、ローカル冗長ストレージ (LRS) と比べてコストが高くなる点に注意してください。 コストの最適化が優先される場合は、LRS SKU 名パラメーターを使用して新しいストレージ クラスを作成し、それを永続ボリューム要求で使用できます。
データ損失のリスクがあるため、PVC のサイズの縮小はサポートされていません。 kubectl edit sc
コマンドを使用して既存のストレージ クラスを編集することも、独自のカスタム ストレージ クラスを作成することもできます。 たとえば、サイズ 4 TiB のディスクを使用する場合、サイズ 4 TiB 以上ではディスク キャッシュがサポートされないため、cachingmode: None
を定義するストレージ クラスを作成する必要があります。 ストレージ クラスと独自のストレージ クラスの作成の詳細については、AKS でのアプリケーションのストレージ オプションに関するページを参照してください。
kubectl get sc
コマンドを使用して、事前に作成されたストレージ クラスを確認できます。 次の例は、AKS クラスター内で使用できる事前に作成されたストレージ クラスを示したものです。
kubectl get sc
コマンドの出力は、次の例のようになります。
NAME PROVISIONER AGE
default (default) disk.csi.azure.com 1h
managed-csi disk.csi.azure.com 1h
Note
固定ボリュームの要求は GiB 単位で指定されますが、Azure Managed Disks は SKU の特定のサイズによって課金されます。 これらの SKU の範囲は、S4 または P4 ディスクの 32 GiB から、S80 または P80 ディスクの 32 TiB までです (プレビュー中)。 Premium 管理ディスクのスループットと IOPS パフォーマンスは、SKU と AKS クラスターのノードのインスタンスのサイズに依存します。 詳細については、マネージド ディスクの価格とパフォーマンスに関するページを参照してください。
永続ボリューム要求の作成
永続ボリューム要求は、ストレージ クラスに基づいてストレージを自動的にプロビジョニングします。 この場合、PVC は、事前作成されているストレージ クラスのいずれかを使用して、標準のまたはプレミアムな Azure マネージド ディスクを作成できます。
azure-pvc.yaml
という名前のファイルを作成し、そこに次のマニフェストをコピーします。 この要求では、サイズが 5 GB で ReadWriteOnce アクセスがあるazure-managed-disk
という名前のディスクを要求します。 ストレージ クラスとして、managed-csi ストレージ クラスが指定されます。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azure-managed-disk spec: accessModes: - ReadWriteOnce storageClassName: managed-csi resources: requests: storage: 5Gi
ヒント
プレミアム ストレージを使用するディスクを作成するには、managed-csi ではなく、storageClassName: managed-csi-premium
を使用します。
kubectl apply
コマンドを使用して、azure-pvc.yaml ファイルを指定することで、永続ボリューム要求を作成します。kubectl apply -f azure-pvc.yaml
コマンドの出力は、次の例のようになります。
persistentvolumeclaim/azure-managed-disk created
永続ボリュームの使用
永続ボリューム要求を作成した後、状態が Pending
であることを確認する必要があります。 Pending
状態は、ポッドで使用する準備ができていることを示します。
kubectl describe pvc
コマンドを使用して、PVC の状態を確認します。kubectl describe pvc azure-managed-disk
コマンドの出力は、次の抜粋した例のようになります。
Name: azure-managed-disk Namespace: default StorageClass: managed-csi Status: Pending [...]
azure-pvc-disk.yaml
という名前のファイルを作成し、そこに次のマニフェストをコピーします。 このマニフェストは、azure-managed-disk という名前の永続ボリューム要求を使って/mnt/azure
パスに Azure ディスクをマウントする基本的な NGINX ポッドを作成します。 Windows Server コンテナーの場合、 'D:' などの Windows パス規則を使用して mountPath を指定します。kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - mountPath: "/mnt/azure" name: volume readOnly: false volumes: - name: volume persistentVolumeClaim: claimName: azure-managed-disk
kubectl apply
コマンドを使用してポッドを作成します。kubectl apply -f azure-pvc-disk.yaml
コマンドの出力は、次の例のようになります。
pod/mypod created
これで Azure ディスクが
/mnt/azure
ディレクトリにマウントされ、ポッドが稼働状態となりました。kubectl describe
コマンドを使用してポッドの構成を確認します。kubectl describe pod mypod
コマンドの出力は、次の例のようになります。
[...] Volumes: volume: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: azure-managed-disk ReadOnly: false default-token-smm2n: Type: Secret (a volume populated by a Secret) SecretName: default-token-smm2n Optional: false [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m default-scheduler Successfully assigned mypod to aks-nodepool1-79590246-0 Normal SuccessfulMountVolume 2m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "default-token-smm2n" Normal SuccessfulMountVolume 1m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242" [...]
Azure Ultra Disks を使用する
Azure Ultra ディスクの使用については、Azure Kubernetes Service (AKS) での Ultra ディスクの使用に関するページを参照してください。
Azure タグの使用
Azure タグの使用の詳細については、「Azure Kubernetes Service (AKS) での Azure タグの使用」を参照してください。
ボリュームを静的にプロビジョニングする
このセクションでは、1 つ以上の永続ボリュームを作成するクラスター管理者向けのガイダンス (ワークロードで使用する Azure Disk の詳細を含む) を提供します。
永続ボリュームの静的プロビジョニング パラメーター
次の表には、永続ボリュームを定義するために使用できるパラメーターが含まれています。
名前 | 意味 | 使用できる値 | Mandatory | 既定値 |
---|---|---|---|---|
volumeHandle | Azure ディスク URI | /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} |
はい | 該当なし |
volumeAttributes.fsType | ファイル システムの種類 | ext4 、ext3 、ext2 、xfs 、btrfs (Linux の場合)、ntfs (Windows の場合) |
いいえ | ext4 (Linux の場合)、ntfs (Windows の場合) |
volumeAttributes.partition | 既存のディスクのパーティション番号 (Linux でのみサポート) | 1 、2 、3 |
いいえ | 空 (パーティションなし) - パーティション形式が -part1 のような形式であることを確認します |
volumeAttributes.cachingMode | ディスク ホスト キャッシュの設定 | None 、ReadOnly 、ReadWrite |
いいえ | ReadOnly |
Azure ディスクを作成する
AKS で使用するための Azure ディスクを作成する場合は、ノード リソース グループ内にディスク リソースを作成することができます。 この方法により、AKS クラスターがディスク リソースにアクセスおよび管理できるようになります。 代わりに独立したリソース グループにディスクを作成する場合は、クラスターの Azure Kubernetes Service (AKS) マネージド ID に、ディスクのリソース グループに対する Contributor
ロールを付与する必要があります。
az aks show
コマンドを使用してリソース グループ名を識別し、--query nodeResourceGroup
パラメーターを追加します。az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
コマンドの出力は、次の例のようになります。
MC_myResourceGroup_myAKSCluster_eastus
az disk create
コマンドを使用してディスクを作成します。 ノードのリソース グループ名を指定して、そのディスク リソースに対して、myAKSDisk などの名前を指定します。 次の例では、20 GiB のディスクを作成し、作成後にそのディスクの ID を出力します。 Windows Server コンテナーで使用するディスクを作成する必要がある場合は、--os-type windows
パラメーターを追加して、ディスクを適切にフォーマットします。az disk create \ --resource-group MC_myResourceGroup_myAKSCluster_eastus \ --name myAKSDisk \ --size-gb 20 \ --query id --output tsv
Note
Azure ディスクは、特定サイズの SKU 単位で課金されます。 これらの SKU の範囲は、S4 または P4 ディスクの 32 GiB から、S80 または P80 ディスクの 32 TiB までです (プレビュー中)。 Premium 管理ディスクのスループットと IOPS パフォーマンスは、SKU と AKS クラスターのノードのインスタンスのサイズに依存します。 「Managed Disks の価格 」を参照してください。
次の出力例に示すように、コマンドが正常に完了すると、ディスク リソース ID が表示されます。 このディスク ID は、次のセクションでディスクをマウントするために使用します。
/subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
ディスクをボリュームとしてマウントする
PersistentVolume を使用して pv-azuredisk.yaml ファイルを作成します。 前の手順のディスク リソース ID で更新
volumeHandle
します。 Windows Server コンテナーの場合は、パラメータ fsType に ntfs を指定します。apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: disk.csi.azure.com name: pv-azuredisk spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: managed-csi csi: driver: disk.csi.azure.com volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk volumeAttributes: fsType: ext4
PersistentVolume を使用する PersistentVolumeClaim を使って pvc-azuredisk.yaml ファイルを作成します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-azuredisk spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi volumeName: pv-azuredisk storageClassName: managed-csi
kubectl apply
コマンドを使用して PersistentVolume と PersistentVolumeClaim を作成し、作成した 2 つの YAML ファイルを参照します。kubectl apply -f pv-azuredisk.yaml kubectl apply -f pvc-azuredisk.yaml
kubectl get pvc
コマンドを使用して、PersistentVolumeClaim が作成され、PersistentVolume にバインドされていることを確認します。kubectl get pvc pvc-azuredisk
コマンドの出力は、次の例のようになります。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-azuredisk Bound pv-azuredisk 20Gi RWO 5s
PersistentVolumeClaim を参照するように azure-disk-pod.yaml ファイルを作成します。 Windows Server コンテナーの場合、 'D:' などの Windows パス規則を使用して mountPath を指定します。
apiVersion: v1 kind: Pod metadata: name: mypod spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure volumes: - name: azure persistentVolumeClaim: claimName: pvc-azuredisk
構成を適用し、
kubectl apply
コマンドを使用してボリュームをマウントします。kubectl apply -f azure-disk-pod.yaml
リソースをクリーンアップする
この記事で作成したリソースを使い終えたら、kubectl delete
コマンドを使用してリソースを削除できます。
# Remove the pod
kubectl delete -f azure-pvc-disk.yaml
# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml
次の手順
- Azure Disk Storage に CSI ドライバーを使用する方法については、CSI ドライバーでの Azure Disk Storage の使用に関するページを参照してください。
- 関連するベスト プラクティスについては、AKS のストレージとバックアップに関するベスト プラクティスに関する記事を参照してください。
Azure Kubernetes Service