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


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

概要

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

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

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

Windows では ext4 ファイルシステム タイプはサポートされていません。Windows Server ノードプールには NTFS ファイルシステムを使用する必要があります。NTFS ディスクを使用するには、PersistentVolume マニフェストで spec.csi.fsTypeNTFS に変更します。

準備

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

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

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

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

PersistentVolume と PersistentVolumeClaim の作成

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

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:
        name: PV_CLAIM_NAME
        namespace: default
      csi:
        driver: pd.csi.storage.gke.io
        volumeHandle: DISK_ID
        fsType: FS_TYPE
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      namespace: default
      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_ID: 既存の永続ディスクの ID。形式は、ゾーン永続ディスクの場合は projects/{project_id}/zones/{zone_name}/disks/{disk_name}リージョン永続ディスクの場合は projects/{project_id}/regions/{region_name}/disks/{disk_name} です。
    • FS_TYPE: ファイルシステムのタイプ。デフォルト(ext4)のままにするか、xfs を使用します。クラスタで Windows Server ノードプールを使用している場合は、NTFS に変更する必要があります。
  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 名に次の形式を使用します。

    PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEX
    

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

    • PVC_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: "STORAGE_CLASS_NAME"
        capacity:
          storage: DISK1_SIZE
        accessModes:
          - ReadWriteOnce
        claimRef:
          namespace: default
          name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-0
        csi:
          driver: pd.csi.storage.gke.io
          volumeHandle: DISK1_ID
          fsType: FS_TYPE
       ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-ss-demo-1
      spec:
        storageClassName: "STORAGE_CLASS_NAME"
        capacity:
          storage: DISK2_SIZE
        accessModes:
          - ReadWriteOnce
        claimRef:
          namespace: default
          name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-1
        csi:
          driver: pd.csi.storage.gke.io
          volumeHandle: DISK2_ID
          fsType: FS_TYPE
      

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

      • DISK1_SIZE and DISK2_SIZE: 既存の永続ディスクのサイズ。
      • DISK1_ID and DISK2_ID: 既存の永続ディスクの識別子。
      • PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1: 前の手順で定義した形式で自動生成される PersistentVolumeClaim の名前。
      • STORAGE_CLASS_NAME: StorageClass の名前。
    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: registry.k8s.io/nginx-slim:0.8
              ports:
              - containerPort: 80
                name: web
              volumeMounts:
              - name: PVC_TEMPLATE_NAME
                mountPath: /usr/share/nginx/html
        volumeClaimTemplates:
        - metadata:
            name: PVC_TEMPLATE_NAME
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "STORAGE_CLASS_NAME"
            resources:
              requests:
                storage: 100Gi
      

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

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

      kubectl apply -f FILE_PATH
      

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

次のステップ