FlexVolumeボリューム・プラグインからCSIボリューム・プラグインへの移行
Kubernetesワークロード(StatefulSetによって管理)をFlexVolumeボリューム・プラグインからCSIボリューム・プラグインに移行する方法を確認します。
- アップストリームKubernetesプロジェクトは、Kubernetesバージョン1.23のFlexVolumeボリューム・プラグインを非推奨にします。
- 新機能は、FlexVolumeボリューム・プラグインではなく、CSIボリューム・プラグインにのみ追加されています。
- CSIボリューム・プラグインは、ベースとなるオペレーティング・システムおよびルート・ファイル・システムの依存関係にアクセスする必要はありません。
Kubernetesでは、永続ストレージを必要とするステートフル・アプリケーションを管理する1つの方法は、StatefulSetオブジェクトを使用することです。StatefulSetオブジェクトの詳細は、KubernetesドキュメントのStatefulSetsを参照してください。
永続ストレージを必要とするステートフル・アプリケーションがあり、アプリケーションを管理するStatefulSetが現在FlexVolumeボリューム・プラグインを使用して永続ボリュームをプロビジョニングしている場合は、かわりにCSIボリューム・プラグインを使用するようにワークロードを移行することをお薦めします。
この項では、ワークロード(StatefulSetで管理)をFlexVolumeボリューム・プラグインからCSIボリューム・プラグインに移行するための一般的なステップを次のように説明します。
- ステップ1: 既存のFlexVolume PVオブジェクトの再利用ポリシーを「保持」に変更します。
- ステップ2: 新しいCSI PVオブジェクトを作成し、ブロック・ボリュームにバインドする
- ステップ3: 新しいCSI PVCオブジェクトを作成し、CSI PVオブジェクトにバインドする
- ステップ4: 新しいCSI PVCオブジェクトを使用するようにStatefulSetオブジェクトを再作成します。
- ステップ5: 元のFlexVolume PVCおよびPVオブジェクトの削除
この項では、完全に機能する例も示します。このため、演習のステップを確認できます。FlexVolumeボリューム・プラグインからCSIボリューム・プラグインへのワークロードの移行の例を参照してください。
このセクションでは、次の点に注意してください。
- FlexVolumeボリューム・プラグインによって作成された永続ボリュームおよび永続ボリューム要求は、それぞれFlexVolume PVおよびFlexVolume PVCと呼ばれます。
- CSIボリュームプラグインによって作成された永続ボリュームおよび永続ボリューム要求は、それぞれCSI PVおよびCSI PVCと呼ばれます。
ステップ1: 既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを「保持」に変更します。
-
次のように入力して、StatefulSetのFlexVolume PVCにバインドされているFlexVolume PVの名前を確認します。
kubectl get pvc -
次のように入力して、既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを
Retainに変更し、移行中にPVをバックアップするブロック・ボリュームが削除されないようにします。kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' -
次のように入力して、各FlexVolume PVが更新されたことを確認します。
kubectl get pv <volume-name> -
出力に、リクレイム・ポリシーがFlexVolume PVごとに「保持」に設定されていることを確認します。
重要
再利用ポリシーがFlexVolume PVごとに「保持」に設定されていることを確認します。再利用ポリシーが「保持」に設定されていない場合、FlexVolume PVをバッキングしているブロック・ボリュームは移行中に削除されます。
ステップ2: 新しいCSI PVオブジェクトを作成し、ブロック・ボリュームにバインドします。
- 新規PVマニフェスト・ファイルを作成します。
-
既存の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> -
新しい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 yamlspec.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 -
次のように入力して、新しいCSI PVオブジェクトを作成します。
kubectl apply -f <pv-manifest-filename>.yaml -
次のように入力して、新しいCSI PVオブジェクトが作成されていることを確認します。
kubectl get pv -
次のように出力されていることを確認します。
- FlexVolume PVオブジェクトごとに新しいCSI PVオブジェクト。
- すべての新しいCSI PVオブジェクトのステータスは
Availableです。
ステップ3: 新しいCSI PVCオブジェクトを作成し、CSI PVオブジェクトにバインドします。
次に、前のステップで作成したCSI PVオブジェクトごとに、新しいCSI PVCオブジェクトを定義します。
- 新しいPVCマニフェスト・ファイルを作成します。
-
既存の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 - 新しい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です。spec.volumeNameを、「ステップ2: 新規CSI PVオブジェクトの作成とブロック・ボリュームへのバインド」で新規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 -
次のように入力して、新しいCSI PVCオブジェクトを作成します。
kubectl apply -f <pvc-manifest-filename>.yaml -
次のように入力して、新しいCSI PVCオブジェクトが作成され、CSI PVオブジェクトにバインドされていることを確認します。
kubectl get pvc -
次のように出力されていることを確認します。
- FlexVolume PVCオブジェクトごとにCSI PVCオブジェクトが作成されています。
- すべてのCSI PVCオブジェクトのステータスは
Boundです。 - 各CSI PVCオブジェクトは、マニフェストで指定されたCSI PVオブジェクトにバインドされます。
ステップ4: 新しいCSI PVCオブジェクトを使用するようにStatefulSetオブジェクトを再作成します。
- 既存のStatefulSetのマニフェストを含むファイルをコピーして新しいStatefulSetマニフェストを作成し、新しい名前で新しいマニフェスト・ファイルを保存します。
-
次のように、「ステップ3: 新しいCSI PVCオブジェクトを作成し、CSI PVオブジェクトにバインドする」で作成した新しいCSI PVCがStatefulSetで使用されるように、新しいマニフェストを更新します。
spec.template.spec.containers.volumeMounts.nameを、新しいCSI PVC名の最初の部分として選択した文字列に変更します。spec.volumeClaimTemplates.metadata.nameを、新しいCSI PVC名の最初の部分として選択した文字列に変更します。spec.volumeClaimTemplates.spec.storageClassNameをoci-bv(CSIボリューム・プラグインで使用されるストレージ・クラス)に変更します。
-
次のように入力して、既存のStatefulSetオブジェクトを削除します。
kubectl delete statefulsets <statefulset-name> -
次のように入力して、新しいマニフェストから新しいStatefulSetオブジェクトを作成します。
kubectl apply -f <statefulset-manifest-filename>
ステップ5: 元のFlexVolume PVCおよびPVオブジェクトを削除します
「ステップ1: 既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを「保持」に変更」でFlexVolume PVのpersistentVolumeReclaimPolicyを「保持」に変更し、この項の他のステップを完了すると、元のFlexVolume PVおよびPVCオブジェクトを削除できるようになりました。
-
FlexVolume PVオブジェクトごとに、次のように入力してPVオブジェクトを削除します。
kubectl delete pv <flexvolume-pv-name> -
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」に変更します。
-
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 -
次のように入力して、既存の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 patchedkubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbe -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbe patchedkubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbf -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbf patched -
次のように入力して、各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 -
出力に、リクレイム・ポリシーがFlexVolume PVごとに「保持」に設定されたことが示されていることを確認します。
重要
再利用ポリシーがFlexVolume PVごとに「保持」に設定されていることを確認します。再利用ポリシーが「保持」に設定されていない場合、FlexVolume PVをバッキングしているブロック・ボリュームは移行中に削除されます。
ステップ2の例: 新しいCSI PVオブジェクトを作成し、ブロック・ボリュームにバインドします。
-
新しいPVマニフェスト・ファイルを作成し、migration-csi-pv.yamlとして保存します。
-
既存の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> -
新しいCSI PVオブジェクト定義ごとに、次のように値を指定します。
metadata.nameを、新しいCSI PVオブジェクトの名前に対して選択した文字列に設定します。この例では、新しいCSI PVオブジェクトの名前をcsi-pv-web-app-0、csi-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 -
次のように入力して、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 -
次のように入力して、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 -
出力に次が表示されることを確認します。
- 元のFlexVolume PVオブジェクトごとに新しいCSI PVオブジェクト。
- 新しい3つのCSI PVオブジェクトのステータスは、すべて
Availableです。
ステップ3の例: 新しいCSI PVCオブジェクトを作成し、CSI PVオブジェクトにバインドします。
次に、前のステップで作成したCSI PVオブジェクトごとに、新しいCSI PVCオブジェクトを定義します。
-
新しいPVCマニフェスト・ファイルを作成し、migration-csi-pvc.yamlとして保存します。
-
既存の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 -
新しい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-appStatefulSetは3つのレプリカを指定します。
-
spec.resources.requests.storageは、FlexVolume PVCに指定された値と同じ値に設定します。この例では、50Giを指定しますspec.volumeNameを、例の手順2: 新しいCSI PVオブジェクトの作成とブロック・ボリュームへのバインドで、新しいCSI PVオブジェクトに対して指定した名前(csi-pv-web-app-0、csi-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 -
-
次のように入力して、新しい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 -
次のように入力して、新しい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 -
出力に次が表示されることを確認します。
- FlexVolume PVCオブジェクトごとにCSI PVCオブジェクトが作成されています。
- 3つのCSI PVCオブジェクトのステータスはすべて
Boundです。 - 各CSI PVCオブジェクトは、マニフェストで指定されたCSI PVオブジェクトにバインドされます。
例ステップ4: 新しいCSI PVCオブジェクトを使用するようにStatefulSetオブジェクトを再作成します。
- 新しいStatefulSetマニフェストを作成するには、既存のStatefulSetのマニフェスト(flex-statefulset.yaml)を含むファイルをコピーし、新しいマニフェスト・ファイルをcsi.statefulset.yamlとして保存します。
- csi.statefulset.yamlの新しいマニフェストを更新して、「例 ステップ3: 新しいCSI PVCオブジェクトを作成し、CSI PVオブジェクトにバインドする」で作成した新しいCSI PVCをStatefulSetが使用するようにします。
spec.template.spec.containers.volumeMounts.nameをstorage-csi(新しいCSI PVC名の最初の部分として選択した文字列)に変更します。spec.volumeClaimTemplates.metadata.nameをstorage-csi(新しいCSI PVC名の最初の部分として選択した文字列)に変更します。spec.volumeClaimTemplates.spec.storageClassNameをoci-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 -
次のように入力して、既存の
web-appStatefulSetオブジェクトを削除します。kubectl delete statefulsets web-app statefulset.apps "web-app" deleted -
次のように入力して、新しいマニフェストから新しい
web-appStatefulSetオブジェクトを作成します。kubectl apply -f csi.statefulset.yaml
ステップ5の例: 元のFlexVolume PVCおよびPVオブジェクトの削除
FlexVolume PVのpersistentVolumeReclaimPolicyを例1: 既存のFlexVolume PVオブジェクトの再利用ポリシーを「保持」に変更し、この項の他のステップを完了すると、元のFlexVolume PVおよびPVCオブジェクトを削除できます。
-
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 deletedkubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbe persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbe deletedkubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbf persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbf deleted -
FlexVolume PVCオブジェクトごとに、次のように入力してPVCオブジェクトを削除します。
kubectl delete pvc <flexvolume-pv-name>この例では:
kubectl delete pvc storage-flex-web-app-0 persistentvolumeclaim storage-flex-web-app-0 deletedkubectl delete pvc storage-flex-web-app-1 persistentvolumeclaim storage-flex-web-app-1 deletedkubectl delete pvc storage-flex-web-app-2 persistentvolumeclaim storage-flex-web-app-2 deleted