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.

Puede utilizar el plugin de volumen CSI o el plugin de volumen FlexVolume para conectar clusters a volúmenes en bloque desde el servicio de volumen en bloque. Sin embargo, Oracle recomienda utilizar el plugin de volumen CSI porque:
  • 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:

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"

  1. Para averiguar los nombres de los PV FlexVolume enlazados a las PVC FlexVolume en StatefulSet, introduzca:

    kubectl get pvc
  2. Cambie la política de reclamación de los objetos PV FlexVolume existentes a Retain para 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"}}'
  3. Confirme que se ha actualizado cada PV FlexVolume introduciendo:

    kubectl get pv <volume-name>
  4. 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

  1. Cree un nuevo archivo de manifiesto PV.
  2. 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>
  3. Para cada nueva definición de objeto CSI PV, proporcione los siguientes valores:

    • Defina metadata.name en una cadena de su elección para el nombre del nuevo objeto PV de CSI.
    • Defina spec.capacity.storage en la capacidad de PV FlexVolume existente. Por ejemplo, 50Gi
    • Defina spec.csi.fstype en 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.volumeHandle en 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.values en el dominio de disponibilidad para el PV de CSI, según el valor de failure-domain.beta.kubernetes.io/zone del PV flexible. Por ejemplo, PHX-AD-1.
      Consejo: si no está seguro del valor de failure-domain.beta.kubernetes.io/zone del 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.storageClassName ya 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
  4. Cree los nuevos objetos PV de CSI introduciendo:

    kubectl apply -f <pv-manifest-filename>.yaml
  5. Confirme que los nuevos objetos PV de CSI se hayan creado introduciendo:

    kubectl get pv
  6. 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:

  1. Cree un nuevo archivo de manifiesto de PVC.
  2. 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

  3. Para cada nueva definición de objeto CSI PVC, proporcione los valores siguientes:
    • Defina metadata.name para 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 al valor volumeClaimTemplates.metadata.name original en el manifiesto StatefulSet. En el Step 4: Recreate the StatefulSet object to use the new CSI PVC objects, actualice el manifiesto StatefulSet y especifique esta cadena como el valor de volumeClaimTemplates.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.storage en el mismo valor que el especificado para la PVC FlexVolume. Por ejemplo, 50Gi
    • Establezca spec.volumeName en el nombre que especificó 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.storageClassName ya 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
  4. Cree los nuevos objetos CSI PVC introduciendo:

    kubectl apply -f <pvc-manifest-filename>.yaml
  5. Confirme que los nuevos objetos CSI PVC se hayan creado y enlazado a los objetos CSI PV introduciendo:

    kubectl get pvc
  6. 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

  1. 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.
  2. Actualice el nuevo manifiesto, de modo que StatefulSet utilice las nuevas PVC 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.name por la cadena que haya elegido como primera parte de los nuevos nombres PVC de CSI.
    • Cambie spec.volumeClaimTemplates.metadata.name por la cadena que haya elegido como primera parte de los nuevos nombres PVC de CSI.
    • Cambie spec.volumeClaimTemplates.spec.storageClassName a oci-bv (la clase de almacenamiento utilizada por el plugin de volumen CSI).
  3. Suprima el objeto StatefulSet existente introduciendo:

    kubectl delete statefulsets <statefulset-name>
  4. 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 haber cambiado persistentVolumeReclaimPolicy del PV FlexVolume a Retener en el Paso 1: Cambie la política de reclamación de los objetos PV FlexVolume existentes a "Retener" y haya completado los otros pasos de esta sección, ahora puede suprimir los objetos PV y PVC FlexVolume originales.

  1. Para cada objeto PV FlexVolume, suprima el objeto PV introduciendo:

    kubectl delete pv <flexvolume-pv-name>
  2. 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 de metadata.name).
  • Nombre de volumeClaimTemplate como storage-flex (valor de volumeClaimTemplates.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 de volumeClaimTemplates.metadata.name en el manifiesto StatefulSet. En este ejemplo, storage-flex.
  • <StatefulSet-name> es el nombre de StatefulSet especificado por el valor de metadata.name en 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"

  1. 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              
  2. Puede cambiar la política de reclamación de los tres objetos PV FlexVolume existentes a Retain para 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 patched
    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbe -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbe patched
    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbf -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbf patched
  3. 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
  4. 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

  1. Cree un nuevo archivo de manifiesto PV y guárdelo como migrado-csi-pv.yaml.

  2. 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>
  3. Para cada nueva definición de objeto CSI PV, proporcione los valores siguientes:

    • Defina metadata.name en 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 nombre csi-pv-web-app-0, csi-pv-web-app-1 y csi-pv-web-app-2.
    • Defina spec.capacity.storage en la capacidad de PV FlexVolume existente. En este ejemplo, especifique 50Gi para los tres nuevos objetos PV de CSI.
    • Defina spec.csi.fstype en el tipo de sistema de archivos que realiza una copia de seguridad del PV FlexVolume existente. En este ejemplo, especifique ext4 para los tres nuevos objetos PV de CSI.
    • Defina spec.csi.volumeHandle en 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/zone en el dominio de disponibilidad para el PV de CSI, según el valor de failure-domain.beta.kubernetes.io/zone del 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
  4. 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
  5. 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
  6. 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:

  1. Cree un nuevo archivo de manifiesto de PVC y guárdelo como migrado-csi-pvc.yaml.

  2. 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
  3. Para cada nueva definición de objeto CSI PVC, proporcione los valores siguientes:

    • Defina metadata.name para 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 al valor volumeClaimTemplates.metadata.name original en el manifiesto StatefulSet. En el Paso 4 de ejemplo: Vuelva a crear el objeto StatefulSet para utilizar los nuevos objetos PVC de CSI, actualice el manifiesto StatefulSet y especifique esta cadena como el nuevo valor de volumeClaimTemplates.metadata.name. En este ejemplo, especifique storage-csi.
      • <statefulset-name> es web-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-app StatefulSet especifica tres réplicas.
    • Defina spec.resources.requests.storage en el mismo valor que el especificado para la PVC FlexVolume. En este ejemplo, especifique 50Gi
    • Defina spec.volumeName en uno de los nombres (csi-pv-web-app-0, csi-pv-web-app-1 o csi-pv-web-app-2) especificados para los nuevos objetos PV de CSI en el Paso 2 de ejemplo: 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
  4. 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
  5. 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
  6. 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

  1. 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.
  2. Actualice el nuevo manifiesto en csi.statefulset.yaml, de modo que StatefulSet utilice las nuevas PVC CSI que creó en el Example 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.name a storage-csi (la cadena que ha elegido como la primera parte de los nuevos nombres PVC de CSI).
    • Cambie spec.volumeClaimTemplates.metadata.name a storage-csi (la cadena que ha elegido como la primera parte de los nuevos nombres PVC de CSI).
    • Cambie spec.volumeClaimTemplates.spec.storageClassName a oci-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
  3. Suprima el objeto web-app StatefulSet existente introduciendo:

    kubectl delete statefulsets web-app
    
    statefulset.apps "web-app" deleted
  4. Cree un nuevo objeto web-app StatefulSet 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 haber cambiado persistentVolumeReclaimPolicy del PV FlexVolume a Retener en el Paso 1 de ejemplo: Cambie la política de reclamación de los objetos PV FlexVolume existentes a "Retener" y haya completado los otros pasos de esta sección, ahora puede suprimir los objetos PV y PVC FlexVolume originales.

  1. 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 deleted
    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbe
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbe deleted
    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbf
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbf deleted
  2. 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 deleted
    kubectl delete pvc storage-flex-web-app-1
    
    persistentvolumeclaim storage-flex-web-app-1 deleted
    kubectl delete pvc storage-flex-web-app-2
    
    persistentvolumeclaim storage-flex-web-app-2 deleted