Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Cloud Container Engine/ Guia de usuário/ Gerenciamento do armazenamento: FlexVolume (preterido)/ Alteração da classe de armazenamento usada por um cluster de v1.15 de FlexVolume para CSI Everest
Atualizado em 2024-11-28 GMT+08:00

Alteração da classe de armazenamento usada por um cluster de v1.15 de FlexVolume para CSI Everest

Em clusters posteriores a v1.15.11-r1, o CSI (o complemento everest) assumiu todas as funções do fuxi FlexVolume (o complemento do driver de armazenamento) para gerenciar o armazenamento de contêineres. É aconselhável usar o CSI Everest.

Para migrar seus volumes de armazenamento, crie um PV estático para associar ao armazenamento subjacente original e, em seguida, crie um PVC para associar a esse PV estático. Ao atualizar sua aplicação, monte o novo PVC no caminho de montagem original para migrar os volumes de armazenamento.

Os serviços serão interrompidos durante a migração. Portanto, planeje adequadamente a migração e faça backup dos dados.

Procedimento

  1. (Opcional) Faça backup dos dados para evitar a perda de dados em caso de exceções.
  2. Configure um arquivo YAML do PV no formato CSI de acordo com o PV no formato FlexVolume e associe o PV ao armazenamento existente.

    Para ser específico, execute os seguintes comandos para configurar o arquivo pv-example.yaml, que é usado para criar um PV.

    touch pv-example.yaml

    vi pv-example.yaml

    Exemplo de configuração de um PV para um volume do EVS:
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      labels:
        failure-domain.beta.kubernetes.io/region: ap-southeast-1 
        failure-domain.beta.kubernetes.io/zone: <zone name>
      annotations:
        pv.kubernetes.io/provisioned-by: everest-csi-provisioner
      name: pv-evs-example
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 10Gi
      csi:
        driver: disk.csi.everest.io
        fsType: ext4
        volumeAttributes:
          everest.io/disk-mode: SCSI
          everest.io/disk-volume-type: SAS
          storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner
        volumeHandle: 0992dbda-6340-470e-a74e-4f0db288ed82
      persistentVolumeReclaimPolicy: Delete
      storageClassName: csi-disk

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 1 Parâmetros de configuração de volume do EVS

    Parâmetro

    Descrição

    failure-domain.beta.kubernetes.io/region

    Região onde o disco do EVS está localizado. Use o mesmo valor que o do PV do FlexVolume.

    failure-domain.beta.kubernetes.io/zone

    AZ onde o disco do EVS está localizado. Use o mesmo valor que o do PV do FlexVolume.

    name

    Nome do PV, que deve ser exclusivo no cluster.

    storage

    Capacidade de volume do EVS na unidade de Gi. Use o valor de spec.capacity.storage do PV de FlexVolume.

    driver

    Driver de armazenamento usado para anexar o volume. Defina o driver como disk.csi.everest.io para o volume do EVS.

    volumeHandle

    ID do volume do disco do EVS. Use o valor de spec.flexVolume.options.volumeID do PV do FlexVolume.

    everest.io/disk-mode

    Modo de disco do EVS. Use o valor de spec.flexVolume.options.disk-mode do PV do FlexVolume.

    everest.io/disk-volume-type

    Tipos de disco do EVS. Atualmente, há suporte para I/O alta (SAS) e I/O ultra-alta (SSD). Use o valor de kubernetes.io/volumetype na classe de armazenamento correspondente a spec.storageClassName do PV de FlexVolume.

    storageClassName

    Nome da classe de armazenamento do Kubernetes associada ao volume de armazenamento. Defina este campo como csi-disk para discos do EVS.

    Exemplo de configuração de um PV para um volume do SFS:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-sfs-example
      annotations:
        pv.kubernetes.io/provisioned-by: everest-csi-provisioner
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 10Gi
      csi:
        driver: nas.csi.everest.io
        fsType: nfs
        volumeAttributes:
          everest.io/share-export-location: sfs-nas01.ap-southeast-1.myhuaweicloud.com:/share-436304e8 
          storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner
        volumeHandle: 682f00bb-ace0-41d8-9b3e-913c9aa6b695
      persistentVolumeReclaimPolicy: Delete
      storageClassName: csi-nas

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 2 Parâmetros de configuração de volume do SFS

    Parâmetro

    Descrição

    name

    Nome do PV, que deve ser exclusivo no cluster.

    storage

    Tamanho do armazenamento de arquivos na unidade de Gi. Use o valor de spec.capacity.storage do PV de FlexVolume.

    driver

    Driver de armazenamento usado para anexar o volume. Defina o driver como nas.csi.everest.io para o sistema de arquivos.

    everest.io/share-export-location

    Caminho compartilhado do sistema de arquivos. Use o valor de spec.flexVolume.options.deviceMountPath do PV de FlexVolume.

    volumeHandle

    ID do sistema de arquivos. Use o valor de spec.flexVolume.options.volumeID do PV do FlexVolume.

    storageClassName

    Nome da classe de armazenamento do Kubernetes. Defina este campo como csi-nas.

    Exemplo de configuração de um PV para um volume do OBS:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-obs-example
      annotations:
        pv.kubernetes.io/provisioned-by: everest-csi-provisioner
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 1Gi
      csi:
        driver: obs.csi.everest.io
        fsType: s3fs
        volumeAttributes:
          everest.io/obs-volume-type: STANDARD
          everest.io/region: ap-southeast-1
          storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner
        volumeHandle: obs-normal-static-pv
      persistentVolumeReclaimPolicy: Delete
      storageClassName: csi-obs

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 3 Parâmetros de configuração de volume do OBS

    Parâmetro

    Descrição

    name

    Nome do PV, que deve ser exclusivo no cluster.

    storage

    Capacidade de armazenamento, na unidade de Gi. Defina esse parâmetro como o valor fixo 1Gi.

    driver

    Driver de armazenamento usado para anexar o volume. Defina o driver como obs.csi.everest.io para o volume do OBS.

    fsType

    Tipo de arquivo. As opções de valor são obsfs ou s3fs. Se o valor for s3fs, um bucket do OBS será criado e montado usando s3fs. Se o valor for obsfs, um sistema de arquivos paralelo do OBS será criado e montado usando obsfs. Defina este parâmetro de acordo com o valor de spec.flexVolume.options.posix do PV de FlexVolume. Se o valor de spec.flexVolume.options.posix for true, defina esse parâmetro como obsfs. Se o valor for false, defina este parâmetro como s3fs.

    everest.io/obs-volume-type

    Classe de armazenamento, incluindo STANDARD (bucket padrão) e WARM (bucket de acesso infrequente). Defina este parâmetro de acordo com o valor de spec.flexVolume.options.storage_class do PV do FlexVolume. Se o valor de spec.flexVolume.options.storage_class for standard, defina este parâmetro como STANDARD. Se o valor for standard_ia, defina este parâmetro como WARM.

    everest.io/region

    Região onde o bucket do OBS está localizado. Use o valor de spec.flexVolume.options.region do PV do FlexVolume.

    volumeHandle

    Nome do bucket do OBS. Use o valor de spec.flexVolume.options.volumeID do PV do FlexVolume.

    storageClassName

    Nome da classe de armazenamento do Kubernetes. Defina este campo como csi-obs.

    Exemplo de configuração de um PV para um volume do SFS Turbo:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-efs-example
      annotations:
        pv.kubernetes.io/provisioned-by: everest-csi-provisioner
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 10Gi
      csi:
        driver: sfsturbo.csi.everest.io
        fsType: nfs
        volumeAttributes:
          everest.io/share-export-location: 192.168.0.169:/
          storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner
        volumeHandle: 8962a2a2-a583-4b7f-bb74-fe76712d8414
      persistentVolumeReclaimPolicy: Delete
      storageClassName: csi-sfsturbo

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 4 Parâmetros de configuração do volume do SFS Turbo

    Parâmetro

    Descrição

    name

    Nome do PV, que deve ser exclusivo no cluster.

    storage

    Tamanho do sistema de arquivos. Use o valor de spec.capacity.storage do PV de FlexVolume.

    driver

    Driver de armazenamento usado para anexar o volume. Defina-o como sfsturbo.csi.everest.io.

    everest.io/share-export-location

    Caminho compartilhado do volume do SFS Turbo. Use o valor de spec.flexVolume.options.deviceMountPath do PV de FlexVolume.

    volumeHandle

    ID do volume do SFS Turbo. Use o valor de spec.flexVolume.options.volumeID do PV do FlexVolume.

    storageClassName

    Nome da classe de armazenamento do Kubernetes. Defina este campo como csi-sfsturbo para volumes do SFS Turbo.

  3. Configure um arquivo YAML do PVC no formato CSI de acordo com o PVC no formato FlexVolume e associe o PVC ao PV criado em 2.

    Para ser específico, execute os seguintes comandos para configurar o arquivo pvc-example.yaml, que é usado para criar um PVC.

    touch pvc-example.yaml

    vi pvc-example.yaml

    Exemplo de configuração de um PVC para um volume do EVS:

    apiVersion: v1  
    kind: PersistentVolumeClaim
    metadata:
      labels:
        failure-domain.beta.kubernetes.io/region: ap-southeast-1
        failure-domain.beta.kubernetes.io/zone: <zone name>
      annotations:
        everest.io/disk-volume-type: SAS
        volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
      name: pvc-evs-example
      namespace: default
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      volumeName:  pv-evs-example
      storageClassName: csi-disk

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 5 Parâmetros de configuração de PVC para um volume do EVS

    Parâmetro

    Descrição

    failure-domain.beta.kubernetes.io/region

    Região onde o cluster está localizado. Use o mesmo valor que o do PVC do FlexVolume.

    failure-domain.beta.kubernetes.io/zone

    AZ onde o disco do EVS é implementado. Use o mesmo valor que o do PVC do FlexVolume.

    everest.io/disk-volume-type

    Classe de armazenamento do disco do EVS. O valor pode ser SAS ou SSD. Defina este parâmetro para o mesmo valor do PV criado em 2.

    name

    Nome do PVC, que deve ser exclusivo no namespace. O valor deve ser exclusivo no namespace. (Se o PVC for criado dinamicamente por uma aplicação com estado, o valor desse parâmetro deverá ser igual ao nome do PVC de FlexVolume.)

    namespace

    Namespace ao qual o PVC pertence. Use o mesmo valor que o do PVC do FlexVolume.

    storage

    Capacidade solicitada do PVC, que deve ser igual ao tamanho de armazenamento do PV existente.

    volumeName

    Nome do PV. Defina este parâmetro como o nome do PV estático em 2.

    storageClassName

    Nome da classe de armazenamento do Kubernetes. Defina este campo como csi-disk para discos do EVS.

    Exemplo de configuração de um PVC para um volume do SFS:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
      name: pvc-sfs-example
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: csi-nas
      volumeName: pv-sfs-example

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 6 Parâmetros de configuração de PVC para um volume do SFS

    Parâmetro

    Descrição

    name

    Nome do PVC, que deve ser exclusivo no namespace. O valor deve ser exclusivo no namespace. (Se o PVC for criado dinamicamente por uma aplicação com estado, o valor desse parâmetro deverá ser igual ao nome do PVC de FlexVolume.)

    namespace

    Namespace ao qual o PVC pertence. Use o mesmo valor que o do PVC do FlexVolume.

    storage

    Capacidade de armazenamento, na unidade de Gi. O valor deve ser o mesmo que o tamanho de armazenamento do PV existente.

    storageClassName

    Defina este campo como csi-nas.

    volumeName

    Nome do PV. Defina este parâmetro como o nome do PV estático em 2.

    Exemplo de configuração de um PVC para um volume do OBS:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
        everest.io/obs-volume-type: STANDARD
        csi.storage.k8s.io/fstype: s3fs
      name: pvc-obs-example
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
      storageClassName: csi-obs
      volumeName: pv-obs-example

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 7 Parâmetros de configuração de PVC para um volume do OBS

    Parâmetro

    Descrição

    everest.io/obs-volume-type

    Tipo de volume do OBS, que pode ser STANDARD (bucket padrão) e WARM (bucket de acesso infrequente). Defina este parâmetro para o mesmo valor do PV criado em 2.

    csi.storage.k8s.io/fstype

    Tipo de arquivo, que pode ser obsfs ou s3fs. O valor deve ser o mesmo que o de fsType do PV do volume do OBS estático.

    name

    Nome do PVC, que deve ser exclusivo no namespace. O valor deve ser exclusivo no namespace. (Se o PVC for criado dinamicamente por uma aplicação com estado, o valor desse parâmetro deverá ser igual ao nome do PVC de FlexVolume.)

    namespace

    Namespace ao qual o PVC pertence. Use o mesmo valor que o do PVC do FlexVolume.

    storage

    Capacidade de armazenamento, na unidade de Gi. Defina esse parâmetro como o valor fixo 1Gi.

    storageClassName

    Nome da classe de armazenamento do Kubernetes. Defina este campo como csi-obs.

    volumeName

    Nome do PV. Defina este parâmetro como o nome do PV estático criado em 2.

    Exemplo de configuração de um PVC para um volume do SFS Turbo:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
      name: pvc-efs-example
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: csi-sfsturbo
      volumeName: pv-efs-example

    Preste atenção aos campos em negrito e vermelho. Os parâmetros são descritos a seguir:

    Tabela 8 Parâmetros de configuração de PVC para um volume do SFS Turbo

    Parâmetro

    Descrição

    name

    Nome do PVC, que deve ser exclusivo no namespace. O valor deve ser exclusivo no namespace. (Se o PVC for criado dinamicamente por uma aplicação com estado, o valor desse parâmetro deverá ser igual ao nome do PVC de FlexVolume.)

    namespace

    Namespace ao qual o PVC pertence. Use o mesmo valor que o do PVC do FlexVolume.

    storageClassName

    Nome da classe de armazenamento do Kubernetes. Defina este campo como csi-sfsturbo.

    storage

    Capacidade de armazenamento, na unidade de Gi. O valor deve ser o mesmo que o tamanho de armazenamento do PV existente.

    volumeName

    Nome do PV. Defina este parâmetro como o nome do PV estático criado em 2.

  4. Atualize a carga de trabalho para usar um novo PVC.

    Para implementações
    1. Execute os comandos kubectl create -f para criar um PV e um PVC.

      kubectl create -f pv-example.yaml

      kubectl create -f pvc-example.yaml

      Substitua o nome de arquivo de exemplo pvc-example.yaml nos comandos anteriores pelos nomes dos arquivos YAML configurados em 2 e 3.

    2. Vá para o console do CCE. Na página de atualização da carga de trabalho, clique em Upgrade > Advanced Settings > Data Storage > Cloud Storage.

    3. Desinstale o armazenamento antigo e adicione o PVC no formato CSI. Mantenha o caminho de montagem original no contêiner.
    4. Clique em Submit.
    5. Aguarde até que os pods estejam funcionando.

    Para StatefulSets que usam armazenamento existente

    1. Execute os comandos kubectl create -f para criar um PV e um PVC.

      kubectl create -f pv-example.yaml

      kubectl create -f pvc-example.yaml

      Substitua o nome de arquivo de exemplo pvc-example.yaml nos comandos anteriores pelos nomes dos arquivos YAML configurados em 2 e 3.

    2. Execute o comando kubectl edit para editar o StatefulSet e usar o PVC recém-criado.

      kubectl edit sts sts-example -n xxx

      Substitua sts-example no comando anterior pelo nome real do StatefulSet a ser atualizado. xxx indica o namespace ao qual o StatefulSet pertence.

    3. Aguarde até que os pods estejam funcionando.

    O console atual não oferece suporte à operação de adição de novo armazenamento em nuvem para o StatefulSets. Use os comandos kubectl para substituir o armazenamento pelo PVC recém-criado.

    Para StatefulSets que usam armazenamento alocado dinamicamente

    1. Faça backup do PV e do PVC no formato flexVolume usado pelo StatefulSet.

      kubectl get pvc xxx -n {namespaces} -oyaml > pvc-backup.yaml

      kubectl get pv xxx -n {namespaces} -oyaml > pv-backup.yaml

    2. Altere o número de pods para 0.
    3. Na página de armazenamento, desassocie o PVC de flexVolume usado pelo StatefulSet.
    4. Execute os comandos kubectl create -f para criar um PV e um PVC.

      kubectl create -f pv-example.yaml

      kubectl create -f pvc-example.yaml

      Substitua o nome de arquivo de exemplo pvc-example.yaml nos comandos anteriores pelos nomes dos arquivos YAML configurados em 2 e 3.

    5. Altere o número de pods de volta ao valor original e aguarde até que os pods estejam em execução.

    A alocação dinâmica de armazenamento para StatefulSets é obtida usando volumeClaimTemplates. Este campo não pode ser modificado pelo Kubernetes. Portanto, os dados não podem ser migrados usando um novo PVC.

    A regra de nomeação de PVC do volumeClaimTemplates é fixa. Quando existe um PVC que atende à regra de nomeação, esse PVC é usado.

    Portanto, desassocie o PVC original primeiro e, em seguida, crie um PVC com o mesmo nome no formato CSI.

    6. (Opcional) Recrie a aplicação com estado para garantir que um PVC de CSI seja usado quando a aplicação for dimensionada. Caso contrário, PVCs de FlexVolume são usados no dimensionamento.

    • Execute o seguinte comando para obter o arquivo YAML do StatefulSet:

    kubectl get sts xxx -n {namespaces} -oyaml > sts.yaml

    • Execute o seguinte comando para fazer backup do arquivo YAML do StatefulSet:

    cp sts.yaml sts-backup.yaml

    • Modifique a definição de volumeClaimTemplates no arquivo YAML do StatefulSet.

    vi sts.yaml

    Exemplo de configuração de volumeClaimTemplates para um volume do EVS:

      volumeClaimTemplates:
        - metadata:
            name: pvc-161070049798261342
            namespace: default
            creationTimestamp: null
            annotations:
              everest.io/disk-volume-type: SAS
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 10Gi
            storageClassName: csi-disk

    O valor do parâmetro deve ser o mesmo que o PVC do volume do EVS criado em 3.

    Exemplo de configuração de volumeClaimTemplates para um volume do SFS:

      volumeClaimTemplates:
        - metadata:
            name: pvc-161063441560279697
            namespace: default
            creationTimestamp: null
          spec:
            accessModes:
              - ReadWriteMany
            resources:
              requests:
                storage: 10Gi
            storageClassName: csi-nas

    O valor do parâmetro deve ser o mesmo que o PVC do volume do SFS criado em 3.

    Exemplo de configuração de volumeClaimTemplates para um volume do OBS:

      volumeClaimTemplates:
        - metadata:
            name: pvc-161070100417416148
            namespace: default
            creationTimestamp: null
            annotations:
              csi.storage.k8s.io/fstype: s3fs
              everest.io/obs-volume-type: STANDARD
          spec:
            accessModes:
              - ReadWriteMany
            resources:
              requests:
                storage: 1Gi
            storageClassName: csi-obs

    O valor do parâmetro deve ser o mesmo que o PVC do volume do OBS criado em 3.

    • Exclua o StatefulSet.

    kubectl delete sts xxx -n {namespaces}

    • Crie o StatefulSet.

    kubectl create -f sts.yaml

  5. Verifique as funções de serviço.

    1. Verifique se a aplicação está sendo executada corretamente.
    2. Verifique se o armazenamento de dados está normal.

    Se uma reversão for necessária, execute 4. Selecione o PVC no formato FlexVolume e atualize a aplicação.

  6. Desinstale o PVC no formato FlexVolume.

    Se a aplicação funcionar normalmente, desvincule o PVC no formato FlexVolume na página de gerenciamento de armazenamento.

    Você também pode executar o comando kubectl para excluir o PVC e o PV do formato FlexVolume.

    Antes de excluir um PV, altere o persistentVolumeReclaimPolicy do PV para Retain. Caso contrário, o armazenamento subjacente será recuperado após a exclusão do PV.

    Se o cluster tiver sido atualizado antes da migração de armazenamento, os PVs poderão não ser excluídos. Você pode remover o campo de proteção do PV finalizers para excluir PVs.

    kubectl patch pv {pv_name} -p '{"metadata":{"finalizers":null}}'