Configurar montajes de volúmenes NFS para servicios

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

  • Para escribir en un volumen NFS, el contenedor debe ejecutarse como root. Si tu contenedor solo lee del sistema de archivos, puede ejecutarse como cualquier usuario.

  • 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 servicio 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 servicio de Cloud Run está asociado a la red 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.

Roles obligatorios

Para obtener los permisos que necesitas para configurar e implementar servicios de Cloud Run, pide a tu administrador que te asigne los siguientes roles de gestión de identidades y accesos en el servicio:

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

Si vas a desplegar un servicio o una función a partir de código fuente, también debes tener otros roles concedidos en tu proyecto y en la cuenta de servicio de Cloud Build.

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 servicio de Cloud Run interactúa con APIs, como las bibliotecas de cliente de Cloud, consulta la guía de configuración de la identidad del servicio.Google Cloud 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, después, los puntos de montaje de volumen de cada contenedor.

Consola

  1. En la Google Cloud consola, ve a Cloud Run:

    Ir a Cloud Run

  2. Seleccione Servicios en el menú y haga clic en Implementar contenedor para configurar un nuevo servicio. Si vas a configurar un servicio que ya tienes, haz clic en él y, a continuación, en Editar y desplegar nueva revisión.

  3. Si vas a configurar un servicio nuevo, rellena la página de configuración inicial del servicio y, a continuación, haz clic en Contenedores, volúmenes, redes y seguridad para desplegar la página de configuración del servicio.

  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 Implementar.

gcloud

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

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

    Sustituye:

    • SERVICE con el nombre de tu servicio.
    • 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 compartidos NFS que empieza por una barra diagonal. Por ejemplo, /example-directory.
    • 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 tu volumen. El valor VOLUME_NAME se usa para asignar el volumen al montaje del 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, los montajes de volumen de cada contenedor:

    gcloud run services update SERVICE \
    --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 va a crear un servicio, puede saltarse este paso. Si va a actualizar un servicio, descargue su configuración YAML:

    gcloud run services describe SERVICE --format export > service.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: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/execution-environment: gen2
        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

    • SERVICE con el nombre de tu servicio 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 tu 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 compartidos NFS que empieza por una barra inclinada, por ejemplo, /example-directory.
    • IS_READ_ONLY con True para que el volumen sea de solo lectura o False para permitir escrituras.
  3. Crea o actualiza el servicio con el siguiente comando:

    gcloud run services replace service.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_service en tu configuración de Terraform:

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE"
  location = "REGION"

  template {
    execution_environment = "EXECUTION_ENVIRONMENT_GEN2"
    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-service-ro"
  location = "REGION"
  tier     = "BASIC_HDD"

  file_shares {
    capacity_gb = 1024
    name        = "share1"
  }

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

Sustituye:

  • SERVICE con el nombre de tu servicio 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 tu 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 que se encuentra 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 escribe en tu servidor NFS, asegúrate de que se ejecute como root.

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 correctamente un volumen 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 servicio 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 servicio 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 servicio de un solo contenedor, ejecuta el siguiente comando:

gcloud run services update SERVICE \
    --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 services update SERVICE \
    --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 services update SERVICE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH