FlexVolume プラグインは非推奨となり、新しい Container Service for Kubernetes (ACK) クラスターではサポートされなくなりました。プラグインのサポートを維持し、新しいストレージ機能にアクセスするために、静的にプロビジョニングされた File Storage NAS (NAS) の永続ボリューム (PV) と永続ボリューム要求 (PVC) を FlexVolume から Container Storage Interface (CSI) に移行してください。
クラスターに FlexVolume によって管理されるディスクボリュームも存在する場合は、代わりに csi-compatible-controller を使用します。
影響
移行中に PVC が再作成されるため、Pod が再起動します。
Pod の再起動により、実行中のワークロードが中断されます。移行はオフピーク時に実行してください。
FlexVolume と CSI の比較
| 属性 | CSI | FlexVolume |
|---|---|---|
| コンポーネント | CSI-Provisioner (Deployment) -- ボリュームの自動作成、スナップショット作成、CNFS ストレージ、偶発的な削除後のデータ復元。CSI-Plugin (DaemonSet) -- ボリュームの自動マウントおよびアンマウント。デフォルトでディスク、NAS、OSS ボリュームをサポートします。 | Disk-Controller (Deployment) -- ボリュームの自動作成。FlexVolume (DaemonSet) -- ボリュームのマウントおよびアンマウント。デフォルトでディスク、NAS、OSS ボリュームをサポートします。 |
| kubelet パラメーター | enable-controller-attach-detach を各ノードで true に設定する必要があります。 | enable-controller-attach-detach を true に設定する必要があります。 |
| リファレンス | ストレージ | FlexVolume 概要 |
前提条件
開始する前に、CSI プラグインをクラスターにインストールしてください。
csi-plugin.yamlとcsi-provisioner.yamlという名前のファイルを作成します。クラスターに csi-plugin と csi-provisioner をデプロイします:
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yamlCSI が実行中であることを確認します:期待される出力:すべての Pod が
Runningと表示されていれば、CSI はインストールされています。kubectl get pods -nkube-system | grep csicsi-plugin-577mm 4/4 Running 0 3d20h csi-plugin-k9mzt 4/4 Running 0 41d csi-provisioner-6b58f46989-8wwl5 9/9 Running 0 41d csi-provisioner-6b58f46989-qzh8l 9/9 Running 0 6d20h
操作手順
次の例では、StatefulSet ワークロードの移行を示します。以下の図はワークフローを示しています:

ステップ 1: ボリュームステータスの確認
Pod のステータスを照会します:期待される出力:
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'NAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 11mPod で使用されている PVC 名を検索します:期待される出力:
kubectl describe pod nas-static-1 |grep ClaimNameClaimName: nas-pvcPVC のステータスを確認します:期待される出力:
kubectl get pvc nas-pvc -oyaml > nas-pvc-flexvolume.yaml cat nas-pvc-flexvolume.yamlNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX 7m23s
ステップ 2: CSI 管理の PV と PVC の作成
同じ NAS ファイルシステムを指す、CSI で管理される新しい PV と PVC を作成します。次のいずれかのオプションを選択します。
オプション A: 自動変換 (FlexVolume2CSI CLI)
FlexVolume2CSI CLI を使用して、FlexVolume 管理の PV と PVC の定義を CSI 管理の同等の定義に変換します。このツールは
nas-pv-pvc-csi.yamlという名前のファイルを生成します。生成されたファイルを適用します:
kubectl apply -f nas-pv-pvc-csi.yamlPVC のステータスを確認します:期待される出力:
kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX nas 30m nas-pvc-csi Bound nas-pv-csi 512Gi RWX nas 2s
オプション B: 手動変換
既存の FlexVolume PV と PVC の定義をバックアップします。PVC を保存します:期待される出力:PV を保存します:期待される出力:
kubectl get pvc nas-pvc -oyaml > nas-pvc-flexvolume.yaml cat nas-pvc-flexvolume.yamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv storageClassName: naskubectl get pv nas-pv -oyaml > nas-pv-flexvolume.yaml cat nas-pv-flexvolume.yamlapiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv name: nas-pv spec: accessModes: - ReadWriteMany capacity: storage: 512Gi flexVolume: driver: alicloud/nas options: path: /aliyun server: ***.***.nas.aliyuncs.com vers: "3" persistentVolumeReclaimPolicy: Retain storageClassName: nasCSI 管理の PV と PVC を作成します。
nas-pv-pvc-csi.yamlという名前のファイルを次の内容で作成します:ファイルを適用します:PVC のステータスを確認します:期待される出力:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc-csi namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv-csi storageClassName: nas --- apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv-csi name: nas-pv-csi spec: accessModes: - ReadWriteMany capacity: storage: 512Gi csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: nas-pv-csi volumeAttributes: server: "***.***.nas.aliyuncs.com" path: "/aliyun" mountOptions: - nolock,tcp,noresvport - vers=3 persistentVolumeReclaimPolicy: Retain storageClassName: naskubectl apply -f nas-pv-pvc-csi.yamlkubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX 7m23s
ステップ 3: アプリケーションの更新
StatefulSet の構成を編集します:
kubectl edit sts nas-staticボリューム要求を更新して、CSI 管理の PVC を参照するようにします:
volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-csiPod が再起動したことを確認します:期待される出力:
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 70sNAS ボリュームが CSI を介してマウントされていることを確認します:移行が成功した場合、出力のマウントパスに
kubernetes.io~csiが表示されます:kubectl exec nas-static-1 -- mount |grep nas# マウント情報を表示 ***.***.nas.aliyuncs.com:/aliyun on /var/lib/kubelet/pods/ac02ea3f-125f-4b38-9bcf-9b117f62***/volumes/kubernetes.io~csi/nas-pv-csi/mount type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.XX.XX,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=192.168.XX.XX)
ステップ 4: FlexVolume のアンインストール
「OpenAPI Explorer コンソール」にログインし、[UnInstallClusterAddons] 操作を呼び出して、FlexVolume プラグインをアンインストールします。詳細については、「クラスターからコンポーネントをアンインストールする」をご参照ください。
ClusterId: ご利用のクラスターの ID。クラスター詳細ページの [基本情報] タブで確認できます。
name:
flexvolumeに設定します。
alicloud-disk-controller および alicloud-nas-controller コンポーネントを削除します:
kubectl delete deploy -n kube-system alicloud-disk-controller alicloud-nas-controllerFlexVolume が完全にアンインストールされたことを確認します:出力が返されない場合、FlexVolume は完全に削除されています。
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'FlexVolume の StorageClass (プロビジョナー:
alicloud/disk) を削除します:期待される出力:kubectl delete storageclass alicloud-disk-available alicloud-disk-efficiency alicloud-disk-essd alicloud-disk-ssdstorageclass.storage.k8s.io "alicloud-disk-available" deleted storageclass.storage.k8s.io "alicloud-disk-efficiency" deleted storageclass.storage.k8s.io "alicloud-disk-essd" deleted storageclass.storage.k8s.io "alicloud-disk-ssd" deleted
ステップ 5: API を介した CSI のインストール
OpenAPI Explorer コンソールにログインし、[InstallClusterAddons] 操作を呼び出して CSI をインストールします。 詳細については、「ACK クラスターにコンポーネントをインストールする」をご参照ください。
ClusterId: ご利用のクラスターの ID。
name:
csi-provisionerに設定します。バージョン: 最新バージョンは自動的に指定されます。バージョンの詳細については、「csi-provisioner」をご参照ください。
CSI が実行中であることを確認します:期待される出力:すべての Pod が
Runningと表示されていれば、CSI はインストールされています。kubectl get pods -nkube-system | grep csicsi-plugin-577mm 4/4 Running 0 3d20h csi-plugin-k9mzt 4/4 Running 0 41d csi-provisioner-6b58f46989-8wwl5 9/9 Running 0 41d csi-provisioner-6b58f46989-qzh8l 9/9 Running 0 6d20h
ステップ 6: ノード構成の更新
DaemonSet をデプロイして、既存のすべてのノードで kubelet パラメーター --enable-controller-attach-detach を true に設定します。更新が完了したら、DaemonSet を削除します。
この DaemonSet は各ノードで kubelet を再起動します。続行する前に、実行中のアプリケーションへの影響を評価してください。
次の内容のファイルを作成し、kubectl apply -f <filename>.yaml で適用します:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: kubelet-set
spec:
selector:
matchLabels:
app: kubelet-set
template:
metadata:
labels:
app: kubelet-set
spec:
tolerations:
- operator: "Exists"
hostNetwork: true
hostPID: true
containers:
- name: kubelet-set
securityContext:
privileged: true
capabilities:
add: ["SYS_ADMIN"]
allowPrivilegeEscalation: true
image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.26.5-56d1e30-aliyun
imagePullPolicy: "Always"
env:
- name: enableADController
value: "true"
command: ["sh", "-c"]
args:
- echo "Starting kubelet flag set to $enableADController";
ifFlagTrueNum=`cat /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep enable-controller-attach-detach=$enableADController | grep -v grep | wc -l`;
echo "ifFlagTrueNum is $ifFlagTrueNum";
if [ "$ifFlagTrueNum" = "0" ]; then
curValue="true";
if [ "$enableADController" = "true" ]; then
curValue="false";
fi;
sed -i "s/enable-controller-attach-detach=$curValue/enable-controller-attach-detach=$enableADController/" /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf;
restartKubelet="true";
echo "current value is $curValue, change to expect "$enableADController;
fi;
if [ "$restartKubelet" = "true" ]; then
/nsenter --mount=/proc/1/ns/mnt systemctl daemon-reload;
/nsenter --mount=/proc/1/ns/mnt service kubelet restart;
echo "restart kubelet";
fi;
while true;
do
sleep 5;
done;
volumeMounts:
- name: etc
mountPath: /host/etc
volumes:
- name: etc
hostPath:
path: /etc