Plug-in FlexVolume sudah tidak digunakan lagi. Kluster Container Service for Kubernetes (ACK) baru tidak mendukung FlexVolume. Untuk kluster yang ada, disarankan untuk bermigrasi dari FlexVolume ke Container Storage Interface (CSI). Topik ini menjelaskan cara menggunakan CSI untuk mengambil alih volume Object Storage Service (OSS) yang diprovinsi secara statis dan dikelola oleh FlexVolume.
Perbedaan antara FlexVolume dan CSI
Tabel berikut menunjukkan perbedaan antara CSI dan FlexVolume.
Plug-in | Komponen | Parameter kubelet | Referensi |
CSI |
| Parameter kubelet yang dibutuhkan oleh plug-in CSI berbeda dengan yang dibutuhkan oleh plug-in FlexVolume. Untuk menjalankan plug-in CSI, Anda harus mengatur parameter kubelet | |
FlexVolume |
| Parameter kubelet yang dibutuhkan oleh plug-in FlexVolume berbeda dengan yang dibutuhkan oleh plug-in CSI. Untuk menjalankan plug-in FlexVolume, Anda harus mengatur parameter kubelet |
Skenario
FlexVolume telah diinstal di kluster Anda dan digunakan untuk memasang volume OSS yang diprovinsi secara statis. Jika Anda juga memiliki volume disk yang dikelola oleh FlexVolume di dalam kluster, lihat Gunakan csi-compatible-controller untuk bermigrasi dari FlexVolume ke CSI.
Catatan penggunaan
Saat bermigrasi dari FlexVolume ke CSI, persistent volume claims (PVC) akan dibuat ulang. Akibatnya, pod akan dimulai ulang dan bisnis Anda terganggu. Disarankan untuk melakukan migrasi selama jam-jam sepi.
Persiapan
Sebelum migrasi, instal CSI secara manual di dalam kluster.
Buat file bernama csi-plugin.yaml dan csi-provisioner.yaml.
Jalankan perintah berikut untuk menerapkan csi-plugin dan csi-provisioner di dalam kluster:
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yamlJalankan perintah berikut untuk memeriksa apakah CSI berjalan normal:
kubectl get pods -nkube-system | grep csiOutput yang Diharapkan:
csi-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 6d20hJika output di atas ditampilkan, CSI berjalan normal.
Prosedur
Contoh ini menunjukkan migrasi volume NAS yang diprovinsi secara statis dari FlexVolume ke CSI menggunakan beban kerja StatefulSet. Gambar berikut menunjukkan alur kerja:

Langkah 1: Periksa status volume di dalam kluster
Jalankan perintah berikut untuk memeriksa status pod:
kubectl get podOutput yang Diharapkan:
NAME READY STATUS RESTARTS AGE oss-sts-1 1/1 Running 0 11mJalankan perintah berikut untuk memeriksa PVC yang digunakan oleh pod:
kubectl describe pod oss-sts-1 |grep ClaimNameOutput yang Diharapkan:
ClaimName: oss-pvcJalankan perintah berikut untuk memeriksa status saat ini dari PVC:
kubectl get pvcOutput yang Diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE oss-pvc Bound oss-pv 5Gi RWX 7m23s
Langkah 2: Buat PVC dan PV untuk volume NAS yang diprovision secara statis yang dikelola oleh CSI
Metode 1: Konversi otomatis melalui CLI Flexvolume2CSI
Konversikan PV dan PVC yang dikelola oleh FlexVolume menjadi PV dan PVC yang dikelola oleh CSI.
Jalankan perintah berikut untuk membuat PVC dan persistent volume (PV) untuk volume OSS:
oss-pv-pvc-csi.yamladalah file YAML yang mendefinisikan PVC dan PV yang dikelola oleh CSI setelah Anda menggunakan CLI Flexvolume2CSI untuk mengonversi PVC dan PV asli.kubectl apply -f oss-pv-pvc-csi.yamlJalankan perintah berikut untuk memeriksa status saat ini dari PVC:
kubectl get pvcOutput yang Diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE oss-pvc-csi Bound oss-pv-csi 5Gi RWO 7m15s oss-pvc Bound oss-pv 5Gi RWX 52m
Metode 2: Konversi manual dengan memodifikasi plug-in volume konfigurasi PVC/PV
Simpan Objek PV dan PVC yang Dikelola oleh FlexVolume.
Jalankan perintah berikut untuk menyimpan objek PVC yang didukung oleh FlexVolume:
kubectl get pvc oss-pvc -oyaml > oss-pvc-flexvolume.yaml cat oss-pvc-flexvolume.yamlOutput yang Diharapkan:
apiVersion: v1 kind: PersistentVolumeClaim name: oss-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi volumeMode: Filesystem volumeName: oss-pvJalankan perintah berikut untuk menyimpan objek PV yang didukung oleh FlexVolume:
kubectl get pv oss-pv -oyaml > oss-pv-flexvolume.yaml cat oss-pv-flexvolume.yamlOutput yang Diharapkan:
apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv spec: accessModes: - ReadWriteMany capacity: storage: 5Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: oss-pvc namespace: default flexVolume: driver: alicloud/oss nodePublishSecretRef: name: oss-secret namespace: default options: bucket: xxx otherOpts: -o max_stat_cache_size=0 -o allow_other url: xxx.aliyuncs.com persistentVolumeReclaimPolicy: Retain volumeMode: Filesystem
Buat volume NAS yang diprovinsi secara statis yang dikelola oleh CSI dengan mendefinisikan PVC dan PV.
Buat file bernama oss-pv-pvc-csi.yaml dan tambahkan konten YAML berikut ke dalam file untuk membuat volume OSS yang diprovinsi secara statis yang dikelola oleh CSI:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oss-pvc-csi spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: oss-pv-csi --- apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv-csi labels: alicloud-pvname: oss-pv-csi spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv-csi nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "***" url: "***.aliyuncs.com" otherOpts: "-o max_stat_cache_size=0 -o allow_other"Jalankan perintah berikut untuk membuat PVC dan PV untuk volume OSS:
kubectl apply -f oss-pv-pvc-csi.yamlJalankan perintah berikut untuk memeriksa status saat ini dari PVC:
kubectl get pvcOutput yang Diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE oss-pvc-csi Bound oss-pv-csi 5Gi RWO 7m15s oss-pvc Bound oss-pv 5Gi RWX 52m
Langkah 3: Ubah PVC yang terkait dengan aplikasi
Jalankan perintah berikut untuk memodifikasi file konfigurasi aplikasi:
kubectl edit sts oss-stsUbah PVC ke yang didukung oleh CSI.
volumes: - name: oss persistentVolumeClaim: claimName: oss-pvc-csiJalankan perintah berikut untuk memeriksa apakah pod telah dimulai ulang:
kubectl get podOutput yang Diharapkan:
NAME READY STATUS RESTARTS AGE oss-sts-1 1/1 Running 0 70sJalankan perintah berikut untuk memeriksa informasi mount:
kubectl exec oss-sts-1 -- mount |grep ossfsOutput yang Diharapkan:
# Lihat informasi mount. ***:/ on /var/lib/kubelet/pods/ac02ea3f-125f-4b38-9bcf-9b117f62eaf0/volumes/kubernetes.io~csi/oss-pv-csi/mount type ossfs (rw,relatime,max_stat_cache_size=0,allow_other)Jika output di atas ditampilkan, pod telah bermigrasi.
Langkah 4: Uninstal FlexVolume
Masuk ke konsol OpenAPI Explorer dan panggil operasi UnInstallClusterAddons untuk menguninstal plug-in FlexVolume.
ClusterId: Atur nilai ke ID kluster Anda. Anda dapat melihat ID kluster pada tab Basic Information halaman detail kluster Anda.
name: Atur nilai ke Flexvolume.
Untuk informasi lebih lanjut, lihat Uninstal Komponen dari Kluster.
Jalankan perintah berikut untuk menghapus komponen alicloud-disk-controller dan alicloud-nas-controller:
kubectl delete deploy -n kube-system alicloud-disk-controller alicloud-nas-controllerJalankan perintah berikut untuk memeriksa apakah plug-in FlexVolume telah diuninstal dari kluster Anda:
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'Jika tidak ada output yang ditampilkan, plug-in FlexVolume telah diuninstal dari kluster Anda.
Jalankan perintah berikut untuk menghapus StorageClass yang menggunakan FlexVolume dari kluster. Provisioner dari StorageClass yang menggunakan FlexVolume adalah alicloud/disk.
kubectl delete storageclass alicloud-disk-available alicloud-disk-efficiency alicloud-disk-essd alicloud-disk-ssdOutput yang Diharapkan:
storageclass.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" deletedJika output di atas ditampilkan, StorageClass telah dihapus dari kluster Anda.
Langkah 5: Panggil API untuk menginstal CSI
Masuk ke konsol OpenAPI Explorer dan panggil InstallClusterAddons untuk menginstal plug-in CSI.
ClusterId: Atur nilai ke ID kluster Anda.
name: Atur nilai ke csi-provisioner.
version: Versi terbaru akan ditentukan secara otomatis. Untuk informasi lebih lanjut tentang versi CSI, lihat csi-provisioner.
Untuk informasi lebih lanjut tentang cara menginstal plug-in CSI, lihat Instal Komponen di dalam Kluster ACK.
Jalankan perintah berikut untuk memeriksa apakah plug-in CSI berjalan sesuai harapan di dalam kluster Anda:
kubectl get pods -n kube-system | grep csiOutput yang Diharapkan:
csi-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 6d20hJika output di atas ditampilkan, plug-in CSI berjalan sesuai harapan di dalam kluster.
Langkah 6: Modifikasi konfigurasi node yang ada
Gunakan template YAML berikut untuk memodifikasi parameter Kubelet agar kompatibel dengan plug-in CSI. DaemonSet ini dapat mengubah nilai parameter kubelet --enable-controller-attach-detach dari node yang ada menjadi true. Setelah langkah ini selesai, DaemonSet dapat dihapus.
Saat Anda menerapkan file YAML, kubelet akan dimulai ulang. Disarankan untuk mengevaluasi dampaknya pada aplikasi sebelum menerapkan file 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