Azure Kubernetes Service (AKS) 上で Azure ディスクを含む永続ボリュームを動的に作成して使用するDynamically create and use a persistent volume with Azure disks in Azure Kubernetes Service (AKS)

永続ボリュームとは、Kubernetes ポッドで使用するためにプロビジョニングされているストレージの一部です。A persistent volume represents a piece of storage that has been provisioned for use with Kubernetes pods. 永続ボリュームは 1 つまたは複数のポッドで使用でき、動的または静的にプロビジョニングできます。A persistent volume can be used by one or many pods, and can be dynamically or statically provisioned. この記事では、Azure Kubernetes Service (AKS) クラスター内の単一のポッドによって使用するために Azure ディスクの永続ボリュームを動的に作成する方法を説明します。This article shows you how to dynamically create persistent volumes with Azure disks for use by a single pod in an Azure Kubernetes Service (AKS) cluster.

注意

Azure ディスクは、"アクセス モード" の種類を ReadWriteOnce としてのみマウントでき、この場合、ディスクの利用は、AKS 内の 1 ノードに限られます。An Azure disk can only be mounted with Access mode type ReadWriteOnce, which makes it available to one node in AKS. 複数のノード間で永続的なボリュームを共有する必要がある場合は、Azure Files を使用してください。If you need to share a persistent volume across multiple nodes, use Azure Files.

Kubernetes ボリュームの詳細については、AKS でのアプリケーションのストレージ オプションに関するページを参照してください。For more information on Kubernetes volumes, see Storage options for applications in AKS.

開始する前にBefore you begin

この記事は、AKS クラスターがすでに存在していることを前提としています。This article assumes that you have an existing AKS cluster. AKS クラスターが必要な場合は、Azure CLI を使用した場合または Azure portal を使用した場合の AKS のクイックスタートを参照してください。If you need an AKS cluster, see the AKS quickstart using the Azure CLI or using the Azure portal.

また、Azure CLI バージョン 2.0.59 以降がインストールされ、構成されている必要もあります。You also need the Azure CLI version 2.0.59 or later installed and configured. バージョンを確認するには、az --version を実行します。Run az --version to find the version. インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。If you need to install or upgrade, see Install Azure CLI.

組み込みストレージ クラスBuilt-in storage classes

ストレージ クラスは、保存の単位を永続ボリュームを使用して動的に作成する方法を定義します。A storage class is used to define how a unit of storage is dynamically created with a persistent volume. Kubernetes ストレージ クラスについて詳しくは、Kubernetes ストレージ クラスに関するページをご覧ください。For more information on Kubernetes storage classes, see Kubernetes Storage Classes.

各 AKS クラスターには 4 つの事前作成されたストレージ クラスが含まれ、そのうち 2 つが Azure ディスクで動作するように構成されています。Each AKS cluster includes four pre-created storage classes, two of them configured to work with Azure disks:

  • default ストレージ クラスは、標準の SSD Azure ディスクをプロビジョニングします。The default storage class provisions a standard SSD Azure disk.
    • Standard ストレージでは、Standard SDD が使用されており、信頼性の高いパフォーマンスを実現しながらコスト効率にも優れたストレージを提供します。Standard storage is backed by Standard SSDs and delivers cost-effective storage while still delivering reliable performance.
  • managed-premium ストレージ クラスは、プレミアムな Azure ディスクをプロビジョニングします。The managed-premium storage class provisions a premium Azure disk.
    • Premium ディスクは、SSD ベースの高性能で待機時間の短いディスクによってサポートされています。Premium disks are backed by SSD-based high-performance, low-latency disk. 実稼働ワークロードを実行する VM に最適です。Perfect for VMs running production workload. クラスター内の AKS ノードでプレミアム ストレージを使用する場合は、managed-premium クラスを選択します。If the AKS nodes in your cluster use premium storage, select the managed-premium class.

既定のストレージ クラスの 1 つを使用している場合、ストレージ クラスの作成後、ボリューム サイズを更新することはできません。If you use one of the default storage classes, you can't update the volume size after the storage class is created. ストレージ クラスの作成後にボリューム サイズを更新できるようにするには、既定のストレージ クラスの 1 つに行 allowVolumeExpansion: true を追加します。あるいは、独自のカスタム ストレージ クラスを作成できます。To be able to update the volume size after a storage class is created, add the line allowVolumeExpansion: true to one of the default storage classes, or you can create you own custom storage class. (データの損失を防ぐための) PVC のサイズの縮小はサポートされていないことに注意してください。Note that it's not supported to reduce the size of a PVC (to prevent data loss). kubectl edit sc コマンドを使用して既存のストレージ クラスを編集できます。You can edit an existing storage class by using the kubectl edit sc command.

たとえば、サイズ 4 TiB のディスクを使用する場合、サイズ 4 TiB 以上ではディスク キャッシュがサポートされないため、cachingmode: None を定義するストレージ クラスを作成する必要があります。For example, if you want to use a disk of size 4 TiB, you must create a storage class that defines cachingmode: None because disk caching isn't supported for disks 4 TiB and larger.

ストレージ クラスと独自のストレージ クラスの作成の詳細については、AKS でのアプリケーションのストレージ オプションに関するページを参照してください。For more information about storage classes and creating your own storage class, see Storage options for applications in AKS.

事前作成されているストレージ クラスを確認するには、kubectl get sc コマンドを使用します。Use the kubectl get sc command to see the pre-created storage classes. 次の例は、AKS クラスター内で使用できる事前に作成されたストレージ クラスを示したものです。The following example shows the pre-create storage classes available within an AKS cluster:

$ kubectl get sc

NAME                PROVISIONER                AGE
default (default)   kubernetes.io/azure-disk   1h
managed-premium     kubernetes.io/azure-disk   1h

注意

固定ボリュームの要求は GiB 単位で指定されますが、Azure Managed Disks は SKU の特定のサイズによって課金されます。Persistent volume claims are specified in GiB but Azure managed disks are billed by SKU for a specific size. これらの SKU の範囲は、S4 または P4 ディスクの 32 GiB から、S80 または P80 ディスクの 32 TiB までです (プレビュー中)。These SKUs range from 32GiB for S4 or P4 disks to 32TiB for S80 or P80 disks (in preview). Premium 管理ディスクのスループットと IOPS パフォーマンスは、SKU と AKS クラスターのノードのインスタンスのサイズに依存します。The throughput and IOPS performance of a Premium managed disk depends on the both the SKU and the instance size of the nodes in the AKS cluster. 詳細については、Managed Disks の価格とパフォーマンスに関するページを参照してください。For more information, see Pricing and Performance of Managed Disks.

永続ボリューム要求の作成Create a persistent volume claim

永続ボリューム要求 (PVC) を使用して、ストレージ クラスに基づいてストレージを自動的にプロビジョニングします。A persistent volume claim (PVC) is used to automatically provision storage based on a storage class. この場合、PVC は、事前作成されているストレージ クラスのいずれかを使用して、標準のまたはプレミアムな Azure マネージド ディスクを作成できます。In this case, a PVC can use one of the pre-created storage classes to create a standard or premium Azure managed disk.

azure-premium.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。Create a file named azure-premium.yaml, and copy in the following manifest. 要求は、サイズが 5GBReadWriteOnce アクセスがある azure-managed-disk という名前のディスクを要求します。The claim requests a disk named azure-managed-disk that is 5GB in size with ReadWriteOnce access. ストレージ クラスとして、managed-premium ストレージ クラスが指定されます。The managed-premium storage class is specified as the storage class.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: azure-managed-disk
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: managed-premium
  resources:
    requests:
      storage: 5Gi

ヒント

Standard ストレージを使用するディスクを作成するには、managed-premium ではなく、storageClassName: default を使用します。To create a disk that uses standard storage, use storageClassName: default rather than managed-premium.

kubectl apply コマンドを使用して、azure-premium.yaml ファイルを指定することで、永続ボリューム要求を作成します。Create the persistent volume claim with the kubectl apply command and specify your azure-premium.yaml file:

$ kubectl apply -f azure-premium.yaml

persistentvolumeclaim/azure-managed-disk created

