En esta página se describe cómo configurar un volumen dedicado en memoria que puedes usar para leer y escribir archivos mediante los montajes de volúmenes de Cloud Run. Ten en cuenta que esta función es diferente del sistema de archivos en memoria integrado que proporciona Cloud Run.
Cuando montas el volumen en memoria en Cloud Run, el volumen en memoria se muestra como archivos en el sistema de archivos del contenedor. Una vez que hayas montado el volumen en memoria, 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.
Puedes usar volúmenes en memoria para lo siguiente:
- Limita el tamaño del volumen en memoria. Si limitas el tamaño de un volumen, las escrituras en un volumen completo fallarán, lo que es preferible a que Cloud Run termine las instancias porque el volumen consuma demasiada memoria.
- Compartir un volumen en memoria entre diferentes contenedores de una instancia de Cloud Run. Cuando Cloud Run se amplía a varias instancias de un servicio, cada instancia tendrá su propio volumen en memoria compartido por todos los contenedores de esa instancia. Este volumen está disponible para todos los contenedores cuando Cloud Run se amplía para gestionar el tráfico.
Comportamiento
Cuando crees un volumen en memoria, te recomendamos que especifiques un límite de tamaño. Si el volumen alcanza su límite de tamaño, las escrituras posteriores fallarán con un error de falta de memoria. Tu instancia puede gestionar este error y seguir ejecutándose.
Ten en cuenta que el límite de tamaño es solo eso: no asigna espacio adicional a tu volumen en memoria. En su lugar, el volumen en memoria consume la memoria que hayas configurado para tus contenedores. Si implementas varios contenedores, la memoria usada por cada escritura en el volumen se contabiliza como uso de memoria del contenedor que escribió los datos.
Si no especificas un límite de tamaño, se asignará automáticamente la mitad del tamaño total de todos los contenedores de tu trabajo o servicio. Por ejemplo, el tamaño del volumen emptyDir
= [Memoria (Contenedor A) + Memoria (Contenedor B) + Memoria (Contenedor N)]/2.
Este comportamiento predeterminado puede provocar que el límite de tamaño del volumen en memoria sea superior a la memoria asignada a algunos de tus contenedores. Esto puede provocar fallos inesperados si un contenedor supera su propia memoria asignada al intentar escribir más datos en el volumen, aunque no se haya alcanzado el límite de tamaño del volumen.
Aunque no es obligatorio definir un límite de tamaño, te recomendamos que lo hagas para proteger tus contenedores de que se queden sin memoria y fallen.
Rutas no permitidas
Cloud Run no te permite montar un volumen en /dev
,
/proc
y /sys
, ni en sus subdirectorios.
Roles obligatorios
Para obtener los permisos que necesitas para configurar e implementar servicios de Cloud Run, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:
-
Desarrollador de Cloud Run (
roles/run.developer
) en el servicio Cloud Run -
Usuario de cuenta de servicio (
roles/iam.serviceAccountUser
) en la identidad de 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.
Configurar un volumen en memoria
Cualquier cambio en la configuración conlleva la creación de una nueva revisión. Las revisiones posteriores también recibirán automáticamente este ajuste de configuración, a menos que hagas cambios explícitos para modificarlo.
Después de configurar un volumen en memoria para tu servicio de Cloud Run, se crea un volumen vacío para cada instancia de Cloud Run que se inicia, y el volumen existe mientras se ejecuta esa instancia. Cuando la instancia deja de ejecutarse, los datos del volumen se eliminan de forma permanente.
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 En memoria como tipo de volumen.
- En el campo Nombre del volumen, introduce el nombre que quieras usar para el volumen.
- Haz clic en Listo.
- Haz clic en la pestaña Contenedor.
- Haz clic en la pestaña Montajes de volúmenes.
- Haz clic en Montar volumen.
- Selecciona el volumen en memoria del 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=in-memory,size-limit=SIZE_LIMIT \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
Haz los cambios siguientes:
SERVICE
: el nombre de tu servicio.- VOLUME_NAME: el nombre que quieras darle al volumen. El valor VOLUME_NAME se usa para asignar el volumen al montaje del volumen.
MOUNT_PATH
: la ruta relativa dentro del sistema de archivos del contenedor en el que quieras montar este volumen. Por ejemplo,/mnt/my-volume
.- SIZE_LIMIT: el límite de memoria que quieres asignar al volumen, en MiB o GiB (especificado como Mi o Gi), por ejemplo,
500Mi
. Este límite debe ser inferior a la memoria total especificada para tus contenedores.
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=in-memory,size-limit=SIZE_LIMIT \ --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
Configura los atributos
volumeMounts
yvolumes
como se muestra a continuación:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE_NAME spec: template: spec: containers: - image: IMAGE_URL volumeMounts: - mountPath: MOUNT_PATH name: VOLUME_NAME volumes: - name: VOLUME_NAME emptyDir: sizeLimit: SIZE_LIMIT medium: Memory
Haz los cambios siguientes:
- IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo,
us-docker.pkg.dev/cloudrun/container/hello:latest
. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. - VOLUME_NAME: el nombre que quieras darle al volumen. El valor VOLUME_NAME se usa para asignar el volumen al punto de montaje del volumen.
MOUNT_PATH
: la ruta relativa del sistema de archivos del contenedor en la que quieres montar este volumen. Por ejemplo,/mnt/my-volume
.- SIZE_LIMIT: el límite de memoria que quieres asignar al volumen, en MiB o GiB (especificado como Mi o Gi), por ejemplo,
500Mi
. Este límite debe ser inferior a la memoria total especificada para tus contenedores.
- IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo,
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_NAME"
location = "REGION"
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
volumes {
name = "VOLUME_NAME"
empty_dir {
medium = "MEMORY"
size_limit = "SIZE_LIMIT"
}
}
}
}
Haz los cambios siguientes:
- SERVICE_NAME: el nombre de tu servicio de Cloud Run.
- REGION: la Google Cloud región. Por ejemplo,
europe-west1
. - IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo,
us-docker.pkg.dev/cloudrun/container/hello:latest
. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. - VOLUME_NAME: el nombre que quieras darle al volumen. El valor VOLUME_NAME se usa para asignar el volumen al montaje del volumen.
- MOUNT_PATH: la ruta relativa dentro del sistema de archivos del contenedor en el que quieras montar este volumen. Por ejemplo,
/mnt/my-volume
. - SIZE_LIMIT: el límite de memoria que quieres asignar al volumen, en MiB o GiB (especificado como Mi o Gi). Por ejemplo,
500Mi
. Este límite debe ser inferior a la memoria total especificada para tus contenedores.
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");
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