Cómo escalar tu almacenamiento de Managed Lustre en GKE

En este documento, se describe cómo aumentar de forma dinámica la capacidad de almacenamiento de los volúmenes de Lustre administrados para tus cargas de trabajo con estado en Google Kubernetes Engine (GKE) sin interrumpir tus aplicaciones.

Por ejemplo, si tus trabajos de entrenamiento de IA/ML de larga duración tienen requisitos de almacenamiento dinámicos e impredecibles, habilita la expansión del volumen de Managed Lustre para aumentar la capacidad de almacenamiento de tu PersistentVolume (PV) de Managed Lustre existente.

Este documento está dirigido a administradores y operadores de plataformas, profesionales de DevOps, administradores de almacenamiento e ingenieros de aprendizaje automático (AA) que administran el almacenamiento para cargas de trabajo con estado en GKE.

Cuando expandes un volumen, tus costos aumentan según la nueva capacidad más grande, de acuerdo con los precios estándar de Managed Lustre.Google Cloud

Antes de comenzar

Prepara el entorno.

Requisitos

Asegúrate de cumplir con los siguientes requisitos:

  • Debes tener un clúster de GKE con la versión 1.35.0-gke.2331000 o posterior.
  • Debes habilitar el controlador de CSI de Lustre administrado en un clúster existente. El controlador está inhabilitado de forma predeterminada en los clústeres de Standard y Autopilot.

Limitaciones

  • Solo puedes aumentar el tamaño de un volumen existente, no disminuirlo.
  • No puedes usar la expansión de volumen con el modo de acceso ReadOnlyMany.
  • Cuando cambies el tamaño de los volúmenes de Lustre, sigue los límites de capacidad mínima y máxima, y los tamaños de paso establecidos por el nivel de rendimiento de tu volumen. Para obtener más información, consulta Consideraciones sobre el rendimiento.
  • Especifica los tamaños de los volúmenes de Lustre en GiB como múltiplos de 1,000. Kubernetes traduce unidades como Ti en valores binarios (por ejemplo, 18 Ti se interpreta como 18,432 GiB), lo que hace que la API de Lustre rechace la solicitud.

Habilita la expansión de volumen para una StorageClass

  1. Verifica si tu StorageClass admite la expansión de volumen:

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

    Reemplaza STORAGECLASS_NAME por el nombre de tu StorageClass.

    Si el comando no genera ningún resultado o devuelve false, debes actualizar explícitamente la configuración de StorageClass para permitir la expansión.

  2. Abre la configuración de StorageClass para editarla:

    kubectl edit storageclass STORAGECLASS_NAME
    
  3. En el editor, agrega el campo allowVolumeExpansion: true a la configuración de StorageClass:

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

Expande una PersistentVolumeClaim

Para iniciar la expansión del volumen, edita tu PersistentVolumeClaim (PVC) para solicitar un aumento en el tamaño del volumen.

  1. Identifica el nuevo tamaño válido para la expansión, como se describe en Cómo determinar tamaños de expansión válidos.
  2. Abre la configuración del PVC para editarla:

    kubectl edit pvc PVC_NAME
    

    Reemplaza PVC_NAME por el nombre de tu PVC.

  3. En el editor, actualiza el campo spec.resources.requests.storage con el tamaño de expansión válido. Por ejemplo, para expandir un volumen de 9000Gi a 18000Gi, modifica el campo storage de la siguiente manera:

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

Verifica la expansión del volumen

  1. Supervisa el progreso de la expansión revisando los eventos del PVC:

    kubectl describe pvc PVC_NAME
    

    Los siguientes eventos en el resultado del PVC indican el progreso o el resultado actual de la solicitud de expansión del volumen:

    • ExternalExpanding: Indica que Kubernetes está esperando a que external-resizer expanda el PVC.
    • Resizing: Indica que la operación de cambio de tamaño está en curso. Esta operación puede tardar hasta 90 minutos en el caso de aumentos de capacidad más grandes.
    • VolumeResizeSuccessful: Confirma que el volumen se expandió correctamente.
    • VolumeResizeFailed: Indica que se produjo un error. El mensaje del evento contiene detalles de la API de Google Cloud Managed Lustre. Este estado puede ser transitorio y resolverse por sí solo.
  2. Una vez que se complete la expansión, verifica la configuración actualizada del PVC:

    kubectl get pvc PVC_NAME -o yaml
    
  3. Asegúrate de que el campo status.capacity refleje el tamaño nuevo y aumentado.

