既存の永続ディスクを PersistentVolume として使用する

このページでは、データが格納された既存の永続ディスクを使用して PersistentVolume を作成する方法と、PersistentVolume を Pod で使用する方法について説明します。

概要

既存の永続ディスクを使用する一般的なシナリオは 2 つあります。

このページの例では、既存の Compute Engine 永続ディスクを使用します。

ext4 はデフォルトのファイルシステム タイプですが、ノードイメージでサポートされている限り、代わりに xfs ファイルシステムで既存の永続ディスクを使用できます。xfs ディスクを使用するには、PersistentVolume マニフェストで spec.gcePersistentDisk.fsTypexfs に変更します。

始める前に

作業を始める前に、次のことを確認してください。

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. ゾーンクラスタの場合はデフォルトの Compute Engine ゾーン、リージョン クラスタまたは Autopilot クラスタの場合はデフォルトの Compute Engine リージョンを選択します。

gcloud config の使用

  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project PROJECT_ID
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot クラスタまたはリージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region COMPUTE_REGION
  • gcloud を最新バージョンに更新します。
    gcloud components update

PersistentVolume にバインドされた PersistentVolumeClaim の使用

コンテナが既存の永続ディスクにアクセスするには、次のことを行う必要があります。

  1. 既存の永続ディスクを PersistentVolume としてプロビジョニングします。
  2. PersistentVolume を PersistentVolumeClaim にバインドします。
  3. Pod 内のコンテナに PersistentVolume へのアクセス権を付与します。

PersistentVolume と PersistentVolumeClaim の作成

PersistentVolumeClaim を特定の PersistentVolume にバインドする方法はいくつかあります。たとえば、下の YAML マニフェストは、新しい PersistentVolume と PersistentVolumeClaim を作成し、claimRef を使用してクレームをボリュームにバインドします。これにより、PersistentVolume はその PersistentVolumeClaim にのみバインドされるようになります。

PersistentVolume を PersistentVolumeClaim にバインドするには、2 つのリソースの storageClassNamecapacityaccessModesvolumeMode が一致している必要があります。storageClassName は省略できますが、Kubernetes によりデフォルトの StorageClass が使用されないようにするには、"" を指定する必要があります。

storageClassName では、既存の StorageClass オブジェクトを参照する必要はありません。クレームをボリュームにバインドすることだけが必要な場合は、任意の名前を使用できます。ただし、ボリューム サイズ変更など、StorageClass によって構成される追加の機能が必要な場合は、storageClassName が既存の StorageClass オブジェクトを参照する必要があります。

詳細については、PersistentVolume に関する Kubernetes ドキュメントをご覧ください。

  1. 次の YAML マニフェストを保存します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: PV_NAME
    spec:
      storageClassName: "STORAGE_CLASS_NAME"
      capacity:
        storage: DISK_SIZE
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: PV_CLAIM_NAME
      gcePersistentDisk:
        pdName: DISK_NAME
        fsType: ext4
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: PV_CLAIM_NAME
    spec:
      storageClassName: "STORAGE_CLASS_NAME"
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: DISK_SIZE
    

    次のように置き換えます。

    • PV_NAME: 新しい PersistentVolume の名前。
    • STORAGE_CLASS_NAME: 新しい StorageClass の名前。
    • DISK_SIZE: 既存の永続ディスクのサイズ。例: 500G
    • PV_CLAIM_NAME: 新しい PersistentVolumeClaim の名前。
    • DISK_NAME: 既存の永続ディスクの名前。
  2. 構成を適用して PersistentVolume リソースと PersistentVolumeClaim リソースを作成するには、次のコマンドを実行します。

    kubectl apply -f FILE_PATH
    

    FILE_PATH は、YAML ファイルのパスに置き換えます。

Pod 内での PersistentVolume の使用

PersistentVolume と PersistentVolumeClaim を作成してバインドすると、volumeMounts フィールドに値を指定して、Pod のコンテナにボリュームへのアクセスを許可できます。

次の YAML 構成では、新しい Pod と nginx イメージを実行するコンテナを作成し、Pod に PersistentVolume をマウントします。

kind: Pod
apiVersion: v1
metadata:
  name: POD_NAME
spec:
  volumes:
    - name: VOLUME_NAME
      persistentVolumeClaim:
       claimName: PV_CLAIM_NAME
  containers:
    - name: CONTAINER_NAME
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: VOLUME_NAME

次のように置き換えます。

  • POD_NAME: 新しい Pod の名前。
  • VOLUME_NAME: ボリュームの名前。
  • PV_CLAIM_NAME: 前の手順で作成した PersistentVolumeClaim の名前。
  • CONTAINER_NAME: 新しいコンテナの名前。

構成を適用します。

kubectl apply -f FILE_PATH

