Como usar a expansão de volume


No Google Kubernetes Engine (GKE) versão 1.24 ou posterior, é possível usar o recurso de expansão de volume do Kubernetes para alterar a capacidade de um volume permanente após a criação.

Para saber mais sobre a expansão de volume, consulte a documentação do Kubernetes de código aberto.

Pré-requisitos

A expansão de volume tem os seguintes pré-requisitos:

  • Se o volume que você quer redimensionar é gerenciado por um driver CSI, siga estas instruções:
    • Verifique se a versão do Cluster do GKE é a 1.16 ou uma mais recente. Se o cluster tiver pools de nós do Windows, verifique se a versão do cluster do GKE é 1.18 ou superior. Se você estiver usando o driver CSI do GKE Filestore gerenciado, a versão do cluster precisará ser de 1.21 ou superior.
    • Confira a documentação do fornecedor de armazenamento para verificar se o driver CSI é compatível com a expansão de volume. O driver CSI do Persistent Disk do Compute Engine e o driver CSI do Filestore são compatíveis com a expansão de volume.
  • Se o volume que você quer redimensionar é gerenciado por um plug-in de volume na árvore, siga estas instruções:
    • Verifique se a versão do Cluster do GKE é a 1.11 ou uma mais recente. Embora as versões 1.11-1.14 do Cluster do GKE sejam compatíveis com a expansão de volumes gerenciados por plug-ins em árvore, é necessário que todos os pods que usam o volume sejam encerrados e recriados para concluir a expansão.
    • Confira a documentação do fornecedor de armazenamento para verificar se o plug-in de volume em árvore é compatível com a expansão de volume, como é o caso do plug-in em árvore do Persistent Disk do Compute Engine.

Como usar a expansão de volume

Para usar a expansão de volume, execute as seguintes tarefas:

  1. Adicione allowVolumeExpansion: true ao StorageClass se ainda não existir o campo. Exemplo:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: standard
    provisioner: my.driver
    ...
    allowVolumeExpansion: true
    
  2. Solicite uma alteração na capacidade do volume ao editar o campo spec.resources.requests.storage do PersistentVolumeClaim.

     kubectl edit pvc pvc-name
    

    Por exemplo, é possível alterar o PVC a seguir de um disco de 30 gibibyte (GiB) para um disco de 40 GiB.

    Antes da edição

     # pvc-demo.yaml
     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: pvc-demo
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 30Gi
    

    Após a edição

     # pvc-demo.yaml
     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: pvc-demo
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 40Gi
    
  3. Verifique a alteração visualizando o PVC. Para ver o PVC, execute o seguinte comando:

    kubectl get pvc pvc-name -o yaml
    

    Futuramente, você verá o novo volume no campo status.capacity. Exemplo:

    ...
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 40Gi
      storageClassName: standard
      volumeMode: Filesystem
      volumeName: pvc-078b7484-cc8d-4077-9bcb-2c17d8d4550c
    status:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 40Gi
    ...
    

Quando a capacidade de um PersistentVolume é modificada diretamente, isso pode fazer os sistemas de arquivos do contêiner ficarem incorretos. Para corrigir esses problemas, consulte Resolver problemas em alterações de expansão de volume.

Como gerenciar expansões de volume em StatefulSets

Se você precisar aumentar o tamanho dos volumes usados por pods em um StatefulSet no Kubernetes, ajuste o campo spec.resources.requests.storage dos PersistentVolumeClaims (PVCs) associados com os pods. A tentativa de modificar o campo volumeClaimTemplates diretamente no objeto StatefulSet causará um erro.

Além disso, se você aumentar a contagem de réplicas do StatefulSet, ele ainda criará PVCs do tamanho original. Para alterar permanentemente o tamanho dos volumes provisionados para os pods gerenciados pelo StatefulSet, é necessário excluir e recriar o objeto StatefulSet com o tamanho atualizado especificado no campo volumeClaimTemplates. Esse processo resultará na exclusão dos pods antigos e dos PVCs correspondentes. Dependendo do ReclaimPolicy, o armazenamento subjacente também pode ser excluído.

Execute as etapas a seguir para manter os pods originais em execução enquanto ajusta o StatefulSet para provisionar réplicas futuras com o novo tamanho do volume.

  1. Salve o StatefulSet atual em um arquivo:

    kubectl get StatefulSet statefulset-name -o yaml > sts-backup.yaml
    
  2. Remova o objeto StatefulSet do cluster, mantendo os pods em execução como independentes:

    kubectl delete sts statefulset-name --cascade=orphan
    
  3. Edite o novo tamanho do armazenamento do volume no arquivo sts-backup.yaml salvo localmente, especificamente o valor de spec.volumeClaimTemplates.spec.resources.requests.storage.

  4. Recrie o StatefulSet no cluster:

    kubectl apply -f sts-backup.yaml
    

A seguir