Plugin FlexVolume telah ditinggalkan dan tidak lagi didukung di kluster Container Service for Kubernetes (ACK) baru. Migrasikan volume persisten (PV) dan klaim volume persisten (PVC) Penyimpanan File NAS (NAS) yang disediakan secara statis dari FlexVolume ke Container Storage Interface (CSI) untuk mempertahankan dukungan plugin serta mengakses fitur penyimpanan terbaru.
Jika kluster Anda juga memiliki volume disk yang dikelola oleh FlexVolume, gunakan csi-compatible-controller sebagai gantinya.
Dampak
PVC akan dibuat ulang selama migrasi, sehingga menyebabkan Pod melakukan restart.
Restart Pod mengganggu workload yang sedang berjalan. Lakukan migrasi selama jam sepi.
Perbandingan FlexVolume dan CSI
| Attribute | CSI | FlexVolume |
|---|---|---|
| Komponen | CSI-Provisioner (Deployment) -- pembuatan volume otomatis, pembuatan snapshot, penyimpanan CNFS, pemulihan data setelah penghapusan tidak sengaja. CSI-Plugin (DaemonSet) -- pemasangan dan pelepasan volume otomatis. Secara default mendukung volume disk, NAS, dan OSS. | Disk-Controller (Deployment) -- pembuatan volume otomatis. FlexVolume (DaemonSet) -- pemasangan dan pelepasan volume. Secara default mendukung volume disk, NAS, dan OSS. |
| Parameter kubelet | enable-controller-attach-detach harus diatur ke true pada setiap node. | enable-controller-attach-detach harus diatur ke true pada setiap node. |
| Referensi | Storage | Ikhtisar FlexVolume |
Prasyarat
Instal plugin CSI di kluster Anda sebelum memulai.
Buat file bernama
csi-plugin.yamldancsi-provisioner.yaml.Deploy csi-plugin dan csi-provisioner di kluster:
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yamlVerifikasi bahwa CSI sedang berjalan: Jika semua Pod menunjukkan status
Running, berarti CSI telah terinstal.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
Prosedur
Contoh berikut menunjukkan migrasi untuk workload StatefulSet. Gambar di bawah ini menampilkan alur kerja:

Langkah 1: Periksa status volume
Periksa status 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 11mCari nama PVC yang digunakan oleh Pod tersebut:
kubectl describe pod nas-static-1 |grep ClaimNameClaimName: nas-pvcPeriksa status PVC:
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
Langkah 2: Buat PV dan PVC yang dikelola oleh CSI
Buat PV dan PVC baru yang dikelola oleh CSI yang mengarah ke sistem file NAS yang sama. Pilih salah satu opsi berikut.
Opsi A: Konversi otomatis (CLI FlexVolume2CSI)
Gunakan CLI FlexVolume2CSI untuk mengonversi definisi PV dan PVC yang dikelola FlexVolume menjadi versi yang setara dengan yang dikelola CSI. Tool ini menghasilkan file bernama
nas-pv-pvc-csi.yaml.Terapkan file yang dihasilkan:
kubectl apply -f nas-pv-pvc-csi.yamlVerifikasi status PVC: Keluaran yang diharapkan:
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
Opsi B: Konversi manual
Buat backup definisi PV dan PVC FlexVolume yang ada. Simpan PVC: Simpan 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: nasBuat PV dan PVC yang dikelola oleh CSI. Buat file bernama
nas-pv-pvc-csi.yamldengan konten berikut, lalu terapkan file tersebut dan verifikasi status 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
Langkah 3: Perbarui aplikasi
Edit konfigurasi StatefulSet:
kubectl edit sts nas-staticPerbarui klaim volume agar merujuk ke PVC yang dikelola oleh CSI:
volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-csiKonfirmasi bahwa Pod melakukan restart:
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 70sVerifikasi bahwa volume NAS dipasang melalui CSI: Jika migrasi berhasil, output menunjukkan
kubernetes.io~csidalam path mount:kubectl exec nas-static-1 -- mount |grep nas# Lihat informasi mount ***.***.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)
Langkah 4: Uninstal FlexVolume
Masuk ke Konsol OpenAPI Explorer dan panggil operasi UnInstallClusterAddons untuk menguninstal plugin FlexVolume. Untuk informasi lebih lanjut, lihat Uninstal komponen dari kluster.
ClusterId: ID kluster Anda. Temukan di tab Basic Information pada halaman detail kluster Anda.
name: Atur ke
flexvolume.
Hapus komponen alicloud-disk-controller dan alicloud-nas-controller:
kubectl delete deploy -n kube-system alicloud-disk-controller alicloud-nas-controllerVerifikasi bahwa FlexVolume telah sepenuhnya diuninstal: Jika tidak ada output yang dikembalikan, berarti FlexVolume telah sepenuhnya dihapus.
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'Hapus StorageClass FlexVolume (provisioner:
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
Langkah 5: Instal CSI melalui API
Masuk ke Konsol OpenAPI Explorer dan panggil operasi InstallClusterAddons untuk menginstal CSI. Untuk informasi lebih lanjut, lihat Instal komponen di kluster ACK.
ClusterId: ID kluster Anda.
name: Atur ke
csi-provisioner.version: Versi terbaru akan ditentukan secara otomatis. Untuk detail versi, lihat csi-provisioner.
Verifikasi bahwa CSI sedang berjalan: Jika semua Pod menunjukkan status
Running, berarti CSI telah terinstal.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
Langkah 6: Perbarui konfigurasi node
Deploy DaemonSet untuk mengatur parameter kubelet --enable-controller-attach-detach ke true pada semua node yang ada. Hapus DaemonSet tersebut setelah pembaruan selesai.
DaemonSet ini akan me-restart kubelet pada setiap node. Evaluasi dampaknya terhadap aplikasi yang sedang berjalan sebelum melanjutkan.
Buat file dengan konten berikut dan terapkan menggunakan 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