Migrando do Plug-in de Volume FlexVolume para o Plug-in de Volume CSI

Descubra como migrar uma carga de trabalho do Kubernetes (gerenciada por um StatefulSet) do plug-in de volume FlexVolume para o plug-in de volume CSI.

Você pode usar o plug-in de volume CSI ou FlexVolume para conectar clusters a volumes em blocos no serviço Block Volume. No entanto, a Oracle recomenda o uso do plug-in de volume CSI porque:
  • O projeto upstream do Kubernetes descontinua o plug-in de volume FlexVolume no Kubernetes versão 1.23.
  • A nova funcionalidade só está sendo adicionada ao plug-in de volume CSI, não ao FlexVolume.
  • O plug-in de volume CSI não requer acesso às dependências subjacentes do sistema operacional e do sistema de arquivos raiz.

No Kubernetes, uma maneira de gerenciar aplicativos com monitoramento de estado que exigem armazenamento persistente é usar objetos StatefulSet. Para obter mais informações sobre objetos StatefulSet, consulte StatefulSets na documentação do Kubernetes.

Se você tiver um aplicativo com monitoramento de estado que exija armazenamento persistente e o StatefulSet que gerencia o aplicativo estiver usando no momento o plug-in de volume FlexVolume para provisionar um volume persistente, recomendamos que você migre a carga de trabalho para usar o plug-in de volume CSI.

Esta seção fornece etapas genéricas para migrar uma carga de trabalho (gerenciada por um StatefulSet) do plug-in de volume FlexVolume para o plug-in de volume CSI, da seguinte forma:

Esta seção também inclui um exemplo totalmente trabalhado, para que você possa ver as etapas na prática. Consulte Exemplo de migração de uma carga de trabalho do plug-in de volume FlexVolume para o plug-in de volume CSI.

Observe que nesta seção:

  • Volumes persistentes e reivindicações de volume persistente criadas pelo plug-in de volume FlexVolume são chamados de PVs FlexVolume e PVCs FlexVolume, respectivamente.
  • Volumes persistentes e reivindicações de volume persistentes criadas pelo plug-in de volume CSI são chamados de PVs CSI e PVCs CSI, respectivamente.

Etapa 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter"

  1. Descubra os nomes dos PVs FlexVolume vinculados às PVCs FlexVolume no StatefulSet digitando:

    kubectl get pvc
  2. Altere a política de recuperação dos objetos PV FlexVolume existentes para Retain para impedir que os volumes em blocos que suportam os PVs sejam excluídos durante a migração, digitando:

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  3. Confirme se cada PV FlexVolume foi atualizado digitando:

    kubectl get pv <volume-name>
  4. Verifique se a saída mostra que a política de reivindicação foi definida como Reter para cada PV FlexVolume.

    Importante

    Verifique novamente se a política de reivindicação foi definida como Reter para cada PV FlexVolume. Se a política de recuperação não estiver definida como Reter, o volume em blocos que suporta o PV FlexVolume será excluído durante a migração.

Etapa 2: Criar novos objetos CSI PV e vinculá-los a volumes em blocos

  1. Crie um novo arquivo de manifesto PV.
  2. Para cada objeto PV FlexVolume existente, copie a seguinte definição PV de modelo no arquivo para definir um novo objeto PV CSI correspondente:

    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 nova definição de objeto PV CSI, forneça os seguintes valores:

    • Defina metadata.name como uma string de sua escolha para o nome do novo objeto PV CSI.
    • Defina spec.capacity.storage como a capacidade do PV FlexVolume existente. Por exemplo, 50Gi
    • Defina spec.csi.fstype como o tipo de sistema de arquivos que suporta o PV FlexVolume existente. Por exemplo, ext4 .
      Dica: Se você não tiver certeza do tipo de sistema de arquivos que suporta o PV FlexVolume existente, consulte os detalhes do PV FlexVolume informando:
      kubectl get pv <original-pv-name> -o yaml
    • Defina spec.csi.volumeHandle como o OCID do volume em blocos original que suporta o PV FlexVolume existente. O OCID também foi usado como o nome do PV FlexVolume. Por exemplo, ocid1.volume.oc1.phx.aaaaaa______xbd
    • Defina spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone.values como o domínio de disponibilidade para o CSI PV, com base no valor do Flex PV failure-domain.beta.kubernetes.io/zone . Por exemplo, PHX-AD-1.
      Dica: Se você não tiver certeza do valor do failure-domain.beta.kubernetes.io/zone do Flex PV existente, consulte os detalhes do FlexVolume PV informando:
      kubectl get pv <original-pv-name> -o yaml

    Observe que no modelo, spec.storageClassName já está definido como a classe de armazenamento usada pelo plug-in de volume CSI (oci-bv).

    Por exemplo:

    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. Crie os novos objetos CSI PV inserindo:

    kubectl apply -f <pv-manifest-filename>.yaml
  5. Confirme se os novos objetos CSI PV foram criados inserindo:

    kubectl get pv
  6. Verifique se o resultado mostra:

    • Um novo objeto PV CSI para cada objeto PV FlexVolume.
    • Todos os novos objetos PV CSI têm um status de Available.

Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV

Agora você define um novo objeto PVC CSI para cada objeto PV CSI criado na etapa anterior:

  1. Crie um novo arquivo de manifesto de PVC.
  2. Para cada objeto PVC FlexVolume existente, copie a seguinte definição de PVC de modelo no novo arquivo para definir um novo 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 nova definição de objeto PVC CSI, forneça os seguintes valores:
    • Defina metadata.name para especificar o nome da nova PVC CSI no seguinte formato:
      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      em que:

      • <new-volumeClaimTemplates.metadata.name> é uma string de sua escolha para ser a primeira parte do nome da nova PVC CSI. A string especificada aqui deve ser diferente do valor volumeClaimTemplates.metadata.name original no manifesto StatefulSet. Na Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos PVC CSI, atualize o manifesto StatefulSet e especifique essa string como o valor de volumeClaimTemplates.metadata.name.
      • <statefulset-name> é o nome do StatefulSet que gerencia o aplicativo.
      • <index> é um número ordinal, começando em 0, e incrementado em 1 para o número de réplicas especificado em StatefulSet.
    • Defina spec.resources.requests.storage com o mesmo valor especificado para a PVC FlexVolume. Por exemplo, 50Gi
    • Defina spec.volumeName como o nome especificado como o nome do novo objeto PV CSI na Etapa 2: Criar novos objetos PV CSI e vinculá-los a volumes em blocos.

    Observe que no modelo, spec.storageClassName já está definido como a classe de armazenamento usada pelo plug-in de volume CSI (oci-bv).

    Por exemplo:

    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. Crie os novos objetos CSI PVC inserindo:

    kubectl apply -f <pvc-manifest-filename>.yaml
  5. Confirme se os novos objetos CSI PVC foram criados e vinculados aos objetos CSI PV digitando:

    kubectl get pvc
  6. Verifique se o resultado mostra:

    • Um objeto PVC CSI foi criado para cada objeto PVC FlexVolume.
    • Todos os objetos PVC CSI têm o status Bound.
    • Cada objeto PVC CSI é vinculado ao objeto PV CSI especificado no manifesto.

Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos CSI PVC

  1. Crie um novo manifesto StatefulSet copiando o arquivo que contém o manifesto do StatefulSet existente e salve o novo arquivo de manifesto com um novo nome.
  2. Atualize o novo manifesto, para que StatefulSet use as novas PVCs CSI criadas na Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV, da seguinte forma:

    • Altere spec.template.spec.containers.volumeMounts.name para a string escolhida como a primeira parte dos novos nomes de PVC CSI.
    • Altere spec.volumeClaimTemplates.metadata.name para a string escolhida como a primeira parte dos novos nomes de PVC CSI.
    • Altere spec.volumeClaimTemplates.spec.storageClassName para oci-bv (a classe de armazenamento usada pelo plug-in de volume CSI).
  3. Exclua o objeto StatefulSet existente digitando:

    kubectl delete statefulsets <statefulset-name>
  4. Crie um novo objeto StatefulSet a partir do novo manifesto digitando:

    kubectl apply -f <statefulset-manifest-filename>

Etapa 5: Excluir os objetos PVC e PV FlexVolume originais

Depois de alterar o persistentVolumeReclaimPolicy do PV FlexVolume para Reter na Etapa 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter" e conclua as outras etapas desta seção, agora você pode excluir os objetos PV e PVC FlexVolume originais.

  1. Para cada objeto PV FlexVolume, exclua o objeto PV informando:

    kubectl delete pv <flexvolume-pv-name>
  2. Para cada objeto PVC FlexVolume, exclua o objeto PVC digitando:

    kubectl delete pvc <flexvolume-pvc-name>

Exemplo de migração de uma carga de trabalho do plug-in de volume FlexVolume para o plug-in de volume CSI

Este exemplo mostra como migrar uma carga de trabalho de amostra do plug-in de volume FlexVolume para o plug-in de volume CSI. As instruções deste exemplo pressupõem uma carga de trabalho gerenciada por um objeto StatefulSet chamado web-app.

Exemplo de Carga de Trabalho StatefulSet

Inicialmente, o StatefulSet usa o plug-in de volume FlexVolume para provisionar armazenamento. O StatefulSet original é definido em flex-statefulset.yaml da seguinte forma:

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

O manifesto StatefulSet original define:

  • O nome de StatefulSet como web-app (o valor de metadata.name).
  • O nome de um volumeClaimTemplate como storage-flex (o valor de volumeClaimTemplates.metadata.name).
  • Três réplicas (o valor de spec.replicas).

Ao criar PVCs para um StatefulSet, o Kubernetes usa a seguinte convenção para nomear as PVCs:

<volumeClaimTemplate-name>-<StatefulSet-name>-<index>

em que:

  • <volumeClaimTemplate-name> é o nome do volumeClaimTemplate especificado pelo valor de volumeClaimTemplates.metadata.name no manifesto StatefulSet. Neste exemplo, storage-flex.
  • <StatefulSet-name> é o nome do StatefulSet especificado pelo valor de metadata.name no manifesto StatefulSet. Neste exemplo, web-app.
  • <index> é um número ordinal, começando em 0, e incrementado em 1 para o número de réplicas especificado em StatefulSet. Neste exemplo, três réplicas são especificadas.

Então, quando o Kubernetes criou as PVCs FlexVolume originais para o web-app StatefulSet, ele criou três PVCs com os seguintes nomes:

  • storage-flex-web-app-0
  • storage-flex-web-app-1
  • storage-flex-web-app-2

Exemplo Etapa 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter"

  1. Você descobre os nomes dos três PVs FlexVolume vinculados às três PVCs FlexVolume no StatefulSet digitando:

    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. Altere a política de recuperação dos três objetos FlexVolume PV existentes para Retain para impedir que os volumes em blocos que suportam os PVs sejam excluídos durante a migração, digitando:

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

    Neste exemplo:

    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 se cada PV FlexVolume foi atualizado digitando:

    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 se a saída mostra que a política de reivindicação foi definida como Reter para cada PV FlexVolume.

    Importante

    Verifique novamente se a política de reivindicação foi definida como Reter para cada PV FlexVolume. Se a política de recuperação não estiver definida como Reter, o volume em blocos que suporta o PV FlexVolume será excluído durante a migração.

Exemplo Etapa 2: Criar novos objetos CSI PV e vinculá-los a volumes em blocos

  1. Você cria um novo arquivo de manifesto PV e o salva como migrated-csi-pv.yaml.

  2. Para cada um dos três objetos PV FlexVolume existentes, copie a seguinte definição PV de modelo no arquivo migrated-CSI-pv.yaml para definir um novo objeto PV CSI correspondente.

    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 nova definição de objeto PV CSI, forneça os seguintes valores:

    • Defina metadata.name como uma string de sua escolha para o nome do novo objeto PV CSI. Neste exemplo, você nomeia os novos objetos PV CSI csi-pv-web-app-0, csi-pv-web-app-1 e csi-pv-web-app-2.
    • Defina spec.capacity.storage como a capacidade do PV FlexVolume existente. Neste exemplo, você especifica 50Gi para todos os três novos objetos PV CSI.
    • Defina spec.csi.fstype como o tipo de sistema de arquivos que suporta o PV FlexVolume existente. Neste exemplo, você especifica ext4 para todos os três novos objetos PV CSI.
    • Defina spec.csi.volumeHandle como o OCID do volume em blocos original que suporta o PV FlexVolume existente. O OCID também foi usado como o nome do objeto PV FlexVolume. Neste exemplo, você especifica os seguintes OCIDs para os três novos objetos CSI PV:
      • 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 como o domínio de disponibilidade para o CSI PV, com base no valor do Flex PV failure-domain.beta.kubernetes.io/zone . Neste exemplo, você especifica os seguintes domínios de disponibilidade para os três novos objetos PV CSI:
      • PHX-AD-1
      • PHX-AD-2
      • PHX-AD-3

    Após inserir as informações, o arquivo migrated-CSI-pv.yaml contém as três definições de CSI PV a seguir:

    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 criar os três novos objetos PV CSI, insira:

    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. Você confirma que os três novos objetos CSI PV foram criados digitando:

    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. Verifique se a saída mostra:

    • Um novo objeto PV CSI para cada um dos objetos PV FlexVolume originais.
    • Todos os três novos objetos PV CSI têm o status Available.

Exemplo Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV

Agora você define um novo objeto PVC CSI para cada objeto PV CSI criado na etapa anterior:

  1. Você cria um novo arquivo de manifesto de PVC e o salva como migrated-csi-pvc.yaml.

  2. Para cada um dos três objetos de PVC FlexVolume existentes, copie a seguinte definição de PVC de modelo no arquivo migrated-CSI-pvc.yaml para definir um novo 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 nova definição de objeto de PVC CSI, forneça os seguintes valores:

    • Defina metadata.name para especificar o nome da nova PVC CSI no seguinte formato:

      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      em que:

      • <new-volumeClaimTemplates.metadata.name> é uma string de sua escolha para ser a primeira parte do nome da nova PVC CSI. A string especificada aqui deve ser diferente do valor volumeClaimTemplates.metadata.name original no manifesto StatefulSet. Em Exemplo de Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos PVC CSI, atualize o manifesto StatefulSet e especifique essa string como o novo valor de volumeClaimTemplates.metadata.name. Neste exemplo, você especifica storage-csi.
      • <statefulset-name> é web-app (o nome do StatefulSet que gerencia o aplicativo de exemplo).
      • <index> é um número ordinal, começando em 0, e incrementado em 1 para o número de réplicas especificado em StatefulSet. Neste exemplo, web-app StatefulSet especifica três réplicas.
    • Você define spec.resources.requests.storage com o mesmo valor especificado para a PVC FlexVolume. Neste exemplo, você especifica 50Gi
    • Defina spec.volumeName como um dos nomes (csi-pv-web-app-0, csi-pv-web-app-1 ou csi-pv-web-app-2) especificados para os novos objetos CSI PV na Etapa de Exemplo 2: Criar novos objetos CSI PV e vinculá-los a volumes em blocos.

    Após inserir as informações, o arquivo migrated-CSI-pvc.yaml contém as três definições de PVC CSI a seguir:

    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. Você cria os novos objetos CSI PVC inserindo:

    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. Você confirma que os novos objetos CSI PVC foram criados e vinculados aos objetos CSI PV digitando:

    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. Verifique se a saída mostra:

    • Um objeto PVC CSI foi criado para cada objeto PVC FlexVolume.
    • Todos os três objetos CSI PVC têm o status Bound.
    • Cada objeto PVC CSI é vinculado ao objeto PV CSI especificado no manifesto.

Exemplo Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos CSI PVC

  1. Você cria um novo manifesto StatefulSet copiando o arquivo que contém o manifesto do StatefulSet existente (flex-statefulset.yaml) e salvando o novo arquivo de manifesto como csi.statefulset.yaml.
  2. Você atualiza o novo manifesto em csi.statefulset.yaml, para que StatefulSet use as novas PVCs CSI criadas em Exemplo Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV, da seguinte forma:
    • Você altera spec.template.spec.containers.volumeMounts.name para storage-csi (a string escolhida como a primeira parte dos novos nomes de PVC CSI).
    • Você altera spec.volumeClaimTemplates.metadata.name para storage-csi (a string escolhida como a primeira parte dos novos nomes de PVC CSI).
    • Você altera spec.volumeClaimTemplates.spec.storageClassName para oci-bv (a classe de armazenamento usada pelo plug-in de volume CSI).

    O novo manifesto StatefulSet em csi.statefulset.yaml agora tem a seguinte aparência:

    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. Exclua o objeto web-app StatefulSet existente digitando:

    kubectl delete statefulsets web-app
    
    statefulset.apps "web-app" deleted
  4. Crie um novo objeto web-app StatefulSet a partir do novo manifesto digitando:

    kubectl apply -f csi.statefulset.yaml

Exemplo Etapa 5: Excluir os objetos PVC e PV FlexVolume originais

Depois de alterar o persistentVolumeReclaimPolicy do PV FlexVolume para Reter na Etapa de Exemplo 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter" e conclua as outras etapas desta seção, agora você pode excluir os objetos PV e PVC FlexVolume originais.

  1. Para cada objeto PV FlexVolume, exclua o objeto PV informando:

    kubectl delete pv <flexvolume-pv-name>

    Neste exemplo:

    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, exclua o objeto PVC digitando:

    kubectl delete pvc <flexvolume-pv-name>

    Neste exemplo:

    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