FlexVolumeボリューム・プラグインからCSIボリューム・プラグインへの移行

Kubernetesワークロード(StatefulSetによって管理)をFlexVolumeボリューム・プラグインからCSIボリューム・プラグインに移行する方法を確認します。

クラスタをブロック・ボリューム・サービスからブロック・ボリュームに接続するには、CSIボリューム・プラグインまたはFlexVolumeボリューム・プラグインのいずれかを使用できます。ただし、Oracleでは、次の理由からCSIボリュームプラグインを使用することをお勧めします。
  • アップストリームKubernetesプロジェクトは、Kubernetesバージョン1.23のFlexVolumeボリューム・プラグインを非推奨にします。
  • 新機能は、FlexVolumeボリューム・プラグインではなく、CSIボリューム・プラグインにのみ追加されています。
  • CSIボリューム・プラグインは、ベースとなるオペレーティング・システムおよびルート・ファイル・システムの依存関係にアクセスする必要はありません。

Kubernetesでは、永続ストレージを必要とするステートフル・アプリケーションを管理する1つの方法は、StatefulSetオブジェクトを使用することです。StatefulSetオブジェクトの詳細は、KubernetesドキュメントのStatefulSetsを参照してください。

永続ストレージを必要とするステートフル・アプリケーションがあり、アプリケーションを管理するStatefulSetが現在FlexVolumeボリューム・プラグインを使用して永続ボリュームをプロビジョニングしている場合は、かわりにCSIボリューム・プラグインを使用するようにワークロードを移行することをお薦めします。

この項では、ワークロード(StatefulSetで管理)をFlexVolumeボリューム・プラグインからCSIボリューム・プラグインに移行するための一般的なステップを次のように説明します。

この項では、完全に機能する例も示します。このため、演習のステップを確認できます。FlexVolumeボリューム・プラグインからCSIボリューム・プラグインへのワークロードの移行の例を参照してください。

このセクションでは、次の点に注意してください。

  • FlexVolumeボリューム・プラグインによって作成された永続ボリュームおよび永続ボリューム要求は、それぞれFlexVolume PVおよびFlexVolume PVCと呼ばれます。
  • CSIボリュームプラグインによって作成された永続ボリュームおよび永続ボリューム要求は、それぞれCSI PVおよびCSI PVCと呼ばれます。

ステップ1: 既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを「保持」に変更します。

  1. 次のように入力して、StatefulSetのFlexVolume PVCにバインドされているFlexVolume PVの名前を確認します。

    kubectl get pvc
  2. 次のように入力して、既存のFlexVolume PVオブジェクトのリクレイム・ポリシーをRetainに変更し、移行中にPVをバックアップするブロック・ボリュームが削除されないようにします。

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  3. 次のように入力して、各FlexVolume PVが更新されたことを確認します。

    kubectl get pv <volume-name>
  4. 出力に、リクレイム・ポリシーがFlexVolume PVごとに「保持」に設定されていることを確認します。

    重要

    再利用ポリシーがFlexVolume PVごとに「保持」に設定されていることを確認します。再利用ポリシーが「保持」に設定されていない場合、FlexVolume PVをバッキングしているブロック・ボリュームは移行中に削除されます。

ステップ2: 新しいCSI PVオブジェクトを作成し、ブロック・ボリュームにバインドします。

  1. 新規PVマニフェスト・ファイルを作成します。
  2. 既存のFlexVolume PVオブジェクトごとに、次のテンプレートPV定義をファイルにコピーして、対応する新しいCSI PVオブジェクトを定義します。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <new-pv-name>
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: <original-pv-storage>
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: <original-pv-fs-type>
        volumeHandle: <original-pv-volume-ocid>
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - <original-pv-ad-location>
  3. 新しいCSI PVオブジェクト定義ごとに、次のように値を指定します。

    • metadata.nameを、新しいCSI PVオブジェクトの名前に対して選択した文字列に設定します。
    • spec.capacity.storageを既存のFlexVolume PVの容量に設定します。たとえば、50Giです。
    • spec.csi.fstypeを、既存のFlexVolume PVをサポートするファイル・システムのタイプに設定します。たとえば、ext4です。
      ヒント:既存のFlexVolume PVをバックアップするファイル・システムのタイプがわからない場合は、次のように入力してFlexVolume PVの詳細を参照してください。
      kubectl get pv <original-pv-name> -o yaml
    • spec.csi.volumeHandleを、既存のFlexVolume PVを裏付ける元のブロック・ボリュームのOCIDに設定します。OCIDは、FlexVolume PVの名前としても使用されました。たとえば、ocid1.volume.oc1.phx.aaaaaa______xbdです。
    • フレックスPVのfailure-domain.beta.kubernetes.io/zoneの値に基づいて、spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone.valuesをCSI PVの可用性ドメインに設定します。たとえば、PHX-AD-1です。
      ヒント:既存のFlex PVのfailure-domain.beta.kubernetes.io/zoneの値がわからない場合は、次のように入力してFlexVolume PVの詳細を参照してください。
      kubectl get pv <original-pv-name> -o yaml

    テンプレートでは、spec.storageClassNameはCSIボリューム・プラグイン(oci-bv)で使用されるストレージ・クラスにすでに設定されています。

    例:

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-0
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbd
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-1
  4. 次のように入力して、新しいCSI PVオブジェクトを作成します。

    kubectl apply -f <pv-manifest-filename>.yaml
  5. 次のように入力して、新しいCSI PVオブジェクトが作成されていることを確認します。

    kubectl get pv
  6. 次のように出力されていることを確認します。

    • FlexVolume PVオブジェクトごとに新しいCSI PVオブジェクト。
    • すべての新しいCSI PVオブジェクトのステータスはAvailableです。

ステップ3: 新しいCSI PVCオブジェクトを作成し、CSI PVオブジェクトにバインドします。

次に、前のステップで作成したCSI PVオブジェクトごとに、新しいCSI PVCオブジェクトを定義します。

  1. 新しいPVCマニフェスト・ファイルを作成します。
  2. 既存のFlexVolume PVCオブジェクトごとに、次のテンプレートPVC定義を新しいファイルにコピーして、新しいCSI PVCオブジェクトを定義します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <new-pvc-name>
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: <original-pvc-size>
      volumeName: <new-pv-name>
      storageClassName: oci-bv

  3. 新しいCSI PVCオブジェクト定義ごとに、次のように値を指定します。
    • metadata.nameを設定して、新しいCSI PVCの名前を次の形式で指定します。
      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      ここでは:

      • <new-volumeClaimTemplates.metadata.name>は、新しいCSI PVCの名前の最初の部分として選択した文字列です。ここで指定する文字列は、StatefulSetマニフェストの元のvolumeClaimTemplates.metadata.name値と異なる必要があります。ステップ4: 新しいCSI PVCオブジェクトを使用するようにStatefulSetオブジェクトを再作成で、StatefulSetマニフェストを更新し、この文字列をvolumeClaimTemplates.metadata.nameの値として指定します。
      • <statefulset-name>は、アプリケーションを管理するStatefulSetの名前です。
      • <index>は、0から始まる序数で、StatefulSetで指定されたレプリカ数に対して1ずつ増分されます。
    • spec.resources.requests.storageを、FlexVolume PVCに指定された値と同じ値に設定します。たとえば、50Giです。
    • 「ステップ2: 新しいCSI PVオブジェクトを作成し、ブロック・ボリュームにバインドする」で、spec.volumeNameを新しいCSI PVオブジェクトの名前として指定した名前に設定します。

    テンプレートでは、spec.storageClassNameはCSIボリューム・プラグイン(oci-bv)で使用されるストレージ・クラスにすでに設定されています。

    例:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-0
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-0
      storageClassName: oci-bv
  4. 次のように入力して、新しいCSI PVCオブジェクトを作成します。

    kubectl apply -f <pvc-manifest-filename>.yaml
  5. 次のように入力して、新しいCSI PVCオブジェクトが作成され、CSI PVオブジェクトにバインドされていることを確認します。

    kubectl get pvc
  6. 次のように出力されていることを確認します。

    • FlexVolume PVCオブジェクトごとにCSI PVCオブジェクトが作成されています。
    • すべてのCSI PVCオブジェクトのステータスはBoundです。
    • 各CSI PVCオブジェクトは、マニフェストで指定されたCSI PVオブジェクトにバインドされます。

