すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:静的にプロビジョニングされたディスクボリュームの使用

最終更新日:Nov 09, 2025

ディスクボリュームは、高い I/O と低レイテンシーの要件を持つが、データ共有を必要としないアプリケーションに適しています。既存のディスクを静的にプロビジョニングされたボリュームとして Pod にマウントし、永続ストレージとして使用できます。このトピックでは、静的にプロビジョニングされたディスクボリュームの使用方法と、ストレージが永続的であることを確認する方法について説明します。

シナリオ

ディスクは、次のシナリオに適しています。

  • 高いディスク I/O スループットを必要とし、データ共有を必要としないアプリケーションを作成したい場合。アプリケーションは MySQL や Redis などのストレージサービスを使用できます。

  • 高速でログを書き込みたい場合。

  • Pod のライフサイクルとは独立した方法でデータを永続化したい場合。

既存のディスクがある場合、静的にプロビジョニングされたボリュームとして Pod にマウントできます。この方法では、手動で永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成する必要があります。これにより、コンテナーが開始する前に PV が準備できていることが保証されます。詳細については、「ブロックストレージボリューム」をご参照ください。

前提条件

  • Container Storage Interface (CSI) プラグインがクラスターにインストールされている。

    説明
    • クラスター管理ページの左側のナビゲーションウィンドウで、[運用管理] > > [コンポーネント管理] を選択します。[ストレージ] タブで、csi-plugin および csi-provisioner コンポーネントのインストール状況を確認します。CSI プラグインをアップグレードして特定の機能を使用する方法については、「CSI プラグインのアップグレード」をご参照ください。

    • クラスターが FlexVolume コンポーネントを使用している場合、FlexVolume は非推奨であるため、CSI プラグインに移行する必要があります。詳細については、「FlexVolume から CSI への移行」をご参照ください。

  • マウントするディスクが次の要件を満たしている。

    • ディスクの課金方法が従量課金であり、ディスクが [利用可能] 状態である。

    • ディスクが ECS ノードと同じゾーンにあり、ディスクタイプが ECS インスタンスタイプと互換性がある。

      重要

      ディスクはゾーンをまたいでマウントすることはできません。一部のディスクタイプは、特定の ECS インスタンスタイプにアタッチできません。Pod がスケジュールされる ECS ノードのゾーンとインスタンスタイプが、既存のディスクと互換性があることを確認してください。そうしないと、ディスクのマウントに失敗します。ディスクタイプと ECS インスタンスタイプの互換性の詳細については、「インスタンスファミリー」をご参照ください。

使用上の注意

  • ディスクは非共有ストレージです。ディスクでマルチアタッチが有効になっていない場合、一度に 1 つの Pod にしかマウントできません。マルチアタッチの詳細については、「NVMe ディスクのマルチアタッチ機能と予約機能の使用」をご参照ください。

  • ディスクは、ディスクと同じゾーンにある Pod にのみマウントできます。ゾーンをまたいだマウントはサポートされていません。

  • Pod が再構築されると、元のディスクが再マウントされます。他の制約により Pod を元のゾーンにスケジュールできない場合、ディスクをマウントできないため、Pod は Pending 状態のままになります。

  • ディスクは、Deployment ではなく、StatefulSet または個別の Pod にマウントすることをお勧めします。

    説明

    マルチアタッチが無効になっている場合、ディスクは 1 つの Pod にしかマウントできません。ディスクを Deployment にマウントする場合は、レプリカ数を 1 に設定する必要があります。Pod ごとに個別のボリュームを設定したり、マウントとアンマウントの優先順位を保証したりすることはできません。さらに、Deployment のアップグレードポリシーにより、新しい Pod が再起動時にディスクのマウントに失敗する可能性があります。したがって、ディスクを Deployment にマウントすることはお勧めしません。

  • ディスクボリュームを使用する際に、アプリケーションの YAML ファイルで securityContext.fsgroup を設定すると、マウント完了後に kubelet が chmod および chown コマンドを実行します。これにより、マウント時間が増加します。

    説明

    securityContext.fsgroup を設定すると、ディスクのマウント時にボリューム内のファイルの所有者が自動的に変更されます。これにより、ファイルの数によっては準備時間が増加する場合があります。バージョン 1.20 以降の Kubernetes クラスターでは、fsGroupChangePolicyOnRootMismatch に設定できます。これにより、コンテナーが初めて起動するときにのみファイル所有者が変更されるようになります。その後の Pod のアップグレードや再構築では、マウント時間は影響を受けません。これがニーズに合わない場合は、initContainer を使用して権限を調整することをお勧めします。

