Configurar montajes de volúmenes NFS para tareas

En esta página se muestra cómo montar un recurso compartido de archivos NFS como un volumen en Cloud Run. Puedes usar cualquier servidor NFS, incluido tu propio servidor NFS alojado on-premise o en una VM de Compute Engine. Si aún no tienes un servidor NFS, te recomendamos Filestore, que es una oferta de NFS totalmente gestionada de Google Cloud.

Al montar el recurso compartido de archivos NFS como un volumen en Cloud Run, el recurso compartido de archivos se presenta como archivos en el sistema de archivos del contenedor. Una vez que hayas montado el recurso compartido de archivos como un volumen, podrás acceder a él como si fuera un directorio de tu sistema de archivos local, mediante las operaciones y bibliotecas del sistema de archivos de tu lenguaje de programación.

Rutas no permitidas

Cloud Run no te permite montar un volumen en /dev, /proc o /sys, ni en sus subdirectorios.

Limitaciones

  • Cloud Run no admite el bloqueo de NFS. Los volúmenes NFS se montan automáticamente en modo sin bloqueo.

Antes de empezar

Para montar un servidor NFS como volumen en Cloud Run, asegúrate de que tienes lo siguiente:

  • Una red de VPC en la que se ejecute tu servidor NFS o tu instancia de Filestore.
  • Un servidor NFS que se ejecuta en una red de VPC, con tu trabajo de Cloud Run conectado a esa red de VPC. Si aún no tienes un servidor NFS, crea uno creando una instancia de Filestore.
  • Tu trabajo de Cloud Run está asociado a la red de VPC en la que se ejecuta tu servidor NFS. Para obtener el mejor rendimiento, usa VPC directa en lugar de conectores de VPC.
  • Si usas un proyecto que ya tengas, asegúrate de que la configuración del cortafuegos de tu VPC permita que Cloud Run acceda a tu servidor NFS. Si empiezas con un proyecto nuevo, esta opción está activada de forma predeterminada. Si usas Filestore como servidor NFS, sigue la documentación de Filestore para crear una regla de salida de firewall que permita a Cloud Run acceder a Filestore.
  • Define los permisos en tu sistema de archivos compartido NFS remoto para permitir el acceso al usuario del contenedor. De forma predeterminada, Filestore proporciona acceso de lectura a todos los usuarios, pero restringe el acceso de escritura al usuario raíz (uid 0). Si tu contenedor requiere acceso de escritura y no se ejecuta como usuario raíz, debes usar un cliente conectado (que se ejecute como raíz) para modificar los permisos de la unidad compartida. Por ejemplo, puedes usar el comando chown para cambiar la propiedad de los archivos o directorios al ID de usuario específico con el que se ejecuta tu contenedor.

Roles obligatorios

Para obtener los permisos que necesitas para configurar tareas de Cloud Run, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en la tarea:

  • Desarrollador de Cloud Run (roles/run.developer): la tarea de Cloud Run
  • Usuario de cuenta de servicio (roles/iam.serviceAccountUser): la identidad del servicio

Para ver una lista de los roles y permisos de gestión de identidades y accesos asociados a Cloud Run, consulta los artículos sobre roles de gestión de identidades y accesos de Cloud Run y permisos de gestión de identidades y accesos de Cloud Run. Si tu trabajo de Cloud Run interactúa con APIs deGoogle Cloud , como las bibliotecas de cliente de Cloud, consulta la guía de configuración de la identidad de servicio. Para obtener más información sobre cómo conceder roles, consulta los artículos sobre permisos de implementación y gestión del acceso.

Montar un volumen NFS

Puedes montar varios servidores NFS, instancias de Filestore u otros tipos de volúmenes en diferentes rutas de montaje.

Si usas varios contenedores, primero especifica los volúmenes y, a continuación, los puntos de montaje de volumen de cada contenedor.