ステップ4: 新しいCSI PVCオブジェクトを使用するようにStatefulSetオブジェクトを再作成します。

  1. 既存のStatefulSetのマニフェストを含むファイルをコピーして新しいStatefulSetマニフェストを作成し、新しい名前で新しいマニフェスト・ファイルを保存します。
  2. 次のように、新しいマニフェストを更新して、StatefulSetが「ステップ3: 新しいCSI PVCオブジェクトを作成し、それらをCSI PVオブジェクトにバインドする」で作成した新しいCSI PVCを使用するようにします。

    • spec.template.spec.containers.volumeMounts.nameを、新しいCSI PVC名の最初の部分として選択した文字列に変更します。
    • spec.volumeClaimTemplates.metadata.nameを、新しいCSI PVC名の最初の部分として選択した文字列に変更します。
    • spec.volumeClaimTemplates.spec.storageClassNameoci-bv (CSIボリューム・プラグインで使用されるストレージ・クラス)に変更します。
  3. 次のように入力して、既存のStatefulSetオブジェクトを削除します。

    kubectl delete statefulsets <statefulset-name>
  4. 次のように入力して、新しいマニフェストから新しいStatefulSetオブジェクトを作成します。

    kubectl apply -f <statefulset-manifest-filename>

ステップ5: 元のFlexVolume PVCおよびPVオブジェクトを削除します

「ステップ1: 既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを「保持」に変更でFlexVolume PVのpersistentVolumeReclaimPolicyを「保持」に変更し、この項のその他のステップを完了すると、元のFlexVolume PVおよびPVCオブジェクトを削除できるようになりました。

  1. FlexVolume PVオブジェクトごとに、次のように入力してPVオブジェクトを削除します。

    kubectl delete pv <flexvolume-pv-name>
  2. FlexVolume PVCオブジェクトごとに、次のように入力してPVCオブジェクトを削除します。

    kubectl delete pvc <flexvolume-pvc-name>

FlexVolumeボリューム・プラグインからCSIボリューム・プラグインへのワークロードの移行の例

この例では、サンプル・ワークロードをFlexVolumeボリューム・プラグインからCSIボリューム・プラグインに移行する方法を示します。この例の手順は、web-appという名前のStatefulSetオブジェクトによって管理されるワークロードを想定しています。

例 StatefulSetワークロード

最初は、StatefulSetはFlexVolumeボリューム・プラグインを使用してストレージをプロビジョニングします。元のStatefulSetは、次のようにflex-statefulset.yamlで定義されます。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web-app
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
              name: web
          volumeMounts:
            - name: storage-flex
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      name: storage-flex
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      storageClassName: oci
      volumeMode: Filesystem

元のStatefulSetマニフェストでは、次のものが定義されます。

  • StatefulSetの名前をweb-app (metadata.nameの値)として指定します。
  • volumeClaimTemplateの名前をstorage-flex (volumeClaimTemplates.metadata.nameの値)として指定します。
  • 3つのレプリカ(spec.replicasの値)。

StatefulSetのPVCを作成する場合、Kubernetesは次の規則を使用してPVCに名前を付けます。

<volumeClaimTemplate-name>-<StatefulSet-name>-<index>

ここでは:

  • <volumeClaimTemplate-name>は、StatefulSetマニフェスト内のvolumeClaimTemplates.metadata.nameの値で指定されたvolumeClaimTemplateの名前です。この例では、storage-flexです。
  • <StatefulSet-name>は、StatefulSetマニフェスト内のmetadata.nameの値で指定されたStatefulSetの名前です。この例では、web-appです。
  • <index>は、0から始まる序数で、StatefulSetで指定されたレプリカ数に対して1ずつ増分されます。この例では、3つのレプリカが指定されています。

