Escalonar o armazenamento do Managed Lustre no GKE

Este documento descreve como aumentar dinamicamente a capacidade de armazenamento dos volumes gerenciados do Lustre para suas cargas de trabalho com estado no Google Kubernetes Engine (GKE) sem interromper os aplicativos.

Por exemplo, se os jobs de treinamento de IA/ML de longa duração tiverem requisitos de armazenamento dinâmicos e imprevisíveis, ative a expansão de volume do Managed Lustre para aumentar a capacidade de armazenamento do PersistentVolume (PV) do Managed Lustre atual.

Este documento é destinado a administradores e operadores de plataforma, DevOps, administradores de armazenamento e engenheiros de machine learning (ML) que gerenciam o armazenamento de cargas de trabalho com estado no GKE.

Quando você expande um volume, os custos aumentam com base na nova capacidade maior, de acordo com os preços padrão do Managed LustreGoogle Cloud .

Antes de começar

Preparar o ambiente.

Requisitos

Verifique se você atende aos seguintes requisitos:

  • Você precisa ter um cluster do GKE versão 1.35.0-gke.2331000 ou mais recente.
  • É necessário ativar o driver CSI do Lustre gerenciado em um cluster atual. O driver é desativado por padrão nos clusters Standard e do Autopilot.

Limitações

  • Só é possível aumentar o tamanho de um volume atual, não diminuir.
  • Não é possível usar a expansão de volume com o modo de acesso ReadOnlyMany.
  • Ao redimensionar volumes do Lustre, siga os limites de capacidade mínima e máxima e os tamanhos de etapa definidos pelo nível de desempenho do volume. Para mais informações, consulte Considerações sobre desempenho.
  • Especifique os tamanhos de volume do Lustre em GiB como múltiplos de 1.000. O Kubernetes traduz unidades como Ti em valores binários (por exemplo, 18 Ti são interpretados como 18.432 GiB), o que faz com que a API Lustre rejeite a solicitação.

Ativar a expansão de volume para uma StorageClass

  1. Verifique se a StorageClass é compatível com a expansão de volume:

    kubectl get sc STORAGECLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'
    

    Substitua STORAGECLASS_NAME pelo nome da sua StorageClass.

    Se o comando não gerar nada ou retornar false, atualize explicitamente a configuração do StorageClass para permitir a expansão.

  2. Abra a configuração do StorageClass para edição:

    kubectl edit storageclass STORAGECLASS_NAME
    
  3. No editor, adicione o campo allowVolumeExpansion: true à configuração do StorageClass:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: lustre-sc
    provisioner: lustre.csi.storage.gke.io
    ...
    allowVolumeExpansion: true

Expandir um PersistentVolumeClaim

Para iniciar a expansão do volume, edite o PersistentVolumeClaim (PVC) para solicitar um aumento no tamanho do volume.

  1. Identifique o novo tamanho válido para expansão, conforme descrito em Determinar tamanhos de expansão válidos.
  2. Abra a configuração do PVC para edição:

    kubectl edit pvc PVC_NAME
    

    Substitua PVC_NAME pelo nome da PVC.

  3. No editor, atualize o campo spec.resources.requests.storage com o tamanho de expansão válido. Por exemplo, para expandir um volume de 9000Gi para 18000Gi, modifique o campo storage da seguinte maneira:

    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 18000Gi # Changed from 9000Gi
    

Verificar a expansão de volume

  1. Monitore o progresso da expansão revisando os eventos do PVC:

    kubectl describe pvc PVC_NAME
    

    Os eventos a seguir na saída do PVC indicam o progresso ou resultado atual da solicitação de expansão de volume:

    • ExternalExpanding: indica que o Kubernetes está aguardando o external-resizer expandir o PVC.
    • Resizing: indica que a operação de redimensionamento está em andamento. Essa operação pode levar até 90 minutos para aumentos de capacidade maiores.
    • VolumeResizeSuccessful: confirma que o volume foi expandido.
    • VolumeResizeFailed: indica que ocorreu um erro. A mensagem de evento contém detalhes da API Google Cloud Managed Lustre. Esse estado pode ser transitório e se resolver sozinho.
  2. Depois que a expansão for concluída, verifique a configuração atualizada do PVC:

    kubectl get pvc PVC_NAME -o yaml
    
  3. Verifique se o campo status.capacity reflete o novo tamanho incrementado.

Se você encontrar problemas durante o processo de expansão, consulte Solução de problemas.

Determinar tamanhos de expansão válidos

Para determinar o novo tamanho do volume, primeiro identifique o nível de desempenho e o tamanho da etapa correspondente.

Identificar o nível de desempenho do volume

Para encontrar o nível de desempenho do volume, use uma destas opções:

StorageClass

Execute o comando a seguir e procure o valor perUnitStorageThroughput (por exemplo, 1000). Esse valor indica o nível de performance em MBps por TiB.

kubectl get sc STORAGECLASS_NAME -o yaml

Substitua STORAGECLASS_NAME pelo nome da sua StorageClass.

Instância do Lustre

Para identificar o nível de desempenho do seu volume, verifique diretamente as propriedades da instância do Managed Lustre:

  1. Encontre o nome do PV vinculado ao seu PVC:

    kubectl get pvc PVC_NAME
    

    Substitua PVC_NAME pelo nome da PVC.

    A resposta será semelhante a esta: Observe o nome PV na coluna VOLUME, por exemplo, pv-lustre.

    NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    pvc-lustre   Bound    pv-lustre   9000Gi     RWX            lustre-rwx     <unset>                 26m
    
  2. Encontre o local e o nome da instância do volume no campo volumeHandle:

    kubectl get pv PV_NAME -o yaml
    

    Substitua PV_NAME pelo nome do PV da etapa anterior.

    O valor volumeHandle é formatado como PROJECT_ID/LOCATION/INSTANCE_NAME. Anote o INSTANCE_NAME e o LOCATION para a próxima etapa.

  3. Verifique as propriedades do nível de desempenho descrevendo a instância do Managed Lustre:

    gcloud lustre instances describe INSTANCE_NAME --location=LOCATION
    

    Substitua INSTANCE_NAME e LOCATION pelos valores da etapa anterior.

    Na saída, procure o campo perUnitStorageThroughput. Esse valor indica o nível de desempenho em MBps por TiB.

Limites de capacidade e tamanhos de etapas

Depois de identificar o nível de performance, consulte a tabela a seguir para encontrar os limites de capacidade associados e o tamanho da etapa necessário.

Nível (perUnitStorageThroughput) Capacidade mínima Capacidade máxima Taxa de aprendizagem
1.000 MBps por TiB 9.000 GiB 954.000 GiB (~1 PiB) 9.000 GiB
500 MBps por TiB 18.000 GiB 1.908.000 GiB (~2 PiB) 18.000 GiB
250 MBps por TiB 36.000 GiB 3.816.000 GiB (~4 PiB) 36.000 GiB
125 MBps por TiB 72.000 GiB 7.632.000 GiB (~8 PiB) 72.000 GiB

Os volumes precisam ser aumentados de acordo com o tamanho da etapa atribuído ao nível. Qualquer aumento na capacidade precisa ser um múltiplo desse tamanho de etapa específico. Por exemplo, se o volume de 1.000 MBps tiver uma capacidade de 9.000 GiB, você poderá aumentar para 18.000 GiB, 27.000 GiB e outros múltiplos.

Solução de problemas

Nesta seção, apresentamos soluções para problemas comuns que podem ocorrer ao expandir volumes do Lustre.

A expansão falha com um erro "Argumento inválido"

Sintoma

  • O PVC entra em um estado Resizing, mas depois falha.
  • Ao executar o comando kubectl describe pvc PVC_NAME, você vai encontrar um erro semelhante a VolumeResizeFailed: rpc error: code = InvalidArgument desc = ....

Causa

Esse erro geralmente significa que o tamanho de armazenamento solicitado não é válido para o nível de desempenho do volume do Lustre por um dos seguintes motivos:

  • O tamanho solicitado não é um múltiplo do tamanho de etapa necessário para o nível.
  • O tamanho solicitado está abaixo do mínimo ou acima da capacidade máxima para o nível.

