Acceder a instancias de Managed Lustre en GKE con el controlador CSI de Managed Lustre

En esta guía se describe cómo crear un volumen de Kubernetes respaldado por el controlador CSI de Lustre gestionado en GKE con aprovisionamiento dinámico. El controlador CSI de Managed Lustre te permite crear almacenamiento respaldado por instancias de Managed Lustre bajo demanda y acceder a él como volúmenes para tus cargas de trabajo con estado.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Cloud Managed Lustre y la API de Google Kubernetes Engine.
  • Habilitar APIs
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Configurar variables de entorno

Define las siguientes variables de entorno:

export CLUSTER_NAME=CLUSTER_NAME
export PROJECT_ID=PROJECT_ID
export NETWORK_NAME=LUSTRE_NETWORK
export IP_RANGE_NAME=LUSTRE_IP_RANGE
export FIREWALL_RULE_NAME=LUSTRE_FIREWALL_RULE
export LOCATION=ZONE
export CLUSTER_VERSION=CLUSTER_VERSION

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster.
  • PROJECT_ID: tu Google Cloud ID de proyecto.
  • LUSTRE_NETWORK: la red de nube privada virtual (VPC) compartida en la que residen tanto el clúster de GKE como la instancia de Managed Lustre.
  • LUSTRE_IP_RANGE: el nombre del intervalo de direcciones IP creado para el emparejamiento entre redes de VPC con Managed Lustre.
  • LUSTRE_FIREWALL_RULE: nombre de la regla de cortafuegos para permitir el tráfico TCP del intervalo de direcciones IP.
  • ZONE: la zona geográfica de tu clúster de GKE. Por ejemplo, us-central1-a.
  • CLUSTER_VERSION: la versión del clúster de GKE.

Configurar una red de VPC

Debes especificar la misma red de VPC al crear la instancia de Lustre gestionada y tus clústeres de GKE, o bien conectarlos a través de Network Connectivity Center si usas una red de VPC emparejada.

  1. Para habilitar la creación de redes de servicios, ejecuta el siguiente comando:

    gcloud services enable servicenetworking.googleapis.com \
        --project=${PROJECT_ID}
    
  2. Crea una red de VPC. Si se asigna el valor 8896 a la marca --mtu, el rendimiento aumenta un 10 %.

    gcloud compute networks create ${NETWORK_NAME} \
        --subnet-mode=auto --project=${PROJECT_ID} \
        --mtu=8896
    
  3. Crea un intervalo de direcciones IP.

    gcloud compute addresses create ${IP_RANGE_NAME} \
        --global \
        --purpose=VPC_PEERING \
        --prefix-length=20 \
        --description="Managed Lustre VPC Peering" \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID}
    
  4. Obtén el intervalo CIDR asociado al intervalo que has creado en el paso anterior.

    CIDR_RANGE=$(
      gcloud compute addresses describe ${IP_RANGE_NAME} \
          --global  \
          --format="value[separator=/](address, prefixLength)" \
          --project=${PROJECT_ID}
    )
    
  5. Crea una regla de cortafuegos para permitir el tráfico TCP del intervalo de direcciones IP que has creado.

    gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
        --allow=tcp:988,tcp:6988 \
        --network=${NETWORK_NAME} \
        --source-ranges=${CIDR_RANGE} \
        --project=${PROJECT_ID}
    
  6. Para configurar el emparejamiento entre redes de tu proyecto, comprueba que tienes los permisos de gestión de identidades y accesos necesarios, concretamente el rol compute.networkAdmin o servicenetworking.networksAdmin.

    1. Ve a Google Cloud consola > IAM y administración y, a continuación, busca la principal propietaria de tu proyecto.
    2. Haz clic en el icono del lápiz y, a continuación, en + AÑADIR OTRO ROL.
    3. Selecciona Administrador de red de Compute o Administrador de redes de servicios.
    4. Haz clic en Guardar.
  7. Conecta el intercambio de tráfico.

    gcloud services vpc-peerings connect \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID} \
        --ranges=${IP_RANGE_NAME} \
        --service=servicenetworking.googleapis.com
    

Configurar el controlador de CSI de Managed Lustre

En esta sección se explica cómo habilitar e inhabilitar el controlador CSI de Lustre gestionado, si es necesario.

Puertos de comunicación de Lustre

El controlador CSI de Managed Lustre de GKE usa diferentes puertos para comunicarse con las instancias de Managed Lustre, en función de la versión del clúster de GKE y de las configuraciones de Managed Lustre.

  • Puerto predeterminado (recomendado): en los clústeres de GKE nuevos que ejecutan la versión 1.33.2-gke.4780000 o posterior, el controlador usa el puerto 988 para la comunicación de Lustre de forma predeterminada.

  • Puerto antiguo: usa el puerto 6988 añadiendo la marca --enable-legacy-lustre-port a tus comandos gcloud en los siguientes casos:

    • Versiones anteriores de GKE: si tu clúster de GKE ejecuta una versión anterior a 1.33.2-gke.4780000, la marca --enable-legacy-lustre-port soluciona un conflicto de puertos con gke-metadata-server en los nodos de GKE.
    • Instancias de Lustre: si te conectas a una instancia de Lustre gestionada que se haya creado con la marca gke-support-enabled, debes incluir --enable-legacy-lustre-port en tus comandos gcloud, independientemente de la versión de tu clúster. Si no se incluye esta marca, el clúster de GKE no podrá montar la instancia de Lustre. Para obtener información sobre la marca gke-support-enabled, consulta la descripción de las marcas opcionales en Crear una instancia.

Puedes configurar los clústeres nuevos y los que ya tengas para que usen el puerto predeterminado 988 o el puerto antiguo 6988.

Habilitar el controlador de CSI de Lustre gestionado en un clúster de GKE nuevo

En las siguientes secciones se describe cómo habilitar el controlador CSI de Lustre gestionado en un clúster de GKE nuevo.

Usar el puerto predeterminado 988

Para habilitar el controlador de CSI de Lustre gestionado al crear un clúster de GKE que ejecute la versión 1.33.2-gke.4780000 o una posterior, ejecuta el siguiente comando:

Autopilot

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver

Estándar

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver

Usar el puerto antiguo 6988

Para habilitar el controlador de CSI de Lustre gestionado al crear un clúster de GKE que ejecute una versión anterior a 1.33.2-gke.4780000, ejecuta el siguiente comando:

Autopilot

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver \
    --enable-legacy-lustre-port

Estándar

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver \
    --enable-legacy-lustre-port

Habilitar el controlador de CSI de Lustre gestionado en clústeres de GKE

En las siguientes secciones se describe cómo habilitar el controlador CSI de Lustre gestionado en clústeres de GKE.

Usar el puerto predeterminado 988

Para habilitar el controlador CSI de Lustre gestionado en un clúster de GKE que ejecute la versión 1.33.2-gke.4780000 o una posterior, ejecuta el siguiente comando:

  gcloud container clusters update ${CLUSTER_NAME} \
      --location=${LOCATION} \
      --update-addons=LustreCsiDriver=ENABLED

Usar el puerto antiguo 6988

Para habilitar el controlador de CSI de Lustre gestionado en un clúster de GKE, es posible que tengas que usar el puerto antiguo 6988 añadiendo la marca --enable-legacy-lustre-port. Esta marca es obligatoria en los siguientes casos:

  • Si tu clúster de GKE se ejecuta en una versión anterior a 1.33.2-gke.4780000.
  • Si tienes intención de conectar este clúster a una instancia de Lustre gestionada que se haya creado con la marca gke-support-enabled.

    gcloud container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-legacy-lustre-port
    

Actualización de nodos obligatoria en clústeres

Si habilitas el controlador de CSI de Lustre gestionado en clústeres disponibles, se puede activar la recreación de nodos para actualizar los módulos del kernel necesarios para el cliente de Lustre gestionado. Para que esté disponible de inmediato, te recomendamos que actualices manualmente tus grupos de nodos.

Los clústeres de GKE de un canal de lanzamiento se actualizan según su implementación programada, que puede tardar varias semanas en función de tu ventana de mantenimiento. Si usas una versión estática de GKE, debes actualizar manualmente tus grupos de nodos.

Después de actualizar el pool de nodos, puede que parezca que los nodos de CPU están usando una imagen de GPU en la consola o en la salida de la CLI.Google Cloud Por ejemplo:

config:
  imageType: COS_CONTAINERD
  nodeImageConfig:
    image: gke-1330-gke1552000-cos-121-18867-90-4-c-nvda

Este comportamiento es el esperado. La imagen de GPU se reutiliza en los nodos de CPU para instalar de forma segura los módulos del kernel de Lustre gestionado. No se te cobrará por el uso de la GPU.

Inhabilitar el controlador de CSI de Managed Lustre

Puedes inhabilitar el controlador CSI de Lustre gestionado en un clúster de GKE con la CLI de Google Cloud.

gcloud container clusters update ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --update-addons=LustreCsiDriver=DISABLED

Una vez que se haya inhabilitado el controlador de CSI, GKE volverá a crear automáticamente los nodos y desinstalará los módulos del kernel de Lustre gestionado.

Crear un volumen con el controlador de CSI de Managed Lustre

