Configura activaciones de volúmenes en memoria para instancias

En esta página, se describe cómo configurar un volumen en memoria dedicado que puedes usar para operaciones de lectura y escritura de archivos mediante activaciones de volúmenes de Cloud Run. Ten en cuenta que esta función difiere del sistema de archivos en memoria integrado que proporciona Cloud Run.

Cuando activas el volumen en memoria en Cloud Run, el volumen en memoria aparece como archivos en el sistema de archivos del contenedor. Después de activar el volumen en memoria, puedes acceder a él como si fuera un directorio en 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 hacer lo siguiente:

  • Limitar el tamaño del volumen en memoria. Cuando limitas el tamaño de un volumen, las operaciones de escritura en un volumen completo fallarán, lo que es preferible a que Cloud Run finalice las instancias debido a que el volumen consume demasiada memoria.

Comportamiento

Cuando se crea un volumen en memoria, recomendamos especificar un límite de tamaño. Si el volumen alcanza su límite de tamaño, las escrituras adicionales fallarán con un error de memoria insuficiente. Tu instancia puede controlar este error y seguir ejecutándose.

Ten en cuenta que el límite de tamaño es solo un límite: no asigna espacio adicional para el volumen en memoria. En cambio, el volumen en memoria consume la memoria que configuraste para los contenedores. Si implementas varios contenedores, la memoria que usa cada operación de escritura en el volumen cuenta como uso de memoria para el contenedor que escribió los datos.

Si no especificas un límite de tamaño, se establece automáticamente como la mitad del tamaño total de todos los contenedores de tu instancia. Por ejemplo, el tamaño de volumen emptyDir = [Memoria (Contenedor A) + Memoria (Contenedor B) + Memoria (Contenedor N)]/2. Este comportamiento predeterminado puede hacer que el límite de tamaño del volumen en memoria sea mayor que la memoria asignada para algunos de tus contenedores. Esto puede provocar fallas inesperadas si un solo contenedor excede su propia memoria asignada mientras intenta escribir más datos en el volumen, incluso si no se alcanzó el límite de tamaño del volumen.

Aunque establecer un límite de tamaño es opcional, te recomendamos configurar uno para proteger a tus contenedores de la memoria insuficiente y fallas.

Rutas no permitidas

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

Roles obligatorios

Para obtener una lista de los roles y los permisos de IAM asociados con Cloud Run, consulta los roles de IAM de Cloud Run y los permisos de IAM de Cloud Run. Si tu instancia de Cloud Run interactúa con Google Cloud las APIs, como las bibliotecas cliente de Cloud, consulta la guía de configuración de identidades del servicio. Para obtener más información sobre cómo otorgar roles, consulta permisos de implementación y administra el acceso.

Configura un volumen en memoria

Después de configurar un volumen en memoria para la instancia de Cloud Run, se crea un volumen vacío para cada instancia de Cloud Run que se inicia, y el volumen existe mientras esa instancia esté en ejecución. Cuando la instancia deja de ejecutarse, los datos del volumen se borran de forma permanente.

Configura una activación de volumen en memoria con Google Cloud CLI o YAML.

gcloud

  • Para activar un volumen, haz lo siguiente:

    gcloud beta run instances update INSTANCE \
      --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT

    Reemplaza lo siguiente:

    • INSTANCE: el nombre de tu instancia
    • MOUNT_PATH: la ruta de acceso relativa en el sistema de archivos del contenedor en el que deseas activar este volumen, por ejemplo, /mnt/my-volume.
    • SIZE_LIMIT: el límite de memoria que deseas asignar al volumen, en MiB o GiB (especificado como Mi o Gi), por ejemplo, 500Mi Este límite debe ser menor que la memoria total especificada para tus contenedores.
  • Si usas varios contenedores, primero especifica los volúmenes y, luego, especifica las activaciones de volúmenes de cada contenedor:

    gcloud beta run instances update INSTANCE \
      --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

  1. Si creas una instancia nueva, omite este paso. Si actualizas una instancia existente, descarga su configuración de YAML:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. En el siguiente ejemplo, se incluye la configuración de YAML:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
        containers:
          - name: CONTAINER_NAME
            image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              medium: Memory
              sizeLimit: SIZE_LIMIT

    Reemplaza lo siguiente:

    • INSTANCE: el nombre de tu instancia de Cloud Run
    • CONTAINER_NAME: el nombre del contenedor
    • IMAGE_URL: una referencia a la imagen del contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
    • VOLUME_NAME: Cualquier nombre que desees para tu volumen. El valor VOLUME_NAME se usa para asignar el volumen a la activación de volúmenes.
    • MOUNT_PATH: La ruta de acceso relativa en la que activarás el volumen, por ejemplo, /mnt/my-volume
    • SIZE_LIMIT: el límite de memoria que deseas asignar al volumen, en MiB o GiB (especificado como Mi o Gi), por ejemplo, 500Mi. Este límite debe ser menor que la memoria total especificada para tus contenedores.
  3. Crea o actualiza la instancia con el siguiente comando:

    gcloud beta run instances replace instance.yaml

Leer y escribir en un volumen

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

Esto es muy útil si usas un contenedor existente que espera que los datos se almacenen en el sistema de archivos local y usa operaciones regulares del sistema de archivos para acceder a él.

En los siguientes fragmentos, se supone una activación de volumen con una mountPath configurada como /mnt/my-volume.

Nodejs

Usa el módulo del sistema de archivos para crear un archivo nuevo o agregarlo a uno existente 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 mantiene 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 mantenido 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");

Borra y quita volúmenes y activaciones de volúmenes

Puedes borrar todos los volúmenes y sus activaciones, o bien quitar volúmenes y activaciones individuales.

Borra todos los volúmenes y sus activaciones

Para borrar todos los volúmenes y sus activaciones de tu instancia de un solo contenedor, ejecuta el siguiente comando:

gcloud beta run instances update INSTANCE \
    --clear-volumes \
    --clear-volume-mounts

Quita volúmenes y activaciones de volúmenes individuales

Para quitar un volumen, también debes quitar todas las activaciones que lo usen.

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

gcloud beta run instances update INSTANCE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH