全部产品
Search
文档中心

Container Service for Kubernetes:Migrasi FlexVolume ke CSI untuk kluster yang tidak menyimpan data

更新时间:Jul 30, 2025

FlexVolume sudah tidak digunakan lagi di Container Service for Kubernetes (ACK) dan tidak didukung di kluster ACK baru. Kami menyarankan Anda memigrasikan FlexVolume di kluster ACK yang ada ke Container Storage Interface (CSI). Untuk migrasi ini, Anda dapat menguninstall FlexVolume lalu menginstal plugin CSI, serta memodifikasi konfigurasi kelompok node atau node yang ada. Topik ini menjelaskan cara memigrasikan FlexVolume ke CSI untuk kluster tanpa data tersimpan.

Perbedaan antara FlexVolume dan CSI

Tabel berikut menggambarkan perbedaan antara CSI dan FlexVolume.

Plug-in

Komponen

Parameter kubelet

Referensi

CSI

  • CSI-Provisioner (diterapkan sebagai Deployment)

    Komponen ini digunakan untuk mengimplementasikan pembuatan volume otomatis dan pembuatan snapshot otomatis. Komponen ini juga mendukung Container Network File System (CNFS) penyimpanan dan pemulihan data setelah data terhapus secara tidak sengaja.

  • CSI-Plugin (diterapkan sebagai DaemonSet)

    Komponen ini digunakan untuk mengimplementasikan pemasangan dan pelepasan volume otomatis. Beberapa jenis volume disk didukung.

Parameter kubelet yang diperlukan oleh plugin CSI berbeda dari yang diperlukan oleh plugin FlexVolume.

Untuk menjalankan plugin CSI, Anda harus mengatur parameter kubelet enable-controller-attach-detach menjadi true pada setiap node.

Penyimpanan

FlexVolume

  • Disk-Controller (diterapkan sebagai Deployment)

    Komponen ini digunakan untuk mengimplementasikan pembuatan volume otomatis.

  • FlexVolume (diterapkan sebagai DaemonSet)

    Komponen ini digunakan untuk mengimplementasikan pemasangan dan pelepasan volume.

Parameter kubelet yang diperlukan oleh plugin FlexVolume berbeda dari yang diperlukan oleh plugin CSI.

Untuk menjalankan plugin FlexVolume, Anda harus mengatur parameter kubelet enable-controller-attach-detach menjadi true pada setiap node.

Ikhtisar FlexVolume

Skenario

Plugin CSI lebih stabil dan efisien dibandingkan dengan plugin FlexVolume. Dalam skenario berikut, kami menyarankan Anda memigrasikan FlexVolume ke CSI:

  • Tidak ada volume yang telah dipasang menggunakan FlexVolume dan tidak ada data yang disimpan di kluster menggunakan FlexVolume.

  • Volume telah dipasang menggunakan FlexVolume tetapi data relevan dalam volume tersebut telah dihapus. Tidak ada data yang tersimpan di kluster menggunakan FlexVolume.

Langkah 1: Uninstall FlexVolume

  1. Masuk ke Konsol OpenAPI Explorer dan panggil operasi UnInstallClusterAddons untuk menguninstall plugin FlexVolume.

    • ClusterId: Atur nilainya menjadi ID kluster Anda. Anda dapat melihat ID kluster di tab Basic Information halaman detail kluster Anda.

    • name: Atur nilainya menjadi FlexVolume.

    Untuk informasi lebih lanjut, lihat Uninstall Komponen dari Kluster.

  2. Jalankan perintah berikut untuk menghapus komponen alicloud-disk-controller dan alicloud-nas-controller:

    kubectl delete deploy -n kube-system alicloud-disk-controller alicloud-nas-controller
  3. Jalankan perintah berikut untuk memeriksa apakah plugin FlexVolume telah di-uninstall dari kluster Anda:

    kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'

    Jika tidak ada output yang ditampilkan, plugin FlexVolume telah di-uninstall dari kluster Anda.

  4. 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-ssd

    Output 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" deleted

    Jika output di atas ditampilkan, StorageClass telah dihapus dari kluster Anda.

Langkah 2: Instal plugin CSI

  • Jika Anda menggunakan plugin csi-compatible-controller di kluster, plugin CSI sudah terinstal di kluster tersebut. Namun, plugin CSI ini adalah plugin CSI kustom, bukan plugin CSI standar. Anda harus menjalankan perintah berikut untuk menghapus plugin CSI kustom sebelum menginstal plugin CSI standar:

    kubectl delete deploy csi-provisioner -n kube-system
    kubectl delete ds csi-plugin -n kube-system
    kubectl delete csidriver diskplugin.csi.alibabacloud.com nasplugin.csi.alibabacloud.com ossplugin.csi.alibabacloud.com
    Catatan

    Saat Anda menghapus plugin CSI kustom dari kluster, pod yang ada di kluster tidak terpengaruh. Namun, setelah plugin CSI kustom dihapus, pod di kluster tidak dapat diubah hingga plugin CSI standar diinstal.

  • Jika Anda tidak menggunakan plugin csi-compatible-controller di kluster, Anda dapat memanggil operasi API untuk menginstal plugin CSI standar.

  1. Masuk ke Konsol OpenAPI Explorer dan panggil InstallClusterAddons untuk menginstal plugin CSI.

    • ClusterId: Atur nilainya menjadi ID kluster Anda.

    • name: Atur nilainya menjadi 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 plugin CSI, lihat Instal Komponen di Kluster ACK.

  2. Jalankan perintah berikut untuk memeriksa apakah plugin CSI berjalan sesuai harapan di kluster Anda:

    kubectl get pods -n kube-system | grep csi

    Output 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          6d20h

    Jika output di atas ditampilkan, plugin CSI berjalan sesuai harapan di kluster.

Langkah 3: Modifikasi konfigurasi semua kelompok node di kluster

Konfigurasi kelompok node berubah setelah plugin volume kluster berubah. Setelah Anda menginstal plugin CSI standar baru di kluster Anda, konfigurasi kelompok node asli di kluster tidak otomatis berubah. Dalam kasus ini, Anda perlu memperbarui konfigurasi kelompok node ini secara manual. Jika pembaruan berhasil, parameter kubelet --enable-controller-attach-detach diatur menjadi true pada node yang baru ditambahkan.

Penting

Memodifikasi konfigurasi kelompok node secara manual memicu kubelet untuk restart. Kami menyarankan Anda melakukan operasi ini selama jam-jam sepi dan memastikan bahwa pembaruan pada satu kelompok node benar sebelum memperbarui kelompok node lainnya.

Anda dapat memodifikasi konfigurasi setiap kelompok node untuk memperbarui plugin volume dengan menambahkan tipe instans baru atau mengubah kata sandi logon. Dengan cara ini, sistem secara otomatis memperbarui skrip inisialisasi node di latar belakang untuk memastikan bahwa node yang baru ditambahkan menggunakan konfigurasi baru.

Catatan

Sebagai alternatif, Anda dapat membuat kelompok node baru dan menskalakan semua node di kelompok node asli hingga kelompok node lama dihapus. Kemudian, gunakan langsung kelompok node baru. Jika Anda menggunakan metode ini, Anda tidak perlu melakukan langkah-langkah berikut.

  1. Masuk ke Konsol ACK. Di panel navigasi di sebelah kiri, klik Clusters.

  2. Di halaman Clusters, temukan kluster yang ingin dikelola dan klik namanya. Di panel navigasi di sebelah kiri, pilih Nodes > Node Pools.

  3. Di halaman Node Pools, temukan kelompok node target dan klik Edit di kolom Actions.

  4. Di kotak dialog yang muncul, modifikasi konfigurasi kelompok node, lalu klik Confirm.

    Catatan

    Modifikasi ini dimaksudkan untuk memicu pembaruan plugin volume kluster di latar belakang. Setelah perubahan konfigurasi kelompok node mulai berlaku, Anda dapat kembali ke pengaturan semula.

Langkah 4: Modifikasi konfigurasi node yang ada

Gunakan template YAML berikut untuk memodifikasi parameter Kubelet agar kompatibel dengan plugin 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.

Penting

Saat Anda menerapkan file YAML, kubelet di-restart. Kami menyarankan Anda mengevaluasi dampak 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

Apa yang harus dilakukan selanjutnya

Setelah memigrasikan FlexVolume ke CSI, Anda dapat memeriksa apakah plugin CSI berjalan sesuai harapan dengan menggunakan plugin CSI untuk membuat volume disk yang diaprovisi secara dinamis. Untuk informasi lebih lanjut, lihat Gunakan Volume Disk yang Diprovisi Secara Dinamis.