FILE_PATH は、YAML ファイルのパスに置き換えます。

ボリュームがマウントされたことを確認するには、次のコマンドを実行します。

kubectl describe pods POD_NAME

出力で、PersistentVolumeClaim がマウントされていることを確認します。

...
Volumes:
  VOLUME_NAME:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  PV_CLAIM_NAME
    ReadOnly:   false
Events:
  Type    Reason                  Age   From                     Message
  ----    ------                  ----  ----                     -------
  Normal  Scheduled               29s   default-scheduler        Successfully assigned default/POD_NAME to gke-cluster-1-default-pool-d5cde866-o4g4
  Normal  SuccessfulAttachVolume  21s   attachdetach-controller  AttachVolume.Attach succeeded for volume "PV_NAME"
  Normal  Pulling                 19s   kubelet                  Pulling image "nginx"
  Normal  Pulled                  19s   kubelet                  Successfully pulled image "nginx"
  Normal  Created                 18s   kubelet                  Created container CONTAINER_NAME
  Normal  Started                 18s   kubelet                  Started container CONTAINER_NAME

StatefulSet での既存のディスクの使用

PersistentVolume を使用すると、既存の Compute Engine 永続ディスクを StatefulSet で使用できます。StatefulSet は、レプリカごとに PersistentVolumeClaim を自動的に生成します。生成された PersistentVolumeClaim の名前を予測し、claimRef を使用して PersistentVolume にバインドできます。

次の例では、デフォルトの名前空間で、既存の 2 つの永続ディスクを使用し、それらのディスクを使用する PersistentVolume を作成してから、2 つのレプリカがある StatefulSet にボリュームをマウントします。

  1. 新しい StatefulSet の名前、PersistentVolumeClaim テンプレートの名前、StatefulSet 内のレプリカの数を決定します。
  2. 自動生成された PersistentVolumeClaim の名前を調べます。StatefulSet は、PersistentVolumeClaim 名に次の形式を使用します。

    VC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEX
    

    次のように置き換えます。

    • VC_TEMPLATE_NAME: 新しい PersistentVolumeClaim テンプレートの名前。
    • STATEFULSET_NAME: 新しい StatefulSet の名前。
    • REPLICA_INDEX: StatefulSet のレプリカのインデックス。この例では、01 を使用します。
  3. PersistentVolume を作成します。StatefulSet 内のレプリカごとに PersistentVolume を作成する必要があります。

    1. 次の YAML マニフェストを保存します。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-ss-demo-0
      spec:
        storageClassName: "example-storageclass"
        capacity:
          storage: DISK1_SIZE
        accessModes:
          - ReadWriteOnce
        claimRef:
          namespace: default
          name: PVC1_NAME
        gcePersistentDisk:
          pdName: DISK1_NAME
          fsType: ext4
       ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-ss-demo-1
      spec:
        storageClassName: "example-storageclass"
        capacity:
          storage: DISK2_SIZE
        accessModes:
          - ReadWriteOnce
        claimRef:
          namespace: default
          name: PVC2_NAME
        gcePersistentDisk:
          pdName: DISK2_NAME
          fsType: ext4
      

      次のように置き換えます。

      • DISK1_SIZE and DISK2_SIZE: 既存の永続ディスクのサイズ。
      • DISK1_NAME and DISK2_NAME: 既存の永続ディスクの名前。
      • PVC1_NAME and PVC2_NAME: 自動的に生成される PersistentVolumeClaim の名前。
    2. 構成を適用します。

      kubectl apply -f FILE_PATH
      

      FILE_PATH は、YAML ファイルのパスに置き換えます。

  4. 手順 1 で選択した値を使用して、StatefulSet を作成します。volumeClaimTemplates で指定したストレージが PersistentVolume の容量以下になるようにしてください。

    1. 次の YAML マニフェストを保存します。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: STATEFULSET_NAME
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 2
        template:
          metadata:
            labels:
              app: nginx
          spec:
            terminationGracePeriodSeconds: 10
            containers:
            - name: nginx
              image: k8s.gcr.io/nginx-slim:0.8
              ports:
              - containerPort: 80
                name: web
              volumeMounts:
              - name: VC_TEMPLATE_NAME
                mountPath: /usr/share/nginx/html
        volumeClaimTemplates:
        - metadata:
            name: VC_TEMPLATE_NAME
          spec:
            accessModes: [ "ReadWriteOnce" ]
            resources:
              requests:
                storage: 100Gi
      

      次のように置き換えます。

      • STATEFULSET_NAME: 新しい StatefulSet の名前。
      • VC_TEMPLATE_NAME: 新しい PersistentVolumeClaim テンプレートの名前。
    2. 構成を適用します。

      kubectl apply -f FILE_PATH
      

      FILE_PATH は、YAML ファイルのパスに置き換えます。

次のステップ