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
.
- Para obtener información sobre las limitaciones y los requisitos, consulta el resumen del controlador CSI.
- Asegúrate de habilitar el controlador CSI de Lustre gestionado. Está inhabilitado de forma predeterminada en los clústeres Standard y Autopilot.
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.
Para habilitar la creación de redes de servicios, ejecuta el siguiente comando:
gcloud services enable servicenetworking.googleapis.com \ --project=${PROJECT_ID}
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
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}
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} )
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}
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
oservicenetworking.networksAdmin
.- Ve a Google Cloud consola > IAM y administración y, a continuación, busca la principal propietaria de tu proyecto.
- Haz clic en el icono del lápiz y, a continuación, en + AÑADIR OTRO ROL.
- Selecciona Administrador de red de Compute o Administrador de redes de servicios.
- Haz clic en Guardar.
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 puerto988
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 comandosgcloud
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 congke-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 comandosgcloud
, 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 marcagke-support-enabled
, consulta la descripción de las marcas opcionales en Crear una instancia.
- Versiones anteriores de GKE: si tu clúster de GKE ejecuta una versión anterior a
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:
- Crea un StorageClass.
- Usa un PersistentVolumeClaim para acceder al volumen.
- 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:
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.
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.
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.
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.
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
Aplica el manifiesto al clúster.
kubectl apply -f my-pod.yaml
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.
Elimina el pod y PersistentVolumeClaim.
kubectl delete pod my-pod kubectl delete pvc lustre-pvc
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.