Le plug-in FlexVolume est obsolète et n'est plus pris en charge dans les nouveaux clusters Container Service for Kubernetes (ACK). Migrez vos volumes persistants (PV) et vos revendications de volume persistant (PVC) File Storage NAS (NAS) pré-provisionnés statiquement de FlexVolume vers Container Storage Interface (CSI) afin de maintenir la prise en charge du plug-in et d'accéder aux nouvelles fonctionnalités de stockage.
Si votre cluster contient également des volumes de disque gérés par FlexVolume, utilisez plutôt le contrôleur csi-compatible-controller.
Impacts
Les PVC sont recréés pendant la migration, ce qui entraîne le redémarrage des pods.
Les redémarrages de pod interrompent les charges de travail en cours d'exécution. Effectuez la migration pendant les heures creuses.
Comparaison entre FlexVolume et CSI
| Attribut | CSI | FlexVolume |
|---|---|---|
| Composants | CSI-Provisioner (Deployment) : création automatique de volumes, création de snapshots, stockage CNFS, restauration des données après suppression accidentelle. CSI-Plugin (DaemonSet) : montage et démontage automatiques des volumes. Prend en charge par défaut les volumes de disque, NAS et OSS. | Disk-Controller (Deployment) : création automatique de volumes. FlexVolume (DaemonSet) : montage et démontage des volumes. Prend en charge par défaut les volumes de disque, NAS et OSS. |
| Paramètre kubelet | Le paramètre enable-controller-attach-detach doit être défini sur true sur chaque nœud. |
Le paramètre enable-controller-attach-detach doit être défini sur true sur chaque nœud. |
| Références | Stockage | Présentation de FlexVolume |
Prérequis
Installez le plug-in CSI dans votre cluster avant de commencer.
-
Créez des fichiers nommés
csi-plugin.yamletcsi-provisioner.yaml. -
Déployez csi-plugin et csi-provisioner dans le cluster :
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yaml -
Vérifiez que CSI est en cours d'exécution : Sortie attendue : Si tous les pods affichent l'état
Running, CSI est installé.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
Procédure
L'exemple suivant illustre la migration pour une charge de travail StatefulSet. La figure ci-dessous présente le flux de travail :

Étape 1 : Vérifier l'état du volume
-
Interrogez l'état du pod : Sortie attendue :
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 11m -
Recherchez le nom du PVC utilisé par le pod : Sortie attendue :
kubectl describe pod nas-static-1 |grep ClaimNameClaimName: nas-pvc -
Vérifiez l'état du PVC : Sortie attendue :
kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX 7m23s
Étape 2 : Créer un PV et un PVC gérés par CSI
Créez un nouveau PV et un nouveau PVC gérés par CSI qui pointent vers le même système de fichiers NAS. Choisissez l'une des options suivantes.
Option A : Conversion automatisée (CLI FlexVolume2CSI)
Utilisez la CLI FlexVolume2CSI pour convertir les définitions de PV et de PVC gérées par FlexVolume en équivalents gérés par CSI. L'outil génère un fichier nommé
nas-pv-pvc-csi.yaml.-
Appliquez le fichier généré :
kubectl apply -f nas-pv-pvc-csi.yaml -
Vérifiez l'état du PVC : Sortie attendue :
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
Option B : Conversion manuelle
-
Sauvegardez les définitions existantes de PV et de PVC FlexVolume. Sauvegardez le PVC : Sortie attendue : Sauvegardez le PV : Sortie attendue :
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: nas -
Créez un PV et un PVC gérés par CSI. Créez un fichier nommé
nas-pv-pvc-csi.yamlavec le contenu suivant : Appliquez le fichier : Vérifiez l'état du PVC : Sortie attendue :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
Étape 3 : Mettre à jour l'application
-
Modifiez la configuration du StatefulSet :
kubectl edit sts nas-static -
Mettez à jour la revendication de volume pour référencer le PVC géré par CSI :
volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-csi -
Confirmez le redémarrage du pod : Sortie attendue :
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 70s -
Vérifiez que le volume NAS est monté via CSI : Si la migration a réussi, la sortie affiche
kubernetes.io~csidans le chemin de montage :kubectl exec nas-static-1 -- mount |grep nas# View the mount information ***.***.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)
Étape 4 : Désinstaller FlexVolume
-
Connectez-vous à la console OpenAPI Explorer et appelez l'opération UnInstallClusterAddons pour désinstaller le plug-in FlexVolume. Pour plus d'informations, consultez la rubrique Désinstallation de composants d'un cluster.
ClusterId: ID de votre cluster. Vous pouvez le trouver dans l'onglet Basic Information de la page des détails de votre cluster.
name: Définissez la valeur sur
flexvolume.
-
Supprimez les composants alicloud-disk-controller et alicloud-nas-controller :
kubectl delete deploy -n kube-system alicloud-disk-controller alicloud-nas-controller -
Vérifiez que FlexVolume est entièrement désinstallé : Si aucune sortie n'est renvoyée, FlexVolume a été complètement supprimé.
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller' -
Supprimez les StorageClasses FlexVolume (provisioner :
alicloud/disk) : Sortie attendue :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
Étape 5 : Installer CSI via l'API
-
Connectez-vous à la console OpenAPI Explorer et appelez l'opération InstallClusterAddons pour installer CSI. Pour plus d'informations, consultez la rubrique Installation d'un composant dans un cluster ACK.
ClusterId: ID de votre cluster.
name: Définissez la valeur sur
csi-provisioner.version: La dernière version est automatiquement spécifiée. Pour plus de détails sur les versions, consultez la rubrique csi-provisioner.
-
Vérifiez que CSI est en cours d'exécution : Sortie attendue : Si tous les pods affichent l'état
Running, CSI est installé.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
Étape 6 : Mettre à jour les configurations des nœuds
Déployez un DaemonSet pour définir le paramètre kubelet --enable-controller-attach-detach sur true sur tous les nœuds existants. Supprimez le DaemonSet une fois la mise à jour terminée.
Ce DaemonSet redémarre kubelet sur chaque nœud. Évaluez l'impact sur les applications en cours d'exécution avant de poursuivre.
Créez un fichier avec le contenu suivant et appliquez-le avec 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