Consola

  1. En la Google Cloud consola, ve a la página de trabajos de Cloud Run:

    Ir a Cloud Run

  2. Seleccione Trabajos en el menú y haga clic en Implementar contenedor para rellenar la página de configuración inicial del trabajo. Si vas a configurar un trabajo que ya existe, selecciona el trabajo y haz clic en Editar.

  3. Haz clic en Contenedores, volúmenes, conexiones y seguridad para desplegar la página de propiedades del trabajo.

  4. Haz clic en la pestaña Volúmenes.

    imagen

    • En Volúmenes:
      • Haz clic en Añadir volumen.
      • En el desplegable Tipo de volumen, selecciona NFS como tipo de volumen.
      • En el campo Nombre del volumen, introduce el nombre que quieras usar para el volumen.
      • En el campo Servidor NFS, introduce el nombre de dominio o la ubicación (en el formato IP_ADDRESS) del recurso compartido de archivos NFS.
      • En el campo Ruta, introduce la ruta al directorio del servidor NFS que quieras montar.
      • Haz clic en Listo.
    • Haz clic en la pestaña Contenedor y, a continuación, despliega el contenedor en el que vas a montar el volumen para editarlo.
    • Haz clic en la pestaña Montajes de volúmenes.
      • Haz clic en Montar volumen.
      • Selecciona el volumen NFS en el menú.
      • Especifica la ruta en la que quieres montar el volumen.
      • Haz clic en Montar volumen.
  5. Haz clic en Crear o en Actualizar.

gcloud

  • Para añadir un volumen y montarlo, sigue estos pasos:

    gcloud run jobs update JOB \
    --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH

    Sustituye:

    • JOB con el nombre del trabajo.
    • VOLUME_NAME con el nombre que quieras darle al volumen.
    • IP_ADDRESS con la ubicación del recurso compartido de archivos NFS.
    • NFS_PATH con la ruta al sistema de archivos compartido NFS.
    • MOUNT_PATH con la ruta del sistema de archivos del contenedor en la que quieras montar este volumen.
  • Para montar tu volumen como volumen de solo lectura, haz lo siguiente:

    --add-volume name VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
  • Si usas varios contenedores, primero especifica los volúmenes y, a continuación, especifica los montajes de volumen de cada contenedor:

    gcloud run jobs update JOB \
    --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
    --container CONTAINER_1 \
    --add-volume-mount volume= VOLUME_NAME,mount-path=MOUNT_PATH \
    --container CONTAINER_2 \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH2

YAML

  1. Si vas a crear un trabajo, sáltate este paso. Si vas a actualizar una tarea, descarga su configuración YAML:

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. Actualiza MOUNT_PATH, VOLUME_NAME, IP_ADDRESS y NFS_PATH según sea necesario. Si tienes varios montajes de volúmenes, tendrás varios de estos atributos.

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      metadata:
      template:
        metadata:
          annotations:
            run.googleapis.com/execution-environment: gen2
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - name: VOLUME_NAME
                  mountPath: MOUNT_PATH
              volumes:
              - name: VOLUME_NAME
                nfs:
                  server: IP_ADDRESS
                  path: NFS_PATH
                  readonly: IS_READ_ONLY

    Sustituir

    • JOB con el nombre de tu tarea de Cloud Run
    • MOUNT_PATH con la ruta relativa en la que vas a montar el volumen. Por ejemplo, /mnt/my-volume.
    • VOLUME_NAME con el nombre que quieras para el volumen. El valor VOLUME_NAME se usa para asignar el volumen al montaje del volumen.
    • IP_ADDRESS con la dirección del recurso compartido de archivos NFS.
    • NFS_PATH con la ruta al sistema de archivos compartido NFS.
    • IS_READ_ONLY con True para que el volumen sea de solo lectura o False para permitir escrituras.
  3. Crea o actualiza el trabajo con el siguiente comando:

    gcloud run jobs replace job.yaml

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Añade lo siguiente a un recurso google_cloud_run_v2_job en tu configuración de Terraform:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
        volume_mounts {
          name       = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }
      vpc_access {
        network_interfaces {
          network    = "default"
          subnetwork = "default"
        }
      }
      volumes {
        name = "VOLUME_NAME"
        nfs {
          server    = google_filestore_instance.default.networks[0].ip_addresses[0]
          path      = "NFS_PATH"
          read_only = IS_READ_ONLY
        }
      }
    }
  }
}

resource "google_filestore_instance" "default" {
  name     = "cloudrun-job"
  location = "REGION"
  tier     = "BASIC_HDD"

  file_shares {
    capacity_gb = 1024
    name        = "share1"
  }

  networks {
    network = "default"
    modes   = ["MODE_IPV4"]
  }
}

Sustituye:

  • JOB_NAME con el nombre de tu tarea de Cloud Run.
  • REGION con la región Google Cloud . Por ejemplo, europe-west1.
  • MOUNT_PATH con la ruta relativa en la que vas a montar el volumen. Por ejemplo, /mnt/nfs/filestore.
  • VOLUME_NAME con el nombre que quieras para el volumen. El valor VOLUME_NAME se usa para asignar el volumen al montaje del volumen.
  • NFS_PATH con la ruta al sistema de archivos compartidos NFS que empieza por una barra diagonal. Por ejemplo, /share1.
  • IS_READ_ONLY con True para que el volumen sea de solo lectura, o False para permitir escrituras.

