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
En la Google Cloud consola, ve a Cloud Run:
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.
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.
Haz clic en la pestaña Volúmenes.
- 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.
- En Volúmenes:
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
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
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 oFalse
para permitir escrituras.
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 recursogoogle_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, oFalse
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