El plugin FlexVolume quedó obsoleto y ya no es compatible con los clústeres nuevos de Container Service for Kubernetes (ACK). Migre sus volúmenes persistentes (PV) y solicitudes de volumen persistente (PVC) de File Storage NAS (NAS), aprovisionados de forma estática, de FlexVolume a Container Storage Interface (CSI). De esta manera mantendrá la compatibilidad del plugin y accederá a las nuevas funciones de almacenamiento.
Si su clúster también tiene volúmenes de disco gestionados por FlexVolume, utilice csi-compatible-controller.
Impactos
Los PVC se vuelven a crear durante la migración, lo que provoca el reinicio de los pods.
Los reinicios de los pods interrumpen las cargas de trabajo en ejecución. Lleve a cabo la migración fuera del horario de mayor demanda.
Comparación entre FlexVolume y CSI
|
Atributo |
CSI |
FlexVolume |
|
Componentes |
CSI-Provisioner (Deployment): creación automática de volúmenes e instantáneas, almacenamiento CNFS y restauración de datos tras eliminaciones accidentales. CSI-Plugin (DaemonSet): montaje y desmontaje automático de volúmenes. Admite de forma predeterminada volúmenes de disco, NAS y OSS. |
Disk-Controller (Deployment): creación automática de volúmenes. FlexVolume (DaemonSet): montaje y desmontaje de volúmenes. Admite de forma predeterminada volúmenes de disco, NAS y OSS. |
|
Parámetro de kubelet |
Se debe establecer |
Se debe establecer |
|
Referencias |
Requisitos previos
Instale el plugin CSI en su clúster antes de empezar.
-
Cree los archivos
csi-plugin.yamlycsi-provisioner.yaml. -
Despliegue csi-plugin y csi-provisioner en el clúster:
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yaml -
Compruebe que CSI se esté ejecutando: Resultado esperado: si todos los pods muestran
Running, CSI está instalado.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
Procedimiento
A continuación se muestra un ejemplo de migración para una carga de trabajo StatefulSet. La siguiente imagen ilustra el flujo de trabajo:

Paso 1: Comprobar el estado del volumen
-
Consulte el estado del pod: Resultado esperado:
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 11m -
Busque el nombre del PVC que utiliza el pod: Resultado esperado:
kubectl describe pod nas-static-1 |grep ClaimNameClaimName: nas-pvc -
Revise el estado del PVC: Resultado esperado:
kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX 7m23s
Paso 2: Crear un PV y un PVC gestionados por CSI
Cree un PV y un PVC nuevos, gestionados por CSI, que apunten al mismo sistema de archivos NAS. Elija una de las siguientes opciones.
Opción A: Conversión automatizada (CLI FlexVolume2CSI)
Utilice la CLI FlexVolume2CSI para convertir las definiciones de PV y PVC gestionadas por FlexVolume a sus equivalentes gestionados por CSI. Esta herramienta genera un archivo llamado
nas-pv-pvc-csi.yaml.-
Aplique el archivo generado:
kubectl apply -f nas-pv-pvc-csi.yaml -
Compruebe el estado del PVC: Resultado esperado:
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
Opción B: Conversión manual
-
Respalde las definiciones actuales de PV y PVC de FlexVolume. Guarde el PVC: Resultado esperado: Guarde el PV: Resultado esperado:
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 -
Cree un PV y un PVC gestionados por CSI. Genere un archivo llamado
nas-pv-pvc-csi.yamlcon el siguiente contenido: Aplique el archivo: Compruebe el estado del PVC: Resultado esperado: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
Paso 3: Actualizar la aplicación
-
Edite la configuración del StatefulSet:
kubectl edit sts nas-static -
Actualice la solicitud de volumen para que haga referencia al PVC gestionado por CSI:
volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-csi -
Confirme que el pod se reinicie: Resultado esperado:
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 70s -
Compruebe que el volumen NAS se monte mediante CSI: Si la migración fue exitosa, el resultado mostrará
kubernetes.io~csien la ruta de montaje: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)
Paso 4: Desinstalar FlexVolume
-
Inicie sesión en la consola de OpenAPI Explorer y llame a la operación UnInstallClusterAddons para desinstalar el plugin FlexVolume. Para obtener más información, consulte Desinstalar componentes de un clúster.
ClusterId: El ID de su clúster. Lo encontrará en la pestaña Basic Information de la página de detalles del clúster.
name: Establezca este valor en
flexvolume.
-
Elimine los componentes alicloud-disk-controller y alicloud-nas-controller:
kubectl delete deploy -n kube-system alicloud-disk-controller alicloud-nas-controller -
Compruebe que FlexVolume se haya desinstalado por completo: Si no se devuelve ningún resultado, significa que FlexVolume se eliminó correctamente.
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller' -
Elimine las StorageClasses de FlexVolume (provisioner:
alicloud/disk): Resultado esperado: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
Paso 5: Instalar CSI mediante la API
-
Inicie sesión en la consola de OpenAPI Explorer y llame a la operación InstallClusterAddons para instalar CSI. Para obtener más información, consulte Instalar un componente en un clúster de ACK.
ClusterId: El ID de su clúster.
name: Establezca este valor en
csi-provisioner.version: La versión más reciente se especifica automáticamente. Para conocer los detalles de las versiones, consulte csi-provisioner.
-
Compruebe que CSI se esté ejecutando: Resultado esperado: si todos los pods muestran
Running, CSI está instalado.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
Paso 6: Actualizar las configuraciones de los nodos
Despliegue un DaemonSet para establecer el parámetro de kubelet --enable-controller-attach-detach en true en todos los nodos existentes. Elimine el DaemonSet cuando finalice la actualización.
Este DaemonSet reinicia kubelet en cada nodo. Evalúe el impacto en las aplicaciones en ejecución antes de continuar.
Cree un archivo con el siguiente contenido y aplíquelo con 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