Migración del plugin de volumen FlexVolume al plugin de volumen CSI
Descubra cómo migrar una carga de trabajo de Kubernetes (gestionada por StatefulSet) del plugin de volumen FlexVolume al plugin de volumen CSI.
- El proyecto ascendente de Kubernetes descarta el plugin de volumen FlexVolume en la versión 1.23 de Kubernetes.
- La nueva funcionalidad solo se está agregando al plugin de volumen CSI, no al plugin de volumen FlexVolume.
- El plugin de volumen CSI no requiere acceso a dependencias subyacentes del sistema operativo y del sistema de archivos raíz.
En Kubernetes, una forma de gestionar aplicaciones con estado que requieren almacenamiento persistente es utilizar objetos StatefulSet. Para obtener más información sobre los objetos StatefulSet, consulte StatefulSets en la documentación de Kubernetes.
Si tiene una aplicación con estado que requiere almacenamiento persistente y StatefulSet que gestiona la aplicación está utilizando actualmente el plugin de volumen FlexVolume para aprovisionar un volumen persistente, le recomendamos que migre la carga de trabajo para utilizar el plugin de volumen CSI en su lugar.
En esta sección, se proporcionan pasos genéricos para migrar una carga de trabajo (gestionada por StatefulSet) del plugin de volumen FlexVolume al plugin de volumen CSI, de la siguiente manera:
- Paso 1: Cambie la política de recuperación de los objetos PV FlexVolume existentes a "Retain" (Retener).
- Paso 2: Crear nuevos objetos PV de CSI y enlazarlos a volúmenes en bloque
- Paso 3: Crear nuevos objetos CSI PVC y enlazarlos a los objetos CSI PV
- Paso 4: Vuelva a crear el objeto StatefulSet para utilizar los nuevos objetos de PVC CSI
- Paso 5: Suprima los objetos PVC y PV originales FlexVolume
Esta sección también incluye un ejemplo totalmente práctico, para que pueda ver los pasos de la práctica. Consulte Ejemplo de migración de una carga de trabajo del plugin de volumen FlexVolume al plugin de volumen CSI.
Tenga en cuenta que en esta sección:
- Los volúmenes persistentes y las reclamaciones de volúmenes persistentes creadas por el plugin de volumen FlexVolume se denominan PV FlexVolume y PVC FlexVolume, respectivamente.
- Los volúmenes persistentes y las reclamaciones de volúmenes persistentes creadas por el plugin de volumen CSI se denominan PV CSI y PVC CSI respectivamente.
Paso 1: Cambie la política de reclamación de los objetos PV FlexVolume existentes a "Retener"
-
Para averiguar los nombres de los PV FlexVolume enlazados a las PVC FlexVolume en StatefulSet, introduzca:
kubectl get pvc -
Cambie la política de reclamación de los objetos PV FlexVolume existentes a
Retainpara evitar que los volúmenes en bloque que realizan la copia de seguridad de los PV se supriman durante la migración introduciendo:kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' -
Confirme que se ha actualizado cada PV FlexVolume introduciendo:
kubectl get pv <volume-name> -
Verifique que la salida muestre que la política de reclamación se ha definido en Retener para cada PV FlexVolume.
Importante
Vuelva a comprobar que la política de reclamación se ha definido en Retener para cada PV FlexVolume. Si la política de reclamación no está definida en Retener, el volumen en bloque que realiza la copia de seguridad del PV FlexVolume se suprimirá durante la migración.
Paso 2: Crear nuevos objetos CSI PV y enlazarlos a volúmenes en bloque
- Cree un nuevo archivo de manifiesto PV.
-
Para cada objeto PV FlexVolume existente, copie la siguiente definición PV de plantilla en el archivo para definir un nuevo objeto PV CSI correspondiente:
kind: PersistentVolume apiVersion: v1 metadata: name: <new-pv-name> annotations: pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com spec: storageClassName: oci-bv persistentVolumeReclaimPolicy: Retain capacity: storage: <original-pv-storage> accessModes: - ReadWriteOnce csi: driver: blockvolume.csi.oraclecloud.com fsType: <original-pv-fs-type> volumeHandle: <original-pv-volume-ocid> nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - <original-pv-ad-location> -
Para cada nueva definición de objeto CSI PV, proporcione los siguientes valores:
- Defina
metadata.nameen una cadena de su elección para el nombre del nuevo objeto PV de CSI. - Defina
spec.capacity.storageen la capacidad de PV FlexVolume existente. Por ejemplo,50Gi - Defina
spec.csi.fstypeen el tipo de sistema de archivos que realiza una copia de seguridad del PV FlexVolume existente. Por ejemplo,ext4.Consejo: si no está seguro del tipo de sistema de archivos que realiza una copia de seguridad del PV FlexVolume existente, consulte los detalles del PV FlexVolume introduciendo:kubectl get pv <original-pv-name> -o yaml - Defina
spec.csi.volumeHandleen el OCID del volumen en bloque original que realiza la copia de seguridad del PV FlexVolume existente. El OCID también se ha utilizado como nombre del PV FlexVolume. Por ejemplo,ocid1.volume.oc1.phx.aaaaaa______xbd - Defina
spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone.valuesen el dominio de disponibilidad para el PV de CSI, según el valor defailure-domain.beta.kubernetes.io/zonedel PV flexible. Por ejemplo,PHX-AD-1.Consejo: si no está seguro del valor defailure-domain.beta.kubernetes.io/zonedel PV flexible existente, consulte los detalles del PV FlexVolume introduciendo:kubectl get pv <original-pv-name> -o yaml
Tenga en cuenta que en la plantilla,
spec.storageClassNameya está definido en la clase de almacenamiento utilizada por el plugin de volumen CSI (oci-bv).Por ejemplo:
kind: PersistentVolume apiVersion: v1 metadata: name: csi-pv-web-app-0 annotations: pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com spec: storageClassName: oci-bv persistentVolumeReclaimPolicy: Retain capacity: storage: 50Gi accessModes: - ReadWriteOnce csi: driver: blockvolume.csi.oraclecloud.com fsType: ext4 volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbd nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - PHX-AD-1 - Defina
-
Cree los nuevos objetos PV de CSI introduciendo:
kubectl apply -f <pv-manifest-filename>.yaml -
Confirme que los nuevos objetos PV de CSI se hayan creado introduciendo:
kubectl get pv -
Verifique que la salida muestre:
- Un nuevo objeto PV de CSI para cada objeto PV FlexVolume.
- Todos los objetos PV de CSI nuevos tienen el estado
Available.
Paso 3: Crear nuevos objetos CSI PVC y enlazarlos a los objetos CSI PV
Ahora definirá un nuevo objeto CSI PVC para cada objeto CSI PV que haya creado en el paso anterior:
- Cree un nuevo archivo de manifiesto de PVC.
-
Para cada objeto de PVC FlexVolume existente, copie la siguiente definición de PVC de plantilla en el nuevo archivo para definir un nuevo objeto de PVC CSI:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: <new-pvc-name> spec: accessModes: - ReadWriteOnce resources: requests: storage: <original-pvc-size> volumeName: <new-pv-name> storageClassName: oci-bv - Para cada nueva definición de objeto CSI PVC, proporcione los valores siguientes:
- Defina
metadata.namepara especificar el nombre de la nueva PVC CSI con el siguiente formato:<new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>donde:
-
<new-volumeClaimTemplates.metadata.name>es una cadena de su elección para ser la primera parte del nombre de la nueva PVC CSI. La cadena que especifique aquí debe ser diferente del valorvolumeClaimTemplates.metadata.nameoriginal en el manifiesto StatefulSet. En el Paso 4: Vuelva a crear el objeto StatefulSet para utilizar los nuevos objetos de PVC CSI, actualice el manifiesto StatefulSet y especifique esta cadena como valor devolumeClaimTemplates.metadata.name. -
<statefulset-name>es el nombre de StatefulSet que gestiona la aplicación. -
<index>es un número ordinal, que comienza en 0 y se incrementa en 1 para el número de réplicas especificado en StatefulSet.
-
- Defina
spec.resources.requests.storageen el mismo valor que el especificado para la PVC FlexVolume. Por ejemplo,50Gi - Defina
spec.volumeNameen el nombre que ha especificado como nombre del nuevo objeto PV de CSI en el Step 2: Create new CSI PV objects and bind them to block volume.
Tenga en cuenta que en la plantilla,
spec.storageClassNameya está definido en la clase de almacenamiento utilizada por el plugin de volumen CSI (oci-bv).Por ejemplo:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: storage-csi-web-app-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi volumeName: csi-pv-web-app-0 storageClassName: oci-bv - Defina
-
Cree los nuevos objetos CSI PVC introduciendo:
kubectl apply -f <pvc-manifest-filename>.yaml -
Confirme que los nuevos objetos CSI PVC se hayan creado y enlazado a los objetos CSI PV introduciendo:
kubectl get pvc -
Verifique que la salida muestre:
- Se ha creado un objeto PVC CSI para cada objeto PVC FlexVolume.
- Todos los objetos PVC CSI tienen el estado
Bound. - Cada objeto CSI PVC está enlazado al objeto CSI PV especificado en el manifiesto.
Paso 4: Vuelva a crear el objeto StatefulSet para utilizar los nuevos objetos CSI PVC
- Cree un nuevo manifiesto StatefulSet copiando el archivo que contiene el manifiesto del archivo StatefulSet existente y guarde el nuevo archivo de manifiesto con un nuevo nombre.
-
Actualice el nuevo manifiesto para que StatefulSet utilice las nuevas PVC de CSI que creó en el Step 3: Create new CSI PVC objects and bind them to the CSI PV objects, de la siguiente manera:
- Cambie
spec.template.spec.containers.volumeMounts.namepor la cadena que haya elegido como primera parte de los nuevos nombres PVC de CSI. - Cambie
spec.volumeClaimTemplates.metadata.namepor la cadena que haya elegido como primera parte de los nuevos nombres PVC de CSI. - Cambie
spec.volumeClaimTemplates.spec.storageClassNameaoci-bv(la clase de almacenamiento utilizada por el plugin de volumen CSI).
- Cambie
-
Suprima el objeto StatefulSet existente introduciendo:
kubectl delete statefulsets <statefulset-name> -
Cree un nuevo objeto StatefulSet a partir del nuevo manifiesto introduciendo:
kubectl apply -f <statefulset-manifest-filename>
Paso 5: Suprima los objetos PVC y PV FlexVolume originales
Después de cambiar persistentVolumeReclaimPolicy del PV de FlexVolume a Retener en el Step 1: Change the reclaim policy of existing FlexVolume PV objects to "Retain" y de completar los otros pasos de esta sección, ahora puede suprimir los objetos PV y PVC originales de FlexVolume.
-
Para cada objeto PV FlexVolume, suprima el objeto PV introduciendo:
kubectl delete pv <flexvolume-pv-name> -
Para cada objeto PVC FlexVolume, suprima el objeto PVC introduciendo:
kubectl delete pvc <flexvolume-pvc-name>
Ejemplo de migración de una carga de trabajo del plugin de volumen FlexVolume al plugin de volumen CSI
En este ejemplo se muestra cómo migrar una carga de trabajo de ejemplo del plugin de volumen FlexVolume al plugin de volumen CSI. En las instrucciones de este ejemplo se asume una carga de trabajo gestionada por un objeto StatefulSet denominado web-app.
Ejemplo de carga de trabajo StatefulSet
Inicialmente, StatefulSet utiliza el plugin de volumen FlexVolume para aprovisionar el almacenamiento. El StatefulSet original se define en flex-statefulset.yaml de la siguiente manera:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-app
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
name: web
volumeMounts:
- name: storage-flex
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
name: storage-flex
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: oci
volumeMode: Filesystem
El manifiesto StatefulSet original define:
- Nombre de StatefulSet como
web-app(valor demetadata.name). - Nombre de volumeClaimTemplate como
storage-flex(valor devolumeClaimTemplates.metadata.name). - Tres réplicas (el valor de
spec.replicas).
Al crear PVC para StatefulSet, Kubernetes utiliza la siguiente convención para asignar un nombre a las PVC:
<volumeClaimTemplate-name>-<StatefulSet-name>-<index>
donde:
-
<volumeClaimTemplate-name>es el nombre de volumeClaimTemplate especificado por el valor devolumeClaimTemplates.metadata.nameen el manifiesto StatefulSet. En este ejemplo,storage-flex. -
<StatefulSet-name>es el nombre de StatefulSet especificado por el valor demetadata.nameen el manifiesto StatefulSet. En este ejemplo,web-app. -
<index>es un número ordinal, que comienza en 0 y se incrementa en 1 para el número de réplicas especificado en StatefulSet. En este ejemplo, se especifican tres réplicas.
Por lo tanto, cuando Kubernetes creó las PVC FlexVolume originales para web-app StatefulSet, creó tres PVC con los siguientes nombres:
-
storage-flex-web-app-0 -
storage-flex-web-app-1 -
storage-flex-web-app-2
Ejemplo Paso 1: Cambie la política de reclamación de los objetos PV FlexVolume existentes a "Retener"
-
Para averiguar los nombres de los tres PV FlexVolume enlazados a las tres PVC FlexVolume en StatefulSet, introduzca:
kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE storage-flex-web-app-0 Bound ocid1.volume.oc1.phx.aaaaaa______xbd 50Gi RWO oci <unset> 9m28s storage-flex-web-app-1 Bound ocid1.volume.oc1.phx.aaaaaa______xbe 50Gi RWO oci <unset> 2m59s storage-flex-web-app-2 Bound ocid1.volume.oc1.phx.aaaaaa______xbf 50Gi RWO oci <unset> 2m3s -
Puede cambiar la política de reclamación de los tres objetos PV FlexVolume existentes a
Retainpara evitar que los volúmenes en bloque que realizan la copia de seguridad de los PV se supriman durante la migración introduciendo:kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'En este ejemplo:
kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbd -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbd patchedkubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbe -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbe patchedkubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbf -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbf patched -
Confirme que se ha actualizado cada PV FlexVolume introduciendo:
kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE ocid1.volume.oc1.phx.aaaaaa______xbd 50Gi RWO Retain Bound default/storage-flex-web-app-0 oci <unset> 13m ocid1.volume.oc1.phx.aaaaaa______xbe 50Gi RWO Retain Bound default/storage-flex-web-app-2 oci <unset> 6m8s ocid1.volume.oc1.phx.aaaaaa______xbf 50Gi RWO Retain Bound default/storage-flex-web-app-1 oci <unset> 7m8s -
Verifique que la salida muestre que la política de reclamación se ha definido en Retener para cada PV FlexVolume.
Importante
Vuelva a comprobar que la política de reclamación se ha definido en Retener para cada PV FlexVolume. Si la política de reclamación no está definida en Retener, el volumen en bloque que realiza la copia de seguridad del PV FlexVolume se suprimirá durante la migración.
Ejemplo Paso 2: Crear nuevos objetos CSI PV y enlazarlos a volúmenes en bloque
-
Cree un nuevo archivo de manifiesto PV y guárdelo como migrado-csi-pv.yaml.
-
Para cada uno de los tres objetos PV FlexVolume existentes, copie la siguiente definición PV de plantilla en el archivo migrado-CSI-pv.yaml para definir un nuevo objeto PV CSI correspondiente.
kind: PersistentVolume apiVersion: v1 metadata: name: <new-pv-name> annotations: pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com spec: storageClassName: oci-bv persistentVolumeReclaimPolicy: Retain capacity: storage: <original-pv-storage> accessModes: - ReadWriteOnce csi: driver: blockvolume.csi.oraclecloud.com fsType: <original-pv-fs-type> volumeHandle: <original-pv-volume-ocid> nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - <original-pv-ad-location> -
Para cada nueva definición de objeto CSI PV, proporcione los valores siguientes:
- Defina
metadata.nameen una cadena de su elección para el nombre del nuevo objeto PV de CSI. En este ejemplo, asigne a los nuevos objetos PV de CSI el nombrecsi-pv-web-app-0,csi-pv-web-app-1ycsi-pv-web-app-2. - Defina
spec.capacity.storageen la capacidad de PV FlexVolume existente. En este ejemplo, especifique50Gipara los tres nuevos objetos PV de CSI. - Defina
spec.csi.fstypeen el tipo de sistema de archivos que realiza una copia de seguridad del PV FlexVolume existente. En este ejemplo, especifiqueext4para los tres nuevos objetos PV de CSI. - Defina
spec.csi.volumeHandleen el OCID del volumen en bloque original que realiza la copia de seguridad del PV FlexVolume existente. El OCID también se ha utilizado como nombre del objeto PV FlexVolume. En este ejemplo, especifique los siguientes OCID para los tres nuevos objetos PV de CSI:-
ocid1.volume.oc1.phx.aaaaaa______xbd -
ocid1.volume.oc1.phx.aaaaaa______xbe -
ocid1.volume.oc1.phx.aaaaaa______xbf
-
- Defina
spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zoneen el dominio de disponibilidad para el PV de CSI, según el valor defailure-domain.beta.kubernetes.io/zonedel PV flexible. En este ejemplo, se especifican los siguientes dominios de disponibilidad para los tres nuevos objetos PV de CSI:-
PHX-AD-1 -
PHX-AD-2 -
PHX-AD-3
-
Una vez introducida la información, el archivo migrado-CSI-pv.yaml contiene las siguientes tres definiciones de CSI PV:
kind: PersistentVolume apiVersion: v1 metadata: name: csi-pv-web-app-0 annotations: pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com spec: storageClassName: oci-bv persistentVolumeReclaimPolicy: Retain capacity: storage: 50Gi accessModes: - ReadWriteOnce csi: driver: blockvolume.csi.oraclecloud.com fsType: ext4 volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbd nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - PHX-AD-3 --- kind: PersistentVolume apiVersion: v1 metadata: name: csi-pv-web-app-1 annotations: pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com spec: storageClassName: oci-bv persistentVolumeReclaimPolicy: Retain capacity: storage: 50Gi accessModes: - ReadWriteOnce csi: driver: blockvolume.csi.oraclecloud.com fsType: ext4 volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbe nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - PHX-AD-2 --- kind: PersistentVolume apiVersion: v1 metadata: name: csi-pv-web-app-2 annotations: pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com spec: storageClassName: oci-bv persistentVolumeReclaimPolicy: Retain capacity: storage: 50Gi accessModes: - ReadWriteOnce csi: driver: blockvolume.csi.oraclecloud.com fsType: ext4 volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbf nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - PHX-AD-1 - Defina
-
Para crear los tres nuevos objetos PV de CSI, introduzca:
kubectl apply -f migrated-csi-pv.yaml persistentvolume/csi-pv-web-app-0 created persistentvolume/csi-pv-web-app-1 created persistentvolume/csi-pv-web-app-2 created -
Confirme que los tres nuevos objetos CSI PV se han creado introduciendo:
kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE csi-pv-web-app-0 50Gi RWO Retain Available oci-bv <unset> 11s csi-pv-web-app-1 50Gi RWO Retain Available oci-bv <unset> 11s csi-pv-web-app-2 50Gi RWO Retain Available oci-bv <unset> 10s ocid1.volume.oc1.phx.aaaaaa______xbd 50Gi RWO Retain Bound default/storage-flex-web-app-0 oci <unset> 23m ocid1.volume.oc1.phx.aaaaaa______xbe 50Gi RWO Retain Bound default/storage-flex-web-app-2 oci <unset> 16m ocid1.volume.oc1.phx.aaaaaa______xbf 50Gi RWO Retain Bound default/storage-flex-web-app-1 oci <unset> 17m -
Compruebe que en la salida se muestra lo siguiente:
- Un nuevo objeto PV de CSI para cada uno de los objetos PV FlexVolume originales.
- Los tres nuevos objetos PV de CSI tienen el estado
Available.
Ejemplo Paso 3: Crear nuevos objetos CSI PVC y enlazarlos a los objetos CSI PV
Ahora definirá un nuevo objeto CSI PVC para cada objeto CSI PV que haya creado en el paso anterior:
-
Cree un nuevo archivo de manifiesto de PVC y guárdelo como migrado-csi-pvc.yaml.
-
Para cada uno de los tres objetos PVC FlexVolume existentes, copie la siguiente definición de PVC de plantilla en el archivo migrado-CSI-pvc.yaml para definir un nuevo objeto PVC CSI.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: <new-pvc-name> spec: accessModes: - ReadWriteOnce resources: requests: storage: <original-pvc-size> volumeName: <new-pv-name> storageClassName: oci-bv -
Para cada nueva definición de objeto CSI PVC, proporcione los valores siguientes:
-
Defina
metadata.namepara especificar el nombre de la nueva PVC CSI con el siguiente formato:<new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>donde:
-
<new-volumeClaimTemplates.metadata.name>es una cadena de su elección para ser la primera parte del nombre de la nueva PVC CSI. La cadena que especifique aquí debe ser diferente del valorvolumeClaimTemplates.metadata.nameoriginal en el manifiesto StatefulSet. En el Ejemplo de paso 4: vuelva a crear el objeto StatefulSet para utilizar los nuevos objetos de PVC CSI, actualice el manifiesto StatefulSet y especifique esta cadena como el nuevo valor devolumeClaimTemplates.metadata.name. En este ejemplo, especifiquestorage-csi. -
<statefulset-name>esweb-app(nombre de StatefulSet que gestiona la aplicación de ejemplo). -
<index>es un número ordinal, que comienza en 0 y se incrementa en 1 para el número de réplicas especificado en StatefulSet. En este ejemplo,web-appStatefulSet especifica tres réplicas.
-
- Defina
spec.resources.requests.storageen el mismo valor que el especificado para la PVC FlexVolume. En este ejemplo, especifique50Gi - Defina
spec.volumeNameen uno de los nombres (csi-pv-web-app-0,csi-pv-web-app-1ocsi-pv-web-app-2) especificados para los nuevos objetos PV de CSI en el Ejemplo Paso 2: Crear nuevos objetos PV de CSI y enlazarlos a volúmenes en bloque.
Una vez introducida la información, el archivo migrado-CSI-pvc.yaml contiene las siguientes tres definiciones de PVC CSI:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: storage-csi-web-app-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi volumeName: csi-pv-web-app-0 storageClassName: oci-bv --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: storage-csi-web-app-1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi volumeName: csi-pv-web-app-1 storageClassName: oci-bv --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: storage-csi-web-app-2 spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi volumeName: csi-pv-web-app-2 storageClassName: oci-bv -
-
Puede crear los nuevos objetos CSI PVC introduciendo:
kubectl apply -f migrated-csi-pvc.yaml persistentvolumeclaim/storage-csi-web-app-0 created persistentvolumeclaim/storage-csi-web-app-1 created persistentvolumeclaim/storage-csi-web-app-2 created -
Confirme que los nuevos objetos CSI PVC se han creado y enlazado a los objetos CSI PV introduciendo:
kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE storage-csi-web-app-0 Bound csi-pv-web-app-0 50Gi RWO oci-bv <unset> 2m32s storage-csi-web-app-1 Bound csi-pv-web-app-1 50Gi RWO oci-bv <unset> 2m31s storage-csi-web-app-2 Bound csi-pv-web-app-2 50Gi RWO oci-bv <unset> 2m31s storage-flex-web-app-0 Bound ocid1.volume.oc1.phx.aaaaaa______xbd 50Gi RWO oci <unset> 38m storage-flex-web-app-1 Bound ocid1.volume.oc1.phx.aaaaaa______xbe 50Gi RWO oci <unset> 31m storage-flex-web-app-2 Bound ocid1.volume.oc1.phx.aaaaaa______xbf 50Gi RWO oci <unset> 30m -
Compruebe que en la salida se muestra lo siguiente:
- Se ha creado un objeto PVC CSI para cada objeto PVC FlexVolume.
- Los tres objetos PVC CSI tienen el estado
Bound. - Cada objeto CSI PVC está enlazado al objeto CSI PV especificado en el manifiesto.
Ejemplo Paso 4: Vuelva a crear el objeto StatefulSet para utilizar los nuevos objetos CSI PVC
- Para crear un nuevo manifiesto StatefulSet, copie el archivo que contiene el manifiesto del archivo StatefulSet existente (flex-statefulset.yaml) y guarde el nuevo archivo de manifiesto como csi.statefulset.yaml.
- Actualice el nuevo manifiesto en csi.statefulset.yaml, de modo que StatefulSet utilice las nuevas PVC de CSI que creó en el Ejemplo de paso 3: creación de nuevos objetos de PVC de CSI y enlace a los objetos de PV de CSI, de la siguiente manera:
- Cambie
spec.template.spec.containers.volumeMounts.nameastorage-csi(la cadena que ha elegido como la primera parte de los nuevos nombres PVC de CSI). - Cambie
spec.volumeClaimTemplates.metadata.nameastorage-csi(la cadena que ha elegido como la primera parte de los nuevos nombres PVC de CSI). - Cambie
spec.volumeClaimTemplates.spec.storageClassNameaoci-bv(la clase de almacenamiento utilizada por el plugin de volumen CSI).
El nuevo manifiesto StatefulSet en csi.statefulset.yaml ahora tiene el siguiente aspecto:
apiVersion: apps/v1 kind: StatefulSet metadata: name: web-app spec: serviceName: "nginx" replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 name: web volumeMounts: - name: storage-csi mountPath: /usr/share/nginx/html volumeClaimTemplates: - apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null name: storage-csi spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi storageClassName: oci-bv volumeMode: Filesystem - Cambie
-
Suprima el objeto
web-appStatefulSet existente introduciendo:kubectl delete statefulsets web-app statefulset.apps "web-app" deleted -
Cree un nuevo objeto
web-appStatefulSet a partir del nuevo manifiesto introduciendo:kubectl apply -f csi.statefulset.yaml
Ejemplo Paso 5: Suprima los objetos PVC y PV FlexVolume originales
Después de cambiar persistentVolumeReclaimPolicy del PV de FlexVolume a Retener en el Ejemplo de paso 1: Cambiar la política de recuperación de los objetos PV de FlexVolume existentes a "Retener" y completar los otros pasos de esta sección, ahora puede suprimir los objetos PV y PVC originales de FlexVolume.
-
Para cada objeto PV FlexVolume, suprima el objeto PV introduciendo:
kubectl delete pv <flexvolume-pv-name>En este ejemplo:
kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbd persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbd deletedkubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbe persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbe deletedkubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbf persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbf deleted -
Para cada objeto PVC FlexVolume, suprima el objeto PVC introduciendo:
kubectl delete pvc <flexvolume-pv-name>En este ejemplo:
kubectl delete pvc storage-flex-web-app-0 persistentvolumeclaim storage-flex-web-app-0 deletedkubectl delete pvc storage-flex-web-app-1 persistentvolumeclaim storage-flex-web-app-1 deletedkubectl delete pvc storage-flex-web-app-2 persistentvolumeclaim storage-flex-web-app-2 deleted