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

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

最終更新日:Mar 07, 2025

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

シナリオ

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

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

  • ログを高速で書き込む場合。

  • ポッドのライフサイクルとは無関係にデータを永続化する場合。

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

前提条件

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

    説明
    • クラスタ管理ページの左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。[ストレージ] タブで、csi-plugin と csi-provisioner がインストールされているかどうかを確認できます。特定の機能を使用するために CSI プラグインを更新する方法の詳細については、「csi-plugin と csi-provisioner を更新する」をご参照ください。

    • クラスタで FlexVolume を使用している場合は、FlexVolume は使用できなくなったため、クラスタを CSI プラグインに移行する必要があります。詳細については、「FlexVolume から CSI にアップグレードする」をご参照ください。

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

    • ディスクの課金方法は従量課金であり、ディスクは [保留中] 状態であること。

    • ディスクが Elastic Compute Service (ECS) インスタンスと同じゾーンにあり、ディスクタイプが ECS インスタンスタイプと互換性があること。

      重要

      ディスクはゾーンをまたいでマウントすることはできず、特定のディスクタイプは特定の ECS インスタンスにアタッチすることはできません。ECS インスタンスのゾーンと仕様が既存のディスクと一致していることを確認してください。そうでない場合、ディスクのマウントは失敗します。ディスクタイプと ECS インスタンスタイプの間の一致ルールについては、「インスタンスファミリの概要」をご参照ください。

使用上の注意

  • ディスクは共有できません。ディスクでマルチアタッチが有効になっていない場合、各ディスクは 1 つのポッドにのみマウントできます。マルチアタッチ機能については、「NVMe ディスクのマルチアタッチ機能と NVMe 予約機能を使用する」をご参照ください。

  • ディスクは、ディスクと同じゾーンにあるポッドにのみマウントできます。

  • ディスクと同じゾーンにあるポッドにのみディスクをマウントできます。

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

    説明

    マルチアタッチが無効になっている場合、ディスクは 1 つのポッドにのみマウントできます。Deployment にディスクをマウントする場合は、Deployment のポッドレプリカ数を 1 に設定する必要があります。複数のポッドを構成する場合、個別のディスクボリュームを各ポッドにマウントすることはできません。また、ポッドのボリュームのマウントおよびマウント解除の優先順位を指定することもできません。Deployment 内のポッドを再起動すると、Deployment で使用される更新ポリシーが原因で、再起動されたポッドにディスクがマウントできない場合があります。ディスクを Deployment にマウントしないことをお勧めします。

  • ディスク ボリュームを使用する場合に、アプリケーション構成に securityContext.fsgroup パラメーターが含まれていると、kubelet はボリュームがマウントされた後に chmod コマンドと chown コマンドを自動的に実行するため、ボリュームのマウント プロセスが遅くなる可能性があります。

    説明

    securityContext.fsgroup パラメーターをアプリケーション構成に追加すると、Container Service for Kubernetes (ACK) は、ディスクがアプリケーションにマウントされたときに、ボリューム内のファイルの所有権を自動的に変更します。所有権の変更に必要な時間は、ボリューム内のファイルの数によって異なります。ボリュームに多数のファイルが存在する場合、変更プロセスには長い時間がかかります。 Kubernetes 1.20 以降を実行するクラスターの場合、ポッド構成の fsGroupChangePolicy パラメーターを OnRootMismatch に設定できます。これにより、ACK はポッドが最初に起動されたときにのみファイルの所有権を変更します。作成後にポッドを更新または再作成する場合、ボリュームのマウントプロセスには所有権の変更は含まれません。上記の 設定 がビジネス要件を満たしていない場合は、init コンテナーを作成し、init コンテナーに関連する操作を実行するための権限を付与することをお勧めします。

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

手順 1: PV を作成する

  1. クラスタに接続します。 詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」または「Cloud Shell で kubectl を介して Kubernetes クラスタを管理する」をご参照ください。

  2. 次の YAML ファイルを変更し、disk-pv.yaml として保存します。

    YAML ファイル内の次のパラメーターを置き換えます。

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

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

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

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

      次の表は、さまざまなディスクカテゴリの値を示しています。

      • cloud_essd_entry: 企業向け SSD (ESSD) エントリーディスク。

      • cloud_auto: ESSD AutoPL ディスク。

      • cloud_essd: ESSD。

      • cloud_ssd: 標準 SSD。

      • cloud_efficiency: Ultra ディスク。

    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

    アノテーション。このパラメーターは、ディスクのマウントに必要な追加のノード制限を構成するために使用されます。 ポッドを互換性のある ECS ノードに確実にスケジュールできるように、ディスクのタイプを指定することをお勧めします。

    claimRef

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

    accessModes

    PVC のアクセスモード。 ReadWriteOnce を選択する必要があります。これは、ボリュームが読み取り/書き込みモードで 1 つのポッドのみにマウントされることを指定します。

    persistentVolumeReclaimPolicy

    PV の再利用ポリシー。

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

    • Retain: PVC が削除されると、関連する PV とディスクは保持され、手動でのみ削除できます。

    driver

    この例では、このパラメーターは diskplugin.csi.alibabacloud.com に設定されています。 この値は、Alibaba Cloud CSI プラグインが使用されることを指定します。

    nodeAffinity

    ノードアフィニティ構成。ディスクはゾーンをまたいでマウントできません。 このパラメーターを使用して、ディスクが配置されているゾーンの対応する ECS ノードにポッドをスケジュールできます。

    storageClassName

    このパラメーターは、静的にプロビジョニングされたボリュームでは使用できません。 StorageClass を事前に作成する必要はありません。 ただし、ConfigMap の値が 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

    PVC のアクセスモード。 ReadWriteOnce を選択する必要があります。これは、ボリュームが読み取り/書き込みモードで 1 つのポッドのみにマウントされることを指定します。

    storage

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

    storageClassName

    このパラメーターは、静的にプロビジョニングされたボリュームでは使用できません。 StorageClass を事前に作成する必要はありません。 ただし、ConfigMap の値が PV と PVC で同じであることを確認してください。

    volumeName

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

  2. PVC を作成します。

    kubectl create -f disk-pvc.yaml
  3. PVC を確認します。

    kubectl get pvc

    次の出力は、PV が PVC にバインドされていることを示しています。

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