そのため、Kubernetesがweb-app StatefulSetの元のFlexVolume PVCを作成したときに、次の名前の3つのPVCが作成されました。

  • storage-flex-web-app-0
  • storage-flex-web-app-1
  • storage-flex-web-app-2

ステップ1の例: 既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを「Retain」に変更します。

  1. StatefulSetの3つのFlexVolume PVCにバインドされている3つのFlexVolume PVの名前を確認するには、次のように入力します。

    kubectl get pvc
    
    NAME                     STATUS   VOLUME                                 CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    storage-flex-web-app-0   Bound    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            oci            <unset>                 9m28s             
    storage-flex-web-app-1   Bound    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            oci            <unset>                 2m59s             
    storage-flex-web-app-2   Bound    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            oci            <unset>                 2m3s              
  2. 次のように入力して、既存の3つのFlexVolume PVオブジェクトのリクレイム・ポリシーをRetainに変更し、移行中にPVをバックアップするブロック・ボリュームが削除されないようにします。

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

    この例では:

    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbd -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbd patched
    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbe -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbe patched
    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbf -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbf patched
  3. 次のように入力して、各FlexVolume PVが更新されたことを確認します。

    kubectl get pv
    
    NAME                                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                            STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-0   oci            <unset>                          13m
    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-2   oci            <unset>                          6m8s
    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-1   oci            <unset>                          7m8s
  4. 出力に、リクレイム・ポリシーがFlexVolume PVごとに「保持」に設定されたことが示されていることを確認します。

    重要

    再利用ポリシーがFlexVolume PVごとに「保持」に設定されていることを確認します。再利用ポリシーが「保持」に設定されていない場合、FlexVolume PVをバッキングしているブロック・ボリュームは移行中に削除されます。

ステップ2の例: 新しいCSI PVオブジェクトを作成し、ブロック・ボリュームにバインドします。

  1. 新しいPVマニフェスト・ファイルを作成し、migration-csi-pv.yamlとして保存します。

  2. 既存の3つのFlexVolume PVオブジェクトのそれぞれについて、次のテンプレートPV定義をmigration-CSI-pv.yamlファイルにコピーして、対応する新しいCSI PVオブジェクトを定義します。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <new-pv-name>
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: <original-pv-storage>
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: <original-pv-fs-type>
        volumeHandle: <original-pv-volume-ocid>
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - <original-pv-ad-location>
  3. 新しいCSI PVオブジェクト定義ごとに、次のように値を指定します。

    • metadata.nameを、新しいCSI PVオブジェクトの名前に対して選択した文字列に設定します。この例では、新しいCSI PVオブジェクトの名前をcsi-pv-web-app-0csi-pv-web-app-1およびcsi-pv-web-app-2とします。
    • spec.capacity.storageを既存のFlexVolume PVの容量に設定します。この例では、3つの新しいCSI PVオブジェクトすべてに50Giを指定します。
    • spec.csi.fstypeを、既存のFlexVolume PVをサポートするファイル・システムのタイプに設定します。この例では、3つの新しいCSI PVオブジェクトすべてにext4を指定します。
    • spec.csi.volumeHandleを、既存のFlexVolume PVを裏付ける元のブロック・ボリュームのOCIDに設定します。OCIDは、FlexVolume PVオブジェクトの名前としても使用されました。この例では、3つの新しいCSI PVオブジェクトに対して次のOCIDsを指定します。
      • ocid1.volume.oc1.phx.aaaaaa______xbd
      • ocid1.volume.oc1.phx.aaaaaa______xbe
      • ocid1.volume.oc1.phx.aaaaaa______xbf
    • フレックスPVのfailure-domain.beta.kubernetes.io/zoneの値に基づいて、spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zoneをCSI PVの可用性ドメインに設定します。この例では、3つの新しいCSI PVオブジェクトに対して次の可用性ドメインを指定します。
      • PHX-AD-1
      • PHX-AD-2
      • PHX-AD-3

    情報を入力すると、migration-CSI-pv.yamlファイルには、次の3つのCSI PV定義が含まれます。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-0
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbd
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-3
    ---
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-1
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbe
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-2
    ---
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-2
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbf
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-1
  4. 次のように入力して、3つの新しいCSI PVオブジェクトを作成します。

    kubectl apply -f migrated-csi-pv.yaml
    
    persistentvolume/csi-pv-web-app-0 created
    persistentvolume/csi-pv-web-app-1 created
    persistentvolume/csi-pv-web-app-2 created
  5. 次のように入力して、3つの新しいCSI PVオブジェクトが作成されたことを確認します。

    kubectl get pv
    
    NAME                                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                            STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    csi-pv-web-app-0                       50Gi       RWO            Retain           Available                                      oci-bv         <unset>                          11s
    csi-pv-web-app-1                       50Gi       RWO            Retain           Available                                      oci-bv         <unset>                          11s
    csi-pv-web-app-2                       50Gi       RWO            Retain           Available                                      oci-bv         <unset>                          10s
    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-0   oci            <unset>                          23m
    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-2   oci            <unset>                          16m
    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-1   oci            <unset>                          17m
  6. 出力に次が表示されることを確認します。

    • 元のFlexVolume PVオブジェクトごとに新しいCSI PVオブジェクト。
    • 新しい3つのCSI PVオブジェクトのステータスは、すべてAvailableです。