kubectl を使用して静的にプロビジョニングされたディスクボリュームをマウントする

ステップ 1: PV の作成

  1. クラスターに接続します。詳細については、「kubectl を使用してクラスターに接続する」または「CloudShell または Workbench で kubectl を使用してクラスターに接続する」をご参照ください。

  2. 次のテンプレートに基づいて、disk-pv.yaml という名前のファイルを作成します。

    YAML ファイル内の次のプレースホルダーを置き換えます。

    • <YOUR-DISK-ID>: 既存のディスクの ID。例: d-uf628m33r5rsbi******

    • <YOUR-DISK-SIZE>: 既存のディスクのサイズ。例: 20Gi

    • <YOUR-DISK-ZONE-ID>: 既存のディスクが配置されているゾーン。例: cn-shanghai-f

    • <YOUR-DISK-CATEGORY>: 既存のディスクのタイプ。例: cloud_essd

      次のリストは、さまざまなディスクタイプの値を示しています。

      • ESSD Entry ディスク: cloud_essd_entry

      • ESSD AutoPL ディスク: cloud_auto

      • ESSD: cloud_essd

      • 標準 SSD: cloud_ssd

      • Ultra ディスク: cloud_efficiency

      • ゾーン冗長ディスク: cloud_regional_disk_auto (設定も調整する必要があります。詳細については、「nodeAffinity パラメーターの説明」をご参照ください。)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: "<YOUR-DISK-ID>"
      annotations:
        csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}'
    spec:
      capacity:
        storage: "<YOUR-DISK-SIZE>"
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        namespace: default
        name: disk-pvc
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: diskplugin.csi.alibabacloud.com
        volumeHandle: "<YOUR-DISK-ID>"
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.diskplugin.csi.alibabacloud.com/zone
              operator: In
              values:
              - "<YOUR-DISK-ZONE-ID>"
      storageClassName: alicloud-disk-topology-alltype
      volumeMode: Filesystem

    次の表に、パラメーターを示します。

    パラメーター

    説明

    csi.alibabacloud.com/volume-topology

    アノテーション。ディスクを正常にマウントするために必要な追加のノード制約を設定するために使用されます。Pod がこのディスクタイプをサポートする ECS ノードにスケジュールされるように、ディスクタイプを指定することをお勧めします。

    claimRef

    PV にバインドできる PVC を指定します。PV を任意の PVC にバインドできるようにするには、この設定を削除します。

    accessModes

    アクセスモード。ReadWriteOnce のみがサポートされています。これは、ボリュームが単一の Pod によって読み取り/書き込みとしてマウントできることを意味します。

    persistentVolumeReclaimPolicy

    PV の再利用ポリシー。

    • Delete: PVC が削除されると、PV とディスクも削除されます。

    • Retain: PVC が削除されても、PV とディスクは削除されません。手動で削除する必要があります。

    driver

    値は diskplugin.csi.alibabacloud.com で、Alibaba Cloud ディスク CSI プラグインが使用されることを示します。

    nodeAffinity

    ノードアフィニティ設定。ディスクはゾーンをまたいでマウントすることはできません。この設定により、Pod がディスクと同じゾーンの ECS ノードにスケジュールされることが保証されます。

    ゾーン冗長ディスクの場合は、ディスクがリージョン内の任意のゾーンにマウントできるように、次の内容に変更します。

    コード内の <YOUR-DISK-REGION-ID> はディスクが配置されているリージョンです。たとえば、cn-shanghai です。
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/region
              operator: In
              values:
              - "<YOUR-DISK-REGION-ID>"

    storageClassName

    この設定は、静的にプロビジョニングされたボリュームには意味がありません。対応する StorageClass を事前に作成する必要はありません。ただし、この設定項目の値が PV と PVC で同じであることを確認する必要があります。

  3. PV を作成します。

    kubectl create -f disk-pv.yaml
  4. PV が作成されたことを確認します。

    kubectl get pv

    期待される出力:

    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM              STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    d-uf628m33r5rsbi******   20Gi       RWO            Retain           Available   default/disk-pvc   disk           <unset>                          1m36s

ステップ 2: PVC の作成

  1. 次のテンプレートに基づいて、disk-pvc.yaml という名前のファイルを作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: "<YOUR-DISK-SIZE>"
      storageClassName: alicloud-disk-topology-alltype
      volumeName: "<YOUR-DISK-ID>"

    次の表に、パラメーターを示します。

    パラメーター

    説明

    accessModes

    アクセスモード。ReadWriteOnce のみがサポートされています。これは、ボリュームが単一の Pod によって読み取り/書き込みとしてマウントできることを意味します。

    storage

    Pod に割り当てるストレージ容量。値はディスクの容量を超えることはできません。

    storageClassName

    この設定は、静的にプロビジョニングされたボリュームには意味がありません。対応する StorageClass を事前に作成する必要はありません。ただし、この設定項目の値が PV と PVC で同じであることを確認する必要があります。

    volumeName

    PVC にバインドできる PV を指定します。PVC を任意の PV にバインドできるようにするには、このパラメーターを削除します。

  2. PVC を作成します。

    kubectl create -f disk-pvc.yaml
  3. PVC が作成されたことを確認します。

    kubectl get pvc

    期待される出力は、PVC が PV に関連付けられていることを示しています。

    NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    disk-pvc   Bound    d-uf628m33r5rsbi******   20Gi       RWO            disk           <unset>                 64s

ステップ 3: アプリケーションを作成してディスクをマウントする

  1. 次のテンプレートに基づいて、disk-test.yaml という名前のファイルを作成します。

    次の YAML の例では、1 つの Pod を持つ StatefulSet を作成します。Pod は disk-pvc という名前の PVC を使用してストレージリソースを要求し、ボリュームを /data パスにマウントします。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: disk-test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc
  2. StatefulSet を作成し、ディスクをマウントします。

    kubectl create -f disk-test.yaml
  3. StatefulSet 内の Pod のステータスを確認します。

    kubectl get pod -l app=nginx

    StatefulSet のレプリカ数が 1 であるため、期待される出力では 1 つの Pod が作成されたことが示されます。

    NAME          READY   STATUS    RESTARTS   AGE
    disk-test-0   1/1     Running   0          14s
  4. マウントパスを確認して、ディスクがマウントされていることを確認します。

    kubectl exec disk-test-0 -- df -h /data

    期待される出力:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vdb         20G   24K   20G   1% /data

コンソールで静的にプロビジョニングされたディスクボリュームをマウントする

ステップ 1: 永続ボリューム (PV) の作成

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ボリューム] > [永続ボリューム] を選択します。

  3. [永続ボリューム] ページで、[作成] をクリックします。

  4. 表示されるダイアログボックスで、パラメーターを設定し、[作成] をクリックします。

    パラメーター

    説明

    PV タイプ

    [ディスク] を選択します。

    ディスク

    アクセスモード

    [ReadWriteOnce] のみがサポートされています。

    ReadWriteOnce

    ディスク ID

    [ディスクの選択] をクリックし、マウントするディスクを選択します。ディスクはノードと同じリージョンおよびゾーンにある必要があります。

    d-uf628m33r5rsbi******

    ファイルシステムタイプ

    ディスクにデータを保存するために使用するファイルシステムタイプを選択します。サポートされているタイプには、[ext4][ext3][xfs][vfat] があります。デフォルト値は [ext4] です。

    ext4

    PV が作成された後、[永続ボリューム] ページで表示できます。