Si tienes algún problema durante el proceso de expansión, consulta Solución de problemas.

Cómo determinar los tamaños de expansión válidos

Para determinar el nuevo tamaño del volumen, primero identifica el nivel de rendimiento del volumen y su tamaño de paso correspondiente.

Identifica el nivel de rendimiento del volumen

Puedes encontrar el nivel de rendimiento de tu volumen con cualquiera de las siguientes opciones:

StorageClass

Ejecuta el siguiente comando y busca el valor de perUnitStorageThroughput (por ejemplo, 1000). Este valor indica el nivel de rendimiento en MB/s por TiB.

kubectl get sc STORAGECLASS_NAME -o yaml

Reemplaza STORAGECLASS_NAME por el nombre de tu StorageClass.

Instancia de Lustre

Para identificar el nivel de rendimiento de tu volumen, verifica directamente las propiedades de la instancia de Managed Lustre subyacente:

  1. Busca el nombre del PV vinculado a tu PVC:

    kubectl get pvc PVC_NAME
    

    Reemplaza PVC_NAME por el nombre de tu PVC.

    El resultado es similar al siguiente. Observa el nombre de la PV en la columna VOLUME, por ejemplo, pv-lustre.

    NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    pvc-lustre   Bound    pv-lustre   9000Gi     RWX            lustre-rwx     <unset>                 26m
    
  2. Busca la ubicación y el nombre de la instancia del volumen en el campo volumeHandle:

    kubectl get pv PV_NAME -o yaml
    

    Reemplaza PV_NAME por el nombre del PV del paso anterior.

    El valor volumeHandle tiene el formato PROJECT_ID/LOCATION/INSTANCE_NAME. Toma nota de INSTANCE_NAME y LOCATION para el siguiente paso.

  3. Para verificar las propiedades del nivel de rendimiento, describe la instancia de Managed Lustre:

    gcloud lustre instances describe INSTANCE_NAME --location=LOCATION
    

    Reemplaza INSTANCE_NAME y LOCATION por los valores del paso anterior.

    En el resultado, busca el campo perUnitStorageThroughput. Este valor indica el nivel de rendimiento en MBps por TiB.

Límites de capacidad y tamaños de pasos

Después de identificar el nivel de rendimiento, consulta la siguiente tabla para encontrar los límites de capacidad asociados y el tamaño de paso requerido.

Nivel (perUnitStorageThroughput) Capacidad mínima Capacidad máxima Tamaño del paso
1,000 MBps por TiB 9,000 GiB 954,000 GiB (aproximadamente 1 PiB) 9,000 GiB
500 MBps por TiB 18,000 GiB 1,908,000 GiB (aproximadamente 2 PiB) 18,000 GiB
250 MBps por TiB 36,000 GiB 3,816,000 GiB (aproximadamente 4 PiB) 36,000 GiB
125 MBps por TiB 72,000 GiB 7,632,000 GiB (aproximadamente 8 PiB) 72,000 GiB

Los volúmenes deben aumentarse según el tamaño del paso asignado a su nivel. Cualquier aumento en la capacidad debe ser un múltiplo de ese tamaño de paso específico. Por ejemplo, si tu volumen de nivel de 1,000 MB/s tiene una capacidad de 9,000 GiB, puedes aumentarla a 18,000 GiB, 27,000 GiB y otros múltiplos.

Soluciona problemas

En esta sección, se proporcionan soluciones para los problemas comunes que puedes encontrar cuando expandes volúmenes de Lustre.

La expansión falla con un error de "Invalid Argument"

Síntoma

  • El PVC entra en un estado Resizing, pero luego falla.
  • Cuando ejecutas el comando kubectl describe pvc PVC_NAME, ves un error similar a VolumeResizeFailed: rpc error: code = InvalidArgument desc = ....

Causa

Por lo general, este error significa que el tamaño de almacenamiento solicitado no es válido para el nivel de rendimiento del volumen de Lustre por uno de los siguientes motivos:

  • El tamaño solicitado no es un múltiplo del tamaño de paso requerido para el nivel.
  • El tamaño solicitado es inferior al mínimo o superior a la capacidad máxima del nivel.

Solución

  1. Revisa Límites de capacidad y tamaños de paso para encontrar los tamaños de paso y los límites de capacidad válidos para el nivel de rendimiento de tu volumen.
  2. Vuelve a editar la PVC para solicitar un tamaño de almacenamiento válido que cumpla con los límites de capacidad y tamaño de paso.

La expansión falla con un "Error interno"

Síntoma

  • Falla el cambio de tamaño del PVC.
  • Cuando ejecutas el comando kubectl describe pvc PVC_NAME, es posible que veas un evento VolumeResizeFailed con un mensaje de error que contiene code = Internal.

Causa

Este error indica un problema con el servicio subyacente de Lustre administrado.

Solución

  1. Vuelve a intentar la expansión aplicando el manifiesto de PVC con el nuevo tamaño solicitado. Esto podría resolver problemas transitorios del backend.
  2. Si el reintento falla, comunícate con Atención al cliente de Cloud.

La expansión está detenida en el estado "Cambiando el tamaño"

Síntoma

  • El PVC permanece en el estado Resizing durante un período prolongado (más de 30 minutos para expansiones más pequeñas o más de 90 minutos para expansiones más grandes).
  • Es posible que veas un evento VolumeResizeFailed con un mensaje de error DEADLINE_EXCEEDED.

Causa

Este problema puede ocurrir con grandes aumentos de capacidad, que pueden tardar hasta 90 minutos en completarse. Es posible que el componente csi-external-resizer agote el tiempo de espera mientras espera la respuesta de la API de Google Cloud Managed Lustre, aunque la operación de expansión subyacente aún esté en curso.

Solución

  • csi-external-resizer vuelve a intentar la operación automáticamente después de un período de espera. Sigue supervisando los eventos de PVC para detectar un evento VolumeResizeSuccessful.
  • Si el PVC permanece en el estado Resizing durante más de 90 minutos, comunícate con Atención al cliente de Cloud.

La expansión no se inicia o se queda en el estado ExternalExpanding

Síntoma

  • Actualizas el campo spec.resources.requests.storage en tu PVC, pero el estado del PVC no cambia a Resizing.
  • Cuando ejecutas el comando kubectl describe pvc PVC_NAME, el registro de eventos solo muestra el estado ExternalExpanding y no avanza al 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

Por lo general, este comportamiento indica uno de los siguientes problemas:

  • La StorageClass asociada con el PVC no permite la expansión del volumen.
  • Hay un problema con el contenedor secundario csi-external-resizer, que es el componente responsable de iniciar la expansión.

Solución

  1. Verifica la configuración de StorageClass y comprueba que el campo allowVolumeExpansion: true esté configurado:

    kubectl get sc STORAGECLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'
    
  2. Si falta allowVolumeExpansion o se configuró como false, actualiza la StorageClass para permitir la expansión del volumen.

  3. Si la clase de almacenamiento está configurada correctamente, es probable que el problema se deba a los componentes del plano de control de GKE que administran la operación de cambio de tamaño. Comunícate con Atención al cliente de Cloud para obtener ayuda.

La expansión falla debido a un problema de cuota o capacidad

Síntoma

  • Falla el cambio de tamaño de la PVC y aparece un evento VolumeResizeFailed en la PVC.
  • Cuando ejecutas el comando kubectl describe pvc PVC_NAME, el mensaje de evento del backend de Lustre administrado indica un problema de cuota o capacidad.

Causa

No se puede satisfacer la expansión válida solicitada porque supera la capacidad o la cuota general disponible para el servicio de Lustre administrado en tu proyecto o región.

Solución

  • Vuelve a editar tu PVC y solicita un aumento de almacenamiento más pequeño.
  • Comunícate con el administrador de Google Cloud de tu organización para solicitar un aumento en las cuotas o la capacidad generales del servicio de Lustre para tu proyecto.

Realiza una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en este documento, borra el PVC. Esta operación también borra el PV asociado y la instancia subyacente de Managed Lustre si reclaimPolicy se establece en Delete.

kubectl delete pvc PVC_NAME

Reemplaza PVC_NAME por el nombre de tu PVC.

¿Qué sigue?