ステップ3の例: 新しいCSI PVCオブジェクトを作成し、CSI PVオブジェクトにバインドします。

次に、前のステップで作成したCSI PVオブジェクトごとに、新しいCSI PVCオブジェクトを定義します。

  1. 新しいPVCマニフェスト・ファイルを作成し、migration-csi-pvc.yamlとして保存します。

  2. 既存の3つのFlexVolume PVCオブジェクトのそれぞれについて、次のテンプレートPVC定義をmigration-CSI-pvc.yamlファイルにコピーして、新しいCSI PVCオブジェクトを定義します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <new-pvc-name>
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: <original-pvc-size>
      volumeName: <new-pv-name>
      storageClassName: oci-bv
  3. 新しいCSI PVCオブジェクト定義ごとに、次のように値を指定します。

    • metadata.nameを設定して、新しいCSI PVCの名前を次の形式で指定します。

      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      ここでは:

      • <new-volumeClaimTemplates.metadata.name>は、新しいCSI PVCの名前の最初の部分として選択した文字列です。ここで指定する文字列は、StatefulSetマニフェストの元のvolumeClaimTemplates.metadata.name値と異なる必要があります。例ステップ4: 新しいCSI PVCオブジェクトを使用するようにStatefulSetオブジェクトを再作成では、StatefulSetマニフェストを更新し、この文字列をvolumeClaimTemplates.metadata.nameの新しい値として指定します。この例では、storage-csiを指定します。
      • <statefulset-name>は、web-app (サンプル・アプリケーションを管理するStatefulSetの名前)です。
      • <index>は、0から始まる序数で、StatefulSetで指定されたレプリカ数に対して1ずつ増分されます。この例では、web-app StatefulSetは3つのレプリカを指定します。
    • spec.resources.requests.storageは、FlexVolume PVCに指定された値と同じ値に設定します。この例では、50Giを指定します
    • spec.volumeNameは、「例ステップ2: 新しいCSI PVオブジェクトを作成し、ブロック・ボリュームにバインドする」で、新しいCSI PVオブジェクトに指定した名前(csi-pv-web-app-0csi-pv-web-app-1またはcsi-pv-web-app-2)のいずれかに設定します。

    情報を入力すると、migration-CSI-pvc.yamlファイルには、次の3つのCSI PVC定義が含まれます。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-0
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-0
      storageClassName: oci-bv
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-1
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-1
      storageClassName: oci-bv
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-2
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-2
      storageClassName: oci-bv
  4. 次のように入力して、新しいCSI PVCオブジェクトを作成します。

    kubectl apply -f migrated-csi-pvc.yaml
    
    persistentvolumeclaim/storage-csi-web-app-0 created
    persistentvolumeclaim/storage-csi-web-app-1 created
    persistentvolumeclaim/storage-csi-web-app-2 created
  5. 次のように入力して、新しいCSI PVCオブジェクトが作成され、CSI PVオブジェクトにバインドされていることを確認します。

    kubectl get pvc
    
    NAME                     STATUS   VOLUME                                 CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    storage-csi-web-app-0    Bound    csi-pv-web-app-0                       50Gi       RWO            oci-bv         <unset>                 2m32s
    storage-csi-web-app-1    Bound    csi-pv-web-app-1                       50Gi       RWO            oci-bv         <unset>                 2m31s
    storage-csi-web-app-2    Bound    csi-pv-web-app-2                       50Gi       RWO            oci-bv         <unset>                 2m31s
    storage-flex-web-app-0   Bound    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            oci            <unset>                 38m
    storage-flex-web-app-1   Bound    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            oci            <unset>                 31m
    storage-flex-web-app-2   Bound    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            oci            <unset>                 30m
  6. 出力に次が表示されることを確認します。

    • FlexVolume PVCオブジェクトごとにCSI PVCオブジェクトが作成されています。
    • 3つのCSI PVCオブジェクトのステータスはすべてBoundです。
    • 各CSI PVCオブジェクトは、マニフェストで指定されたCSI PVオブジェクトにバインドされます。