手順 3: アプリケーションを作成し、アプリケーションにディスクをマウントする

  1. disk-test.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    次のコードブロックは、1 つのポッドをプロビジョニングする StatefulSet の構成を指定します。 ポッドは、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 を作成し、StatefulSet にディスクをマウントします。

    kubectl create -f disk-test.yaml
  3. StatefulSet によってプロビジョニングされたポッドがデプロイされているかどうかを確認します。

    kubectl get pod -l app=nginx

    次の出力は、StatefulSet に 1 つのポッドがデプロイされていることを示しています。

    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

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

手順 1: PV を作成する

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

  2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、[ボリューム] > [永続ボリューム] を選択します。

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

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

    パラメーター

    説明

    PV タイプ

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

    クラウドディスク

    アクセスモード

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

    ReadWriteOnce

    ディスク ID

    [ディスクの選択] をクリックし、ノードと同じリージョンにあるディスクを選択します。

    d-uf628m33r5rsbi******

    ファイルシステムタイプ

    ディスクのファイルシステムを選択します。有効な値: [ext4][ext3][xfs][vfat]。デフォルト値: [ext4]

    ext4

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

手順 2: PVC を作成する

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

  2. [永続ボリュームクレーム] ページの右上隅にある [作成] をクリックします。

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

    パラメーター

    説明

    PVC タイプ

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

    クラウドディスク

    名前

    PVC のカスタム名を入力します。名前は、UI に表示される形式の要件に従う必要があります。

    diks-pvc

    割り当てモード

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

    既存のボリューム

    既存のストレージクラス

    手順 1 で作成したボリュームを選択します。

    d-uf690053kttkprgx****, 20GiB

    容量

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

    20Gi

    PVC を作成した後、[永続ボリュームクレーム] ページで PVC を表示できます。作成した PV は PVC にバインドされます。

手順 3: アプリケーションを作成し、アプリケーションにディスクをマウントする

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

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

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

    次の表に、いくつかのパラメーターについて説明します。ビジネス要件に基づいて他のパラメーターを設定します。詳細については、「StatefulSet を使用してステートフル アプリケーションを作成する」をご参照ください。

    ウィザードページ

    パラメーター

    説明

    [基本情報]

    名前

    StatefulSet のカスタム名を入力します。名前は、UI に表示される形式の要件に従う必要があります。

    disk-test

    [レプリカ]

    StatefulSet によってプロビジョニングされるポッドレプリカの数。

    1

    [コンテナー]

    イメージ名

    アプリケーションのデプロイに使用されるイメージのアドレス。

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

    [必要なリソース]

    アプリケーションに必要な vCore の数、メモリの量、および一時ストレージの量を指定します。

    • CPU: 0.25 vCore

    • メモリ: 512 MiB

    • 一時ストレージ: スキップ

    [ボリューム]

    [PVC の追加] をクリックし、パラメーターを設定します。

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

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

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

    • コンテナーパス: /data

  4. アプリケーションがデプロイされているかどうかを確認します。

    1. [statefulset] ページで、作成したアプリケーションの名前をクリックします。

    2. [ポッド] タブで、ポッドが Running 状態になっていることを確認します。

kubectl を使用して、ディスクに基づいてデータの永続性が有効になっているかどうかを確認する

前の例で作成した StatefulSet は 1 つのポッドをプロビジョニングし、ディスクがポッドにマウントされます。ポッドを削除すると、システムは自動的にポッドを再作成します。元のディスクは新しいポッドにマウントされ、データはディスクに保持されます。データがディスクに保持されているかどうかをテストするには、次の手順を実行します。

  1. マウント パス内のファイルを表示して、ディスク上のファイルを表示できるかどうかを確認します。

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

    期待される出力:

    lost+found
  2. ディスクにファイルを作成します。

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

    kubectl delete pod disk-test-0
    説明

    ポッドを削除すると、システムは自動的にポッドを再作成します。

  4. 新しいポッドを確認します。

    kubectl get pod -l app=nginx

    次の出力は、新しいポッドの名前が削除したポッドと同じ名前であることを示しています。

    NAME          READY   STATUS    RESTARTS   AGE
    disk-test-0   1/1     Running   0          27s
  5. 元のディスクがポッドにマウントされていて、ファイルがディスクに保持されていることを確認します。

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

    次の出力は、test ファイルがディスクに保持されていることを示しています。

    lost+found  
    test

参考資料