FlexVolume2CSI コマンドラインインターフェイス (CLI) は、永続ボリューム (PV)、永続ボリューム要求 (PVC)、およびインライン FlexVolume ストレージを使用するワークロードの YAML ファイルを一括で変換します。ACK クラスターを FlexVolume から Container Storage Interface (CSI) へ移行する際のプロセスに活用できます。
FlexVolume2CSI は、クラスター内のボリュームおよびワークロードリソースを一覧表示し、標準的な FlexVolume フィールドを対応する CSI 形式に変換して、変換後の YAML を出力ファイルに書き出します。変換されたリソースはデプロイされません — ご自身でレビューしたうえで、別途デプロイしてください。
対象範囲:FlexVolume2CSI は、NAS、OSS、Alibaba Cloud ディスクボリュームのみを使用する標準的な永続ボリューム (PV)、永続ボリューム要求 (PVC)、およびワークロードのインラインボリュームを変換します。その他のストレージタイプは対象外です。
生成された YAML ファイルをクラスターにデプロイする前に、内容を必ず検証してください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
macOS または Linux(CLI は Windows をサポートしていません)
FlexVolume クラスターのクラスター ID
NAS、OSS、または Alibaba Cloud ディスクボリュームを使用する PV、PVC、またはワークロード
ステップ 1:FlexVolume2CSI のインストール
以下のコマンドを実行して、FlexVolume2CSI をインストールします。
curl https://ack-csiplugin.oss-cn-hangzhou.aliyuncs.com/flexvolume2csi/get-translator.sh | bashインストールを検証します。
flexvolume2csi version期待される出力:
flexvolume2csi: v2.0.0+f87c834 BuildDate: 2025-01-06T03:49:37Z GitCommit: f87c83459b8407668a04f7e7434cc51439c87508 GitTreeState: clean GoVersion: go1.23.3 Compiler: gc Platform: darwin/arm64
ステップ 2:クラスターへのアクセス設定
以下のコマンドを実行し、プロンプトに従ってターゲットクラスターを設定します。
flexvolume2csi configure期待される出力:
Configuring profile 'default' ...
Default Cluster Id (ClusterId of ACK Flexvolume Cluster) [c4869a2f603ca4e74****************]:
Default Kubeconfig Path (default is ~/.kube/config) []:
Saving profile[default] ...
Done.| パラメーター | 説明 |
|---|---|
| Cluster Id | FlexVolume クラスターの ID です。 |
| Kubeconfig Path | FlexVolume クラスターの kubeconfig ファイルのパスです。デフォルト値は ~/.kube/config です。 |
ステップ 3:FlexVolume PV および PVC の変換
flexvolume2csi translate を使用して、PV および PVC の CSI YAML を生成します。
FlexVolume PVC および PV は、kubectl apply を使用してインプレースで変換できません — 再デプロイする必要があります。FlexVolume リソースと CSI リソースを一時的に共存させる必要がある場合(csi-compatible-controller コンポーネントを使用)、名前競合を回避するために -p または -s を使用します。
フラグ
利用可能なすべてのフラグを表示するには、flexvolume2csi translate help を実行します。
flexvolume2csi translate [-n namespace] [-c pvc] [-o outputfile] [-p prefix] [-s suffix] [-b backupfile] [-t storageclass]| フラグ | 説明 |
|---|---|
-o | 生成される CSI YAML ファイルのパスです。デフォルト値は ./outputfile.txt です。空白のままにすると、標準出力に表示されます。 |
-b | 元の FlexVolume PV および PVC のバックアップ YAML ファイルのパスです。デフォルト値は ./backupfile.txt です。空白のままにすると、バックアップはスキップされます。 |
-n | 処理対象の名前空間です。デフォルト値はすべての名前空間です。 |
-c | 処理対象の PVC 名です。指定された PVC および対応する PV のみを処理します。-n と併用する必要があります。 |
-p | 生成される CSI PV および PVC の名前に追加するプレフィックスです。たとえば、-p csi を指定すると、pvc-test が csi-pvc-test にリネームされます。 |
-s | 生成される CSI PV および PVC の名前に追加するサフィックスです。たとえば、-s csi を指定すると、pvc-test が pvc-test-csi にリネームされます。 |
-t | 生成される CSI リソースに適用する StorageClass 名です。 |
例
この例では、FlexVolume NAS PV および PVC を CSI に変換します。
以下の内容で
pv.yamlファイルを作成し、FlexVolume クラスターに適用します。apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas spec: capacity: storage: 5Gi storageClassName: nas accessModes: - ReadWriteMany flexVolume: driver: "alicloud/nas" options: server: "0cd8b4a576-u****.cn-hangzhou.nas.aliyuncs.com" # ご利用の NAS マウントターゲットアドレスに置き換えてください。 path: "/k8s" vers: "3" options: "nolock,tcp,noresvport"kubectl apply -f pv.yaml以下の内容で
pvc.yamlファイルを作成し、適用します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nas spec: accessModes: - ReadWriteMany storageClassName: nas resources: requests: storage: 5Gikubectl apply -f pvc.yamlPV および PVC がバインドされていることを確認します。
kubectl get pvc | grep pvc-nas期待される出力:
pvc-nas Bound pv-nas 5Gi RWO nas 10sクラスター内のすべての PV および PVC を変換します。
-s csiフラグにより、生成されるリソース名に-csiが付与され、名前衝突が回避されます。flexvolume2csi translate -s csi生成された CSI YAML を確認します。
cat ./outputfile.yaml期待される出力:
--- apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: pv-nas-csi name: pv-nas-csi spec: accessModes: - ReadWriteMany capacity: storage: 5Gi csi: driver: nasplugin.csi.alibabacloud.com volumeAttributes: path: /k8s server: 0cd8b4a576-u****.cn-hangzhou.nas.aliyuncs.com volumeHandle: pv-nas-csi mountOptions: - nolock,tcp,noresvport - vers=3 persistentVolumeReclaimPolicy: Retain storageClassName: nas volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nas-csi namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas-csi storageClassName: nas volumeMode: Filesystem volumeName: pv-nas-csi
(任意)ステップ 4:インライン FlexVolume ボリュームを含むワークロードの変換
ACK マネージドクラスターおよび ACK サーバーレスの旧バージョンでは、FlexVolume ストレージをインラインモードでワークロードに直接マウントできます。クラスターにこのようなワークロードが存在する場合は、flexvolume2csi inline-translate を使用して、YAML ファイルを個別に変換してください。
インラインマウント方式では、PVC や PV リソースは使用されません。以下に例を示します。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
serviceName: nginx
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
volumeMounts:
- name: test
mountPath: /data
ports:
- containerPort: 80
volumes:
- name: test
flexVolume:
driver: "alicloud/disk"
fsType: "ext4"
options:
volumeId: "d-bp1f3b5d0b0a8e7e6f****"
volumeClaimTemplates:
- metadata:
name: disk-ssd
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-ssd"
resources:
requests:
storage: 20Gi名前が test のボリュームは、インラインモードでマウントされた FlexVolume ディスクボリュームです。
volumeClaimTemplates フィールドにより、コントローラーが動的に PVC および PV リソースを作成できます。これらの生成されたリソースは、ステップ 3 の手順で変換できます。CSI リソースとして再作成するには、データが不要であることを確認したうえで、FlexVolume の PVC および PV を削除し、storageClassName を volumeClaimTemplates 内の CSI StorageClass に変更してください。
変換対象
変換出力はボリュームの種類によって異なります。
volumeId を持たないディスクボリューム:インラインの一時ボリュームに変換されます。
その他のすべてのタイプ:CSI PV および PVC リソースに変換されます。出力ファイルには PV、PVC、および更新済みのワークロードマニフェストが含まれます。
フラグ
利用可能なすべてのフラグを表示するには、flexvolume2csi inline-translate help を実行します。
flexvolume2csi inline-translate [-n namespace] [-k kind] [-i item] [-f inputfile] [-o outputfile] [-b backupfile] [-t storageclass] [-c capacity]| フラグ | 説明 |
|---|---|
-o | 生成される CSI YAML ファイルのパスです。デフォルト値は ./outputfile.txt です。空白のままにすると、標準出力に表示されます。 |
-b | 元の FlexVolume ワークロードのバックアップ YAML ファイルのパスです。デフォルト値は ./backupfile.txt です。空白のままにすると、バックアップはスキップされます。 |
-n | 処理対象の名前空間です。デフォルト値はすべての名前空間です。 |
-k | 処理対象のワークロードの種類(例: sts または deploy)です。デフォルト値はすべての種類です。Pod は -k pod を明示的に指定しない限り除外されます。 |
-i | 処理対象のワークロード名です。-n および -k と併用する必要があります。 |
-f | クラスターから一覧表示する代わりに、ローカルの YAML ファイルからワークロードリソースを読み込みます。-n、-k、-i とは併用できません。 |
-t | 生成される CSI リソースに適用する StorageClass 名です。 |
-c | 生成される CSI リソースに設定するストレージ容量です。 |
例 1:volumeId を持たないディスクボリュームを一時ボリュームに変換
以下のワークロードを FlexVolume クラスターに作成・デプロイします。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: test mountPath: /data ports: - containerPort: 80 volumes: - name: test flexVolume: driver: "alicloud/disk" fsType: "ext4" options: volumeSize: "20"ワークロードを変換します。
flexvolume2csi inline-translate -k deploy -n default -i nginx生成された CSI YAML を確認します。
cat ./outputfile.yaml期待される出力:
--- apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: nginx strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: nginx spec: containers: - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /data name: test dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - ephemeral: volumeClaimTemplate: metadata: spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi name: testデプロイ前に、生成された YAML を必要に応じて調整してください。一時ボリュームの場合、StorageClass を指定します。
volumes: - ephemeral: volumeClaimTemplate: metadata: spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: ephemeral-diskあるいは、変換時に
-tを指定して、すべてのリソースに StorageClass を設定することもできます。flexvolume2csi inline-translate -k deploy -n default -i nginx -t ephemeral-disk
例 2:その他のボリュームタイプを CSI PV および PVC リソースに変換
この例では、-f を使用して、ローカルファイルから StatefulSet を変換します。
このステップの冒頭に示した StatefulSet YAML を
disk-static-sts.yamlとして保存します。StatefulSet を変換します。
flexvolume2csi inline-translate -f disk-static-sts.yaml生成された CSI YAML を確認します。
cat ./outputfile.txt期待される出力:
--- apiVersion: v1 kind: PersistentVolume metadata: name: d-bp1f3b5d0b0a8e7e6f**** spec: accessModes: - ReadWriteOnce claimRef: kind: PersistentVolumeClaim name: sts-nginx-test namespace: default csi: driver: diskplugin.csi.alibabacloud.com fsType: ext4 volumeAttributes: volumeId: d-bp1f3b5d0b0a8e7e6f**** volumeHandle: d-bp1f3b5d0b0a8e7e6f**** persistentVolumeReclaimPolicy: Delete --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sts-nginx-test namespace: default spec: accessModes: - ReadWriteOnce resources: {} volumeName: d-bp1f3b5d0b0a8e7e6f**** --- apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx serviceName: nginx template: metadata: labels: app: nginx spec: containers: - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 name: nginx ports: - containerPort: 80 resources: {} volumeMounts: - mountPath: /data name: test volumes: - name: test persistentVolumeClaim: claimName: sts-nginx-test updateStrategy: {} volumeClaimTemplates: - metadata: name: disk-ssd spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-disk-ssd" resources: requests: storage: 20Giインライン FlexVolume ボリュームは、CSI PVC および PV に変換されました。StatefulSet は、インラインボリュームの代わりに PVC を参照するようになっています。
volumeClaimTemplatesセクションは変更されていません。デプロイ前に、生成された YAML を必要に応じて調整してください。CSI ディスクボリュームの場合、生成出力には通常、以下の 2 つのフィールドが欠落しています。
ストレージ容量:PVC および PV に必要な容量を宣言します。たとえば、PV では
capacity.storage: 20Giを、PVC ではresources.requests.storage: 20Giを設定します。volumeClaimTemplates 内の StorageClass:
storageClassNameを CSI StorageClass に変更します。
調整後の例:
--- apiVersion: v1 kind: PersistentVolume metadata: name: d-bp1f3b5d0b0a8e7e6f**** spec: accessModes: - ReadWriteOnce capacity: storage: 20Gi claimRef: kind: PersistentVolumeClaim name: sts-nginx-test namespace: default csi: driver: diskplugin.csi.alibabacloud.com fsType: ext4 volumeAttributes: volumeId: d-bp1f3b5d0b0a8e7e6f**** volumeHandle: d-bp1f3b5d0b0a8e7e6f**** persistentVolumeReclaimPolicy: Delete --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sts-nginx-test namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi volumeName: d-bp1f3b5d0b0a8e7e6f****あるいは、変換時に
-tおよび-cを指定して、すべてのリソースに StorageClass および容量を設定することもできます。flexvolume2csi inline-translate -f disk-static-sts.yaml -t <csi-storageclass> -c "20Gi"
ステップ 5:生成された CSI YAML のデプロイ
生成された YAML を検証した後、クラスターにデプロイします。FlexVolume2CSI は YAML ファイルを生成するのみであり、デプロイは行いません。kubectl create -f を使用してデプロイしてください(kubectl apply -f を使用すると、リソース名の衝突が発生する可能性があります)。
完全な移行プロセスについては、「FlexVolume から CSI への移行」のシナリオガイドをご参照ください。