例ステップ4: 新しいCSI PVCオブジェクトを使用するようにStatefulSetオブジェクトを再作成します。

  1. 新しいStatefulSetマニフェストを作成するには、既存のStatefulSetのマニフェスト(flex-statefulset.yaml)を含むファイルをコピーし、新しいマニフェスト・ファイルをcsi.statefulset.yamlとして保存します。
  2. csi.statefulset.yamlで新しいマニフェストを更新して、「例ステップ3: 新しいCSI PVCオブジェクトを作成し、それらをCSI PVオブジェクトにバインドする」で作成した新しいCSI PVCをStatefulSetで使用するようにします。
    • spec.template.spec.containers.volumeMounts.namestorage-csi (新しいCSI PVC名の最初の部分として選択した文字列)に変更します。
    • spec.volumeClaimTemplates.metadata.namestorage-csi (新しいCSI PVC名の最初の部分として選択した文字列)に変更します。
    • spec.volumeClaimTemplates.spec.storageClassNameoci-bv (CSIボリューム・プラグインで使用されるストレージ・クラス)に変更します。

    csi.statefulset.yamlの新しいStatefulSetマニフェストは次のようになります。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web-app
    spec:
      serviceName: "nginx"
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
                  name: web
              volumeMounts:
                - name: storage-csi
                  mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          creationTimestamp: null
          name: storage-csi
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 50Gi
          storageClassName: oci-bv
          volumeMode: Filesystem
  3. 次のように入力して、既存のweb-app StatefulSetオブジェクトを削除します。

    kubectl delete statefulsets web-app
    
    statefulset.apps "web-app" deleted
  4. 次のように入力して、新しいマニフェストから新しいweb-app StatefulSetオブジェクトを作成します。

    kubectl apply -f csi.statefulset.yaml

ステップ5の例: 元のFlexVolume PVCおよびPVオブジェクトの削除

「例ステップ1: 既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを「保持」に変更でFlexVolume PVのpersistentVolumeReclaimPolicyを「保持」に変更し、この項の他のステップを完了すると、元のFlexVolume PVおよびPVCオブジェクトを削除できるようになりました。

  1. FlexVolume PVオブジェクトごとに、次のように入力してPVオブジェクトを削除します。

    kubectl delete pv <flexvolume-pv-name>

    この例では:

    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbd
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbd deleted
    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbe
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbe deleted
    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbf
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbf deleted
  2. FlexVolume PVCオブジェクトごとに、次のように入力してPVCオブジェクトを削除します。

    kubectl delete pvc <flexvolume-pv-name>

    この例では:

    kubectl delete pvc storage-flex-web-app-0
    
    persistentvolumeclaim storage-flex-web-app-0 deleted
    kubectl delete pvc storage-flex-web-app-1
    
    persistentvolumeclaim storage-flex-web-app-1 deleted
    kubectl delete pvc storage-flex-web-app-2
    
    persistentvolumeclaim storage-flex-web-app-2 deleted