ステップ 2: 永続ボリューム要求 (PVC) の作成

  1. 詳細ページの左側のナビゲーションウィンドウで、[ボリューム] > [永続ボリューム要求] を選択します。

  2. [永続ボリューム要求] ページで、[作成] をクリックします。

  3. 表示されるダイアログボックスで、パラメーターを設定し、[作成] をクリックします。

    パラメーター

    説明

    ストレージ要求タイプ

    [ディスク] を選択します。

    ディスク

    名前

    PVC のカスタム名を入力します。フォーマット要件については、インターフェイスのプロンプトをご参照ください。

    diks-pvc

    割り当てモード

    [既存ボリューム] を選択します。

    既存ボリューム

    既存ボリューム

    ステップ 1 で作成した PV を選択します。

    d-uf690053kttkprgx****, 20Gi

    合計容量

    Pod に割り当てるストレージ容量。値はディスクの容量を超えることはできません。

    20Gi

    PVC が作成された後、[永続ボリューム要求] ページで表示できます。PVC は PV (ディスクボリューム) にバインドされます。

ステップ 3: アプリケーションを作成してディスクをマウントする

  1. 詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [StatefulSet] を選択します。

  2. [StatefulSet] ページの右上隅にある [イメージから作成] をクリックします。

  3. StatefulSet のパラメーターを設定し、[作成] をクリックします。

    次の表に、主要なパラメーターを示します。必要に応じて他のパラメーターを設定します。詳細については、「StatefulSet の作成」をご参照ください。

    設定ページ

    パラメーター

    説明

    基本情報

    アプリケーション名

    StatefulSet のカスタム名を入力します。フォーマット要件については、インターフェイスのプロンプトをご参照ください。

    disk-test

    レプリカ数

    StatefulSet のレプリカ数を設定します。

    1

    コンテナー設定

    イメージ名

    アプリケーションのデプロイに使用するイメージのアドレスを入力します。

    anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    必須リソース

    必要な vCPU、メモリ、およびエフェメラルストレージリソースを設定します。

    • CPU: 0.25 コア

    • メモリ: 512 MiB

    • エフェメラルストレージ: 設定しない

    ボリューム

    [既存の要求を追加] をクリックします。次に、パラメーターを設定します。

    • マウントソース: ステップ 2 で作成した PVC を選択します。

    • コンテナーパス: ディスクをマウントするコンテナーパスを入力します。

    • マウントソース: disk-pvc

    • コンテナーパス: /data

  4. アプリケーションのステータスを確認します。

    1. [StatefulSet] ページで、アプリケーション名をクリックします。

    2. [Pod] タブで、Pod が実行中状態であることを確認します。

kubectl を使用してディスク上のデータの永続性を確認する

前の例で作成した StatefulSet には、マウントされたディスクを持つ 1 つの Pod が含まれています。この Pod が削除されると、新しい Pod が自動的に作成され、元のディスクが新しい Pod に再マウントされます。ディスク上のデータは保持されます。次のようにして、ディスクのデータの永続性を確認できます。

  1. ディスクのマウントパス内のデータを確認します。

    kubectl exec disk-test-0 -- ls /data

    期待される出力:

    lost+found
  2. ディスクにファイルを書き込みます。

    kubectl exec disk-test-0 -- touch /data/test
  3. Pod を削除します。

    kubectl delete pod disk-test-0
    説明

    StatefulSet 内の Pod を削除すると、システムは自動的に新しい Pod を作成します。

  4. 新しい Pod のステータスを確認します。

    kubectl get pod -l app=nginx

    期待される出力は、新しい Pod が削除された Pod と同じ名前であることを示しています。これは StatefulSet の特徴です。

    NAME          READY   STATUS    RESTARTS   AGE
    disk-test-0   1/1     Running   0          27s
  5. 新しい Pod がディスクを再マウントし、データが無傷であることを確認します。

    kubectl exec disk-test-0 -- ls /data

    期待される出力は、test ファイルがディスクに残っていることを示しています。

    lost+found  
    test

関連資料