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
    

ボリュームを動的にプロビジョニングする

このセクションでは、1 つ以上の永続ボリュームをプロビジョニングするクラスター管理者向けのガイダンス (ワークロードで使用する Azure Disk Storage の詳細を含む) を提供します。 永続ボリューム要求 (PVC) では、ストレージ クラス オブジェクトが使用され、Azure Disk Storage コンテナーが動的にプロビジョニングされます。

動的 PersistentVolumes のストレージ クラス パラメータ

次の表には、PersistentVolumeClaim のカスタム ストレージ クラスを定義するために使用できるパラメータが含まれています。

名前 意味 使用できる値 Mandatory 既定値
skuName Azure Disk ストレージ アカウントの種類 (別名: storageAccountType) Standard_LRSPremium_LRSStandardSSD_LRSPremiumV2_LRSUltraSSD_LRSPremium_ZRSStandardSSD_ZRS いいえ StandardSSD_LRS
fsType ファイル システムの種類 ext4ext3ext2xfsbtrfs (Linux の場合)、ntfs (Windows の場合) いいえ ext4 (Linux の場合)、ntfs (Windows の場合)
cachingMode Azure データ ディスク ホスト キャッシュの設定 NoneReadOnlyReadWrite いいえ 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 です。 5124096 いいえ 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 ディスク上の書き込みアクセラレータ truefalse いいえ ""
networkAccessPolicy ディスクまたはスナップショットの SAS URI の生成を妨げるための NetworkAccessPolicy プロパティ AllowAllDenyAllAllowPrivate いいえ AllowAll
diskAccessID ディスク上のプライベート エンドポイントを使用するための DiskAccess リソースの Azure リソース ID いいえ ``
enableBursting ディスクのプロビジョニングされたパフォーマンス ターゲットを超えてオンデマンド バーストを有効にします。 オンデマンド バーストは、Premium ディスクに、ディスク サイズが 512 GB より大きい場合にのみ適用する必要があります。 Ultra ディスクと共有ディスクはサポートされていません。 バーストは既定で無効になっています。 truefalse いいえ 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)] の範囲内にする必要があります いいえ accessModeReadWriteMany の場合、既定値は 0 です。 それ以外の場合、既定値は maxShares - 1 です

組み込みストレージ クラス

ストレージ クラスは、保存の単位を永続ボリュームを使用して動的に作成する方法を定義します。 Kubernetes ストレージ クラスの詳細については、Kubernetes ストレージ クラスに関する記事を参照してください。

各 AKS クラスターには 4 つの事前作成されたストレージ クラスが含まれ、そのうち 2 つが Azure ディスクで動作するように構成されています。

  1. default ストレージ クラスは、Standard SSD Azure ディスクをプロビジョニングします。
    • Standard ストレージでは、Standard SDD が使用されており、信頼性の高いパフォーマンスを実現しながらコスト効率にも優れたストレージを提供します。
  2. managed-csi-premium ストレージ クラスは、Premium Azure ディスクをプロビジョニングします。
    • Premium ディスクでは、SSD ベースの高性能で待ち時間の短いディスクが使用されています。 運用ワークロードを実行している VM に最適です。 AKS で Azure Disk CSI ドライバーを使用する場合は、Standard SSD ローカル冗長ストレージ (LRS) によってサポートされる managed-csi ストレージ クラスを使用することもできます。

データ損失のリスクがあるため、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) は、ストレージ クラスに基づいてストレージを自動的にプロビジョニングします。 この場合、PVC は、事前作成されているストレージ クラスのいずれかを使用して、標準のまたはプレミアムな Azure マネージド ディスクを作成できます。

  1. azure-pvc.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。 この要求では、サイズが 5 GBReadWriteOnce アクセスがある 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 を使用します。

  1. kubectl apply コマンドを使用して、azure-pvc.yaml ファイルを指定することで、永続ボリューム要求を作成します。

    kubectl apply -f azure-pvc.yaml
    

    コマンドの出力は、次の例のようになります。

    persistentvolumeclaim/azure-managed-disk created
    

永続ボリュームの使用

永続ボリューム要求を作成した後、状態が Pending であることを確認する必要があります。 Pending 状態は、ポッドで使用する準備ができていることを示します。

  1. kubectl describe pvc コマンドを使用して、PVC の状態を確認します。

    kubectl describe pvc azure-managed-disk
    

    コマンドの出力は、次の抜粋した例のようになります。

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. 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
    
  3. kubectl apply コマンドを使用してポッドを作成します。

     kubectl apply -f azure-pvc-disk.yaml
    

    コマンドの出力は、次の例のようになります。

    pod/mypod created
    
  4. これで 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 ファイル システムの種類 ext4ext3ext2xfsbtrfs (Linux の場合)、ntfs (Windows の場合) いいえ ext4 (Linux の場合)、ntfs (Windows の場合)
volumeAttributes.partition 既存のディスクのパーティション番号 (Linux でのみサポート) 123 いいえ 空 (パーティションなし)
- パーティション形式が -part1 のような形式であることを確認します
volumeAttributes.cachingMode ディスク ホスト キャッシュの設定 NoneReadOnlyReadWrite いいえ ReadOnly

Azure ディスクを作成する

AKS で使用するための Azure ディスクを作成する場合は、ノード リソース グループ内にディスク リソースを作成することができます。 この方法により、AKS クラスターがディスク リソースにアクセスおよび管理できるようになります。 代わりに独立したリソース グループにディスクを作成する場合は、クラスターの Azure Kubernetes Service (AKS) マネージド ID に、ディスクのリソース グループに対する Contributor ロールを付与する必要があります。

  1. az aks show コマンドを使用してリソース グループ名を識別し、--query nodeResourceGroup パラメーターを追加します。

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    

    コマンドの出力は、次の例のようになります。

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. 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
    

ディスクをボリュームとしてマウントする

  1. PersistentVolume を使用して pv-azuredisk.yaml ファイルを作成します。 前の手順のディスク リソース ID で更新 volumeHandle します。 Windows Server コンテナーの場合は、パラメータ fsTypentfs を指定します。

    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
    
  2. 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
    
  3. kubectl apply コマンドを使用して PersistentVolumePersistentVolumeClaim を作成し、作成した 2 つの YAML ファイルを参照します。

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. 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
    
  5. 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
    
  6. 構成を適用し、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

次の手順