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

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

PersistentVolume と PersistentVolumeClaim の作成

pd-name という名前の 500 GB の永続ディスクがすでにある場合、以下のマニフェスト ファイル(existing-pd.yaml)には対応する PersistentVolume および PersistentVolumeClaim が記述されています。

この例では、claimRef を使用します。PersistentVolumeClaim を PersistentVolume で参照することで、PersistentVolume を指定した PersistentVolumeClaim にのみバインドできるようになります。

storageClassName と一致する名前の StorageClass オブジェクトが必要となるのは、StorageClass で構成された機能(ボリュームのサイズを変更する allowVolumeExpansion など)が必要な場合のみです。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "example-storageclass"
  capacity:
    storage: 500G
  accessModes:
    - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  gcePersistentDisk:
    pdName: pd-name
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-demo
spec:
  storageClassName: "example-storageclass"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500G

PersistentVolume と PersistentVolumeClaim を作成するには、kubectl apply -f existing-pd.yaml を使用します。

Pod 内での PersistentVolume の使用

クラスタ内に PersistentVolume と PersistentVolumeClaim が存在する場合、コンテナの volumeMounts フィールドに値を指定して、Pod のコンテナにボリュームへのアクセスを許可できます。この例では、これらのフィールドは、task-pv-storage という名前のボリュームがファイルパス /usr/share/nginx/html にマウントされることを指定します。

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
       claimName: pv-claim-demo
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

このマニフェストをクラスタに適用すると、Pod が作成され、task-pv-container コンテナが /usr/share/nginx/html/ ディレクトリ内のボリュームにアクセスできるようになります。

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

StatefulSet で既存のディスクを使用するには、次のタスクを実行します。

  1. StatefulSet の名前、volumeClaimTemplates.name、StatefulSet のレプリカの数を判別し、値を記録します。PersistentVolumeClaim の作成が完了するまで、StatefulSet を作成しないでください。
  2. StatefulSet の自動生成された PersistentVolumeClaim 名を確認します。StatefulSet では、PersistentVolumeClaim の名前は予測可能なパターン(volumeclaimtemplates-name-statefulset-name-replica-index)に従います。たとえば、StatefulSet の名前が「web」、StatefulSet の volumeClaimTemplates.name が「www」、2 つの StatefulSet レプリカがある場合、2 つの PersistentVolumeClaim 名は www-web-0www-web-1 です。
  3. claimRef フィールドを使用して PersistentVolumes を作成し、claimRef.name を、生成された PersistentVolumeClaim の名前に設定します。レプリカが複数ある場合は、レプリカごとに PersistentVolume を作成する必要があります。

    次の PersistentVolumes の例は、以下の特長を持つ環境用のものです。

    • デフォルトの名前空間にある StatefulSet。
    • 2 つのレプリカを持つ StatefulSet。
    • 自動的に生成された PersistentVolumeClaim の名前が www-web-0www-web-1 である StatefulSet。
    • pd-zeropd-one という 2 つの既存の永続ディスク。
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-0
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-0
      gcePersistentDisk:
        pdName: pd-zero
        fsType: ext4
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-1
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-1
      gcePersistentDisk:
        pdName: pd-one
        fsType: ext4
    
  4. 最初のステップで選択した値を使用して、StatefulSet を作成します。volumeClaimTemplates で指定したストレージが PersistentVolume の容量以下になるようにしてください。例:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    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: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 100Gi