Leer y escribir en un volumen

Si usas la función de montaje de volúmenes de Cloud Run, puedes acceder a un volumen montado con las mismas bibliotecas de tu lenguaje de programación que usas para leer y escribir archivos en tu sistema de archivos local.

Esto es especialmente útil si usas un contenedor que espera que los datos se almacenen en el sistema de archivos local y que utiliza operaciones normales del sistema de archivos para acceder a ellos.

En los siguientes fragmentos se presupone que se ha montado un volumen con mountPath definido como /mnt/my-volume.

Nodejs

Usa el módulo File System para crear un archivo o añadir contenido a un archivo ya creado en el volumen, /mnt/my-volume:

var fs = require('fs');
fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });

Python

Escribe en un archivo conservado en el volumen, /mnt/my-volume:

f = open("/mnt/my-volume/sample-logfile.txt", "a")

Go

Usa el paquete os para crear un archivo nuevo que se guarde en el volumen /mnt/my-volume:

f, err := os.Create("/mnt/my-volume/sample-logfile.txt")

Java

Usa la clase Java.io.File para crear un archivo de registro en el volumen /mnt/my-volume:

import java.io.File;
File f = new File("/mnt/my-volume/sample-logfile.txt");

Solucionar problemas de NFS

Si tienes algún problema, comprueba lo siguiente:

  • Tu servicio de Cloud Run está conectado a la red de VPC en la que se encuentra el servidor NFS.
  • No hay reglas de cortafuegos que impidan que Cloud Run acceda al servidor NFS.
  • Si tu contenedor necesita escribir datos, asegúrate de que los permisos de la carpeta compartida NFS estén configurados para permitir que el usuario de tu contenedor escriba datos.

Tiempo de inicio del contenedor y montajes de volúmenes NFS

Si usas montajes de volúmenes NFS, el tiempo de arranque en frío de tu contenedor de Cloud Run puede aumentar ligeramente, ya que el montaje del volumen se inicia antes de que se inicien los contenedores. El contenedor solo se iniciará si NFS se monta correctamente.

Ten en cuenta que NFS solo monta un volumen correctamente después de establecer una conexión con el servidor y obtener un identificador de archivo. Si Cloud Run no puede establecer una conexión con el servidor, el trabajo de Cloud Run no se iniciará.

Además, cualquier retraso en la red puede afectar al tiempo de inicio del contenedor, ya que Cloud Run tiene un tiempo de espera total de 30 segundos para todos los montajes. Si el montaje de NFS tarda más de 30 segundos, el trabajo de Cloud Run no se iniciará.

Características de rendimiento de NFS

Si crea más de un volumen NFS, todos los volúmenes se montarán en paralelo.

Como NFS es un sistema de archivos de red, está sujeto a límites de ancho de banda y el acceso al sistema de archivos puede verse afectado por un ancho de banda limitado.

Cuando escribes en tu volumen NFS, la escritura se almacena en la memoria de Cloud Run hasta que se vacían los datos. Los datos se vacían en las siguientes circunstancias:

  • Tu aplicación vacía los datos de los archivos de forma explícita mediante sync(2), msync(2) o fsync(3).
  • Tu aplicación cierra un archivo con close(2).
  • La presión de memoria obliga a reclamar recursos de memoria del sistema.

Para obtener más información, consulta la documentación de Linux sobre NFS.

Borrar y quitar volúmenes y montajes de volúmenes

Puedes borrar todos los volúmenes y los puntos de montaje, o bien quitar volúmenes y puntos de montaje concretos.

Borrar todos los volúmenes y los puntos de montaje de volúmenes

Para borrar todos los volúmenes y los montajes de volúmenes de tu trabajo de un solo contenedor, ejecuta el siguiente comando:

gcloud run jobs update JOB \
    --clear-volumes
    --clear-volume-mounts

Si tienes varios contenedores, sigue las convenciones de la CLI de sidecars para borrar volúmenes y montajes de volúmenes:

gcloud run jobs update JOB \
    --clear-volumes \
    --clear-volume-mounts \
    --container=container1 \
    --clear-volumes \
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

Eliminar volúmenes y montajes de volúmenes concretos

Para quitar un volumen, también debes quitar todos los montajes de volumen que lo usen.

Para quitar volúmenes o montajes de volúmenes concretos, usa las marcas remove-volume y remove-volume-mount:

gcloud run jobs update JOB \
    --remove-volume VOLUME_NAME
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH