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
- (Opcional) Faça backup dos dados para evitar a perda de dados em caso de exceções.
- 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.
- 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.
- Atualize a carga de trabalho para usar um novo PVC.
Para implementações
- 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
- 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.
- Desinstale o armazenamento antigo e adicione o PVC no formato CSI. Mantenha o caminho de montagem original no contêiner.
- Clique em Submit.
- Aguarde até que os pods estejam funcionando.
Para StatefulSets que usam armazenamento existente
- 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
- 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.
- 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
- 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
- Altere o número de pods para 0.
- Na página de armazenamento, desassocie o PVC de flexVolume usado pelo StatefulSet.
- 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
- 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
- Execute os comandos kubectl create -f para criar um PV e um PVC.
- Verifique as funções de serviço.
- Verifique se a aplicação está sendo executada corretamente.
- 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.
- 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}}'