Resolução

  1. Consulte Limites de capacidade e taxas de aprendizado para encontrar as taxas de aprendizado e os limites de capacidade válidos para o nível de desempenho do seu volume.
  2. Edite o PVC novamente para solicitar um tamanho de armazenamento válido que atenda aos limites de tamanho e capacidade da etapa.

A expansão falha com um "Erro interno"

Sintoma

  • O redimensionamento do PVC falha.
  • Ao executar o comando kubectl describe pvc PVC_NAME, talvez você veja um evento VolumeResizeFailed com uma mensagem de erro que contém code = Internal.

Causa

Esse erro indica um problema com o serviço Managed Lustre subjacente.

Resolução

  1. Tente de novo aplicando o manifesto de PVC com o novo tamanho solicitado. Isso pode resolver problemas temporários de back-end.
  2. Se a nova tentativa falhar, entre em contato com o Cloud Customer Care.

A expansão está travada no estado "Redimensionando"

Sintoma

  • A PVC permanece no estado Resizing por um período prolongado (mais de 30 minutos para expansões menores ou mais de 90 minutos para expansões maiores).
  • Talvez você veja um evento VolumeResizeFailed com uma mensagem de erro DEADLINE_EXCEEDED.

Causa

Esse problema pode ocorrer com aumentos de capacidade grandes, que podem levar até 90 minutos para serem concluídos. O componente csi-external-resizer pode atingir o tempo limite enquanto aguarda a resposta da API Google Cloud Managed Lustre, mesmo que a operação de expansão subjacente ainda esteja em andamento.

Resolução

  • O csi-external-resizer repete automaticamente a operação após um período de espera. Continue monitorando os eventos de PVC para um evento VolumeResizeSuccessful.
  • Se o PVC permanecer no estado Resizing por mais de 90 minutos, entre em contato com o Cloud Customer Care.

A expansão não começa ou fica presa no estado "ExternalExpanding"

Sintoma

  • Você atualiza o campo spec.resources.requests.storage no PVC, mas o status dele não muda para Resizing.
  • Quando você executa o comando kubectl describe pvc PVC_NAME, o registro de eventos mostra apenas o estado ExternalExpanding e não avança para o estado Resizing:
Events:
  Type    Reason             Age                From             Message
  ----    ------             ----               ----             -------
  Normal  ExternalExpanding  21m (x2 over 58m)  volume_expand    waiting for an external controller to expand this PVC

Causa

Esse comportamento geralmente indica um dos seguintes problemas:

  • A StorageClass associada ao PVC não permite a expansão do volume.
  • Há um problema com o contêiner secundário csi-external-resizer, que é o componente responsável por iniciar a expansão.

Resolução

  1. Verifique a configuração da StorageClass e confira se o campo allowVolumeExpansion: true está definido:

    kubectl get sc STORAGECLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'
    
  2. Se allowVolumeExpansion estiver ausente ou definido como false, atualize o StorageClass para permitir a expansão de volume.

  3. Se a StorageClass estiver configurada corretamente, o problema provavelmente será com os componentes do plano de controle do GKE que gerenciam a operação de redimensionamento. Entre em contato com o Cloud Customer Care para receber ajuda.

A expansão falha devido a um problema de cota ou capacidade

Sintoma

  • O redimensionamento do PVC falha, e um evento VolumeResizeFailed aparece no PVC.
  • Quando você executa o comando kubectl describe pvc PVC_NAME, a mensagem de evento do back-end do Lustre gerenciado indica um problema de cota ou capacidade.

Causa

A expansão válida solicitada não pode ser atendida porque excede a capacidade ou cota geral disponível para o serviço Managed Lustre no seu projeto ou região.

Resolução

  • Edite o PVC de novo e peça um aumento menor de armazenamento.
  • Entre em contato com o administrador Google Cloud da sua organização para pedir um aumento nas cotas ou na capacidade geral do serviço Lustre para seu projeto.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste documento, exclua a PVC. Essa operação também exclui o PV associado e a instância do Managed Lustre subjacente se o reclaimPolicy estiver definido como Delete.

kubectl delete pvc PVC_NAME

Substitua PVC_NAME pelo nome da PVC.

A seguir