En las siguientes secciones se describe el proceso habitual para crear un volumen de Kubernetes respaldado por una instancia de Lustre gestionada en GKE:

  1. Crea un StorageClass.
  2. Usa un PersistentVolumeClaim para acceder al volumen.
  3. Crea una carga de trabajo que consuma el volumen.

Crear un StorageClass

Cuando el controlador CSI de Managed Lustre está habilitado, GKE crea automáticamente una StorageClass para aprovisionar instancias de Managed Lustre. StorageClass depende del nivel de rendimiento de Managed Lustre. GKE y es una de las siguientes:

  • lustre-rwx-125mbps-per-tib
  • lustre-rwx-250mbps-per-tib
  • lustre-rwx-500mbps-per-tib
  • lustre-rwx-1000mbps-per-tib

GKE proporciona una StorageClass predeterminada para cada nivel de rendimiento de Lustre gestionado compatible. De esta forma, se simplifica el aprovisionamiento dinámico de instancias de Lustre gestionadas, ya que puedes usar las StorageClasses integradas sin tener que definir las tuyas.

En el caso de los clústeres zonales, el controlador CSI aprovisiona instancias de Managed Lustre en la misma zona que el clúster. En el caso de los clústeres regionales, aprovisiona la instancia en una de las zonas de la región.

En el siguiente ejemplo se muestra cómo crear un StorageClass personalizado con requisitos de topología específicos:

  1. Guarda el siguiente manifiesto en un archivo llamado lustre-class.yaml:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: lustre-class
    provisioner: lustre.csi.storage.gke.io
    volumeBindingMode: Immediate
    reclaimPolicy: Delete
    parameters:
      perUnitStorageThroughput: "1000"
      network: LUSTRE_NETWORK
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - us-central1-a
    

    Para ver la lista completa de los campos admitidos en StorageClass, consulte la documentación de referencia del controlador CSI de Lustre gestionado.

  2. Crea el objeto StorageClass ejecutando este comando:

    kubectl apply -f lustre-class.yaml
    

Usar un PersistentVolumeClaim para acceder al volumen

En esta sección se explica cómo crear un recurso PersistentVolumeClaim que haga referencia a la StorageClass del controlador CSI de Lustre gestionado.

  1. Guarda el siguiente manifiesto en un archivo llamado lustre-pvc.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: lustre-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 9000Gi
      storageClassName: lustre-class
    

    Para ver la lista completa de los campos admitidos en PersistentVolumeClaim, consulta la documentación de referencia del controlador CSI de Lustre gestionado.

  2. Para crear el PersistentVolumeClaim, ejecuta este comando:

    kubectl apply -f lustre-pvc.yaml
    

Crea una carga de trabajo para consumir el volumen

En esta sección se muestra un ejemplo de cómo crear un pod que consuma el recurso PersistentVolumeClaim que has creado anteriormente.

Varios pods pueden compartir el mismo recurso PersistentVolumeClaim.

  1. Guarda el siguiente manifiesto en un archivo llamado my-pod.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
          - name: lustre-volume
            mountPath: /data
      volumes:
      - name: lustre-volume
        persistentVolumeClaim:
          claimName: lustre-pvc
    
  2. Aplica el manifiesto al clúster.

    kubectl apply -f my-pod.yaml
    
  3. Comprueba que el pod se esté ejecutando. El pod se ejecuta después de que se aprovisione PersistentVolumeClaim. Esta operación puede tardar unos minutos en completarse.

    kubectl get pods
    

    El resultado debería ser similar al siguiente:

    NAME           READY   STATUS    RESTARTS   AGE
    my-pod         1/1     Running   0          11s
    

Usar fsGroup con volúmenes de Managed Lustre

Puedes cambiar la propiedad del grupo del directorio de nivel raíz del sistema de archivos montado para que coincida con el fsGroup solicitado por el usuario y especificado en el SecurityContext del pod. fsGroup no cambiará de forma recursiva la propiedad de todo el sistema de archivos Lustre gestionado montado, sino que solo se verá afectado el directorio raíz del punto de montaje.

Solución de problemas

Para obtener ayuda sobre cómo solucionar problemas, consulta la página de solución de problemas de la documentación de Lustre gestionado.

Limpieza

Para evitar que se apliquen cargos en tu cuenta de Google Cloud , elimina los recursos de almacenamiento que has creado en esta guía.

  1. Elimina el pod y PersistentVolumeClaim.

    kubectl delete pod my-pod
    kubectl delete pvc lustre-pvc
    
  2. Comprueba el estado de PersistentVolume.

    kubectl get pv
    

    El resultado debería ser similar al siguiente:

    No resources found
    

    La instancia de Lustre gestionada subyacente puede tardar unos minutos en eliminarse por completo.

Siguientes pasos