永続ボリュームの使用Use the persistent volume

永続ボリューム要求が作成され、ディスクが正常にプロビジョニングされると、ディスクへのアクセスを使ってポッドを作成できます。Once the persistent volume claim has been created and the disk successfully provisioned, a pod can be created with access to the disk. 次のマニフェストは、azure-managed-disk という名前の永続ボリューム要求を使って /mnt/azure パスに Azure ディスクをマウントする基本的な NGINX ポッドを作成します。The following manifest creates a basic NGINX pod that uses the persistent volume claim named azure-managed-disk to mount the Azure disk at the path /mnt/azure. Windows Server コンテナーの場合、 'D:' などの Windows パス規則を使用して mountPath を指定します。For Windows Server containers, specify a mountPath using the Windows path convention, such as 'D:'.

azure-pvc-disk.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。Create a file named azure-pvc-disk.yaml, and copy in the following manifest.

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
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: azure-managed-disk

次の例に示すように kubectl apply コマンドを使用してポッドを作成します。Create the pod with the kubectl apply command, as shown in the following example:

$ kubectl apply -f azure-pvc-disk.yaml

pod/mypod created

これで Azure ディスクが /mnt/azure ディレクトリにマウントされ、ポッドが稼働状態となりました。You now have a running pod with your Azure disk mounted in the /mnt/azure directory. 次の例に示すように、kubectl describe pod mypod でポッドを検査するときに、この構成を確認できます。This configuration can be seen when inspecting your pod via kubectl describe pod mypod, as shown in the following condensed example:

$ 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"
[...]

Ultra ディスクの使用Use Ultra Disks

Ultra ディスクの利用については、Azure Kubernetes Service (AKS) での Ultra ディスクの使用に関するページを参照してください。To leverage ultra disk see Use Ultra Disks on Azure Kubernetes Service (AKS).

永続ボリュームのバックアップBack up a persistent volume

永続ボリュームのデータをバックアップするには、ボリュームのマネージド ディスクのスナップショットを取得します。To back up the data in your persistent volume, take a snapshot of the managed disk for the volume. その後、このスナップショットを使用して復元されたディスクを作成し、データを復元するための手段としてポッドにアタッチできます。You can then use this snapshot to create a restored disk and attach to pods as a means of restoring the data.

最初に、kubectl get pvc コマンドで、ボリューム名を取得します (例: azure-managed-disk という名前の PVC)。First, get the volume name with the kubectl get pvc command, such as for the PVC named azure-managed-disk:

$ kubectl get pvc azure-managed-disk

NAME                 STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
azure-managed-disk   Bound     pvc-faf0f176-8b8d-11e8-923b-deb28c58d242   5Gi        RWO            managed-premium   3m

このボリューム名は、基になる Azure ディスクの名前を形成します。This volume name forms the underlying Azure disk name. 次の例に示すように、az disk list で、PVC ボリューム名を指定して、ディスク ID のクエリを実行します。Query for the disk ID with az disk list and provide your PVC volume name, as shown in the following example:

$ az disk list --query '[].id | [?contains(@,`pvc-faf0f176-8b8d-11e8-923b-deb28c58d242`)]' -o tsv

/subscriptions/<guid>/resourceGroups/MC_MYRESOURCEGROUP_MYAKSCLUSTER_EASTUS/providers/MicrosoftCompute/disks/kubernetes-dynamic-pvc-faf0f176-8b8d-11e8-923b-deb28c58d242

az snapshot create で、ディスク ID を使用してスナップショット ディスクを作成します。Use the disk ID to create a snapshot disk with az snapshot create. 次の例では、pvcSnapshot という名前のスナップショットを、AKS クラスターと同じリソース グループ (MC_myResourceGroup_myAKSCluster_eastus) 内に作成します。The following example creates a snapshot named pvcSnapshot in the same resource group as the AKS cluster (MC_myResourceGroup_myAKSCluster_eastus). AKS クラスターがアクセスできないリソース グループ内にスナップショットを作成してディスクを復元する場合、アクセス許可の問題が発生する可能性があります。You may encounter permission issues if you create snapshots and restore disks in resource groups that the AKS cluster does not have access to.

$ az snapshot create \
    --resource-group MC_myResourceGroup_myAKSCluster_eastus \
    --name pvcSnapshot \
    --source /subscriptions/<guid>/resourceGroups/MC_myResourceGroup_myAKSCluster_eastus/providers/MicrosoftCompute/disks/kubernetes-dynamic-pvc-faf0f176-8b8d-11e8-923b-deb28c58d242

ディスク上のデータ量によっては、スナップショットを作成するまで数分かかる場合があります。Depending on the amount of data on your disk, it may take a few minutes to create the snapshot.

復元とスナップショットの使用Restore and use a snapshot

ディスクを復元して Kubernetes ポッドで使用するには、az disk create でディスクを作成するときに、ソースとしてスナップショットを使用します。To restore the disk and use it with a Kubernetes pod, use the snapshot as a source when you create a disk with az disk create. この操作では、元のデータのスナップショットにアクセスする必要がある場合に備えて、元のリソースが保持されます。This operation preserves the original resource if you then need to access the original data snapshot. 次の例は、pvcSnapshot という名前のスナップショットから、pvcRestored という名前のディスクを作成します。The following example creates a disk named pvcRestored from the snapshot named pvcSnapshot:

az disk create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name pvcRestored --source pvcSnapshot

復元されたディスクをポッドで使用するには、ディスク ID をマニフェスト内に指定します。To use the restored disk with a pod, specify the ID of the disk in the manifest. az disk show コマンドで、ディスク ID を取得します。Get the disk ID with the az disk show command. 次の例では、前の手順で作成した pvcRestored のディスク ID を取得します。The following example gets the disk ID for pvcRestored created in the previous step:

az disk show --resource-group MC_myResourceGroup_myAKSCluster_eastus --name pvcRestored --query id -o tsv

azure-restored.yaml という名前のポッド マニフェストを作成し、前の手順で取得したディスクの URI を指定します。Create a pod manifest named azure-restored.yaml and specify the disk URI obtained in the previous step. 次の例では、 /mnt/azure にボリュームとしてマウントされた復元ディスクを使用して、基本的な NGINX Web サーバーを作成します。The following example creates a basic NGINX web server, with the restored disk mounted as a volume at /mnt/azure:

kind: Pod
apiVersion: v1
metadata:
  name: mypodrestored
spec:
  containers:
  - name: mypodrestored
    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
  volumes:
    - name: volume
      azureDisk:
        kind: Managed
        diskName: pvcRestored
        diskURI: /subscriptions/<guid>/resourceGroups/MC_myResourceGroupAKS_myAKSCluster_eastus/providers/Microsoft.Compute/disks/pvcRestored

次の例に示すように kubectl apply コマンドを使用してポッドを作成します。Create the pod with the kubectl apply command, as shown in the following example:

$ kubectl apply -f azure-restored.yaml

pod/mypodrestored created

kubectl describe pod mypodrestored を使用して、ボリューム情報を表示するポッドの詳細を表示できます (次に示すのは抜粋された情報の例です)。You can use kubectl describe pod mypodrestored to view details of the pod, such as the following condensed example that shows the volume information:

$ kubectl describe pod mypodrestored

[...]
Volumes:
  volume:
    Type:         AzureDisk (an Azure Data Disk mount on the host and bind mount to the pod)
    DiskName:     pvcRestored
    DiskURI:      /subscriptions/19da35d3-9a1a-4f3b-9b9c-3c56ef409565/resourceGroups/MC_myResourceGroupAKS_myAKSCluster_eastus/providers/Microsoft.Compute/disks/pvcRestored
    Kind:         Managed
    FSType:       ext4
    CachingMode:  ReadWrite
    ReadOnly:     false
[...]

次のステップNext steps

関連するベスト プラクティスについては、AKS のストレージとバックアップに関するベスト プラクティスに関する記事を参照してください。For associated best practices, see Best practices for storage and backups in AKS.

Azure ディスクを使った Kubernetes 永続ボリュームについて、さらに詳しい情報を確認します。Learn more about Kubernetes persistent volumes using Azure disks.