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 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
-
次のように入力して、新しい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
です。- 「ステップ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
-
次のように入力して、新しい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マニフェストを作成し、新しい名前で新しいマニフェスト・ファイルを保存します。
-
次のように、新しいマニフェストを更新して、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.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 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
-
次のように入力して、各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-app
StatefulSetは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-app
StatefulSetオブジェクトを削除します。kubectl delete statefulsets web-app statefulset.apps "web-app" deleted
-
次のように入力して、新しいマニフェストから新しい
web-app
StatefulSetオブジェクトを作成します。kubectl apply -f csi.statefulset.yaml
ステップ5の例: 元のFlexVolume PVCおよびPVオブジェクトの削除
「例ステップ1: 既存のFlexVolume PVオブジェクトのリクレイム・ポリシーを「保持」に変更でFlexVolume PVのpersistentVolumeReclaimPolicyを「保持」に変更し、この項の他のステップを完了すると、元の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 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
-
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