Configurer les installations de volume en mémoire pour les services

Cette page explique comment configurer un volume en mémoire dédié à la lecture et à l'écriture de fichiers à l'aide d'installations de volume Cloud Run. Notez que cette fonctionnalité diffère du système de fichiers en mémoire intégré fourni par Cloud Run.

Lorsque vous installez le volume en mémoire dans Cloud Run, il s'affiche sous forme de fichiers dans le système de fichiers du conteneur. Une fois que vous avez installé le volume en mémoire, vous y accédez comme s'il s'agissait d'un répertoire de votre système de fichiers local, à l'aide des opérations et des bibliothèques de système de fichiers de votre langage de programmation.

Vous pouvez utiliser des volumes en mémoire pour effectuer les opérations suivantes :

  • Limiter la taille du volume en mémoire. Lorsque vous limitez la taille d'un volume, les écritures sur un volume complet échouent, ce qui est préférable à ce que Cloud Run arrête des instances en raison d'un volume de mémoire trop important.
  • Partager un volume en mémoire entre différents conteneurs dans une même instance Cloud Run. Lorsque Cloud Run effectue un scaling horizontal sur plusieurs instances d'un service, chaque instance dispose de son propre volume en mémoire partagé par tous les conteneurs de cette instance. Ce volume est disponible pour tous les conteneurs lorsque Cloud Run effectue un scaling horizontal pour gérer le trafic.

Comportement

Lors de la création d'un volume en mémoire, nous vous recommandons de spécifier une limite de taille. Si le volume atteint sa limite de taille, les écritures suivantes échouent avec une erreur de mémoire insuffisante. Votre instance peut gérer cette erreur et continuer de s'exécuter.

Notez que la limite de taille n'est qu'une limite : elle n'alloue pas d'espace supplémentaire pour votre volume en mémoire. En effet, votre volume en mémoire consomme la mémoire que vous avez configurée pour vos conteneurs. Si vous déployez plusieurs conteneurs, la mémoire utilisée par chaque écriture sur le volume compte comme l'utilisation de la mémoire pour le conteneur qui a écrit les données.

Si vous ne spécifiez pas de limite de taille, elle est automatiquement définie sur la moitié de la taille totale de tous les conteneurs de votre job ou service. Par exemple, la taille du volume emptyDir = [mémoire (conteneur A) + mémoire (conteneur B) + mémoire (conteneur N)]/2. Ce comportement par défaut peut entraîner une limite de taille de la quantité de volume en mémoire supérieure à la mémoire allouée à certains de vos conteneurs. Dans ce cas, si votre conteneur continue d'écrire de la mémoire sur le volume, il dépassera sa mémoire allouée et plantera avant d'atteindre la limite de taille du volume.

Bien que la définition d'une limite de taille soit facultative, nous vous recommandons d'en définir une pour éviter que vos conteneurs ne manquent de mémoire et qu'ils plantent.

Chemins d'accès non autorisés

Cloud Run ne vous permet pas d'installer un volume sur /dev, /proc et /sys, ou dans leurs sous-répertoires.

Configurer un volume en mémoire

Tout changement de configuration entraîne la création d'une révision. Les révisions ultérieures obtiennent aussi automatiquement le même paramètre de configuration, à moins que vous ne le mettiez explicitement à jour.

Une fois que vous avez configuré un volume en mémoire pour votre service Cloud Run, un volume vide est créé pour chaque instance Cloud Run qui est démarrée. Ce volume existe tant que cette instance est en cours d'exécution. Lorsque l'instance cesse de s'exécuter, les données du volume sont définitivement supprimées.

Console

  1. Dans la console Google Cloud, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Cliquez sur Déployer un conteneur et sélectionnez Service pour configurer un nouveau service. Si vous configurez un service existant, cliquez sur celui-ci puis sur Modifier et déployer la nouvelle révision.

  3. Si vous configurez un nouveau service, remplissez la page initiale des paramètres du service, puis cliquez sur Conteneur(s), volumes, mise en réseau et sécurité pour développer la page de configuration du service.

  4. Cliquez sur l'onglet Volumes.

    image

    • Sous Volumes :
      • Cliquez sur Ajouter un volume.
      • Dans la liste déroulante Type de volume, sélectionnez En mémoire comme type de volume.
      • Dans le champ Nom du volume, saisissez le nom du volume que vous souhaitez utiliser.
      • Cliquez sur OK.
    • Cliquez sur l'onglet Conteneur.
    • Cliquez sur l'onglet Montages de volume.
      • Cliquez sur Monter le volume.
      • Sélectionnez le volume en mémoire dans le menu.
      • Spécifiez le chemin d'accès où vous souhaitez installer le volume.
      • Cliquez sur Monter le volume.
  5. Cliquez sur Créer ou Déployer.

gcloud

  • Pour ajouter un volume et l'installer, procédez comme suit :

    gcloud beta 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

    Remplacez :

    • SERVICE par le nom de votre service.
    • VOLUME_NAME par le nom que vous souhaitez pour votre volume. La valeur VOLUME_NAME permet de mapper le volume à l'installation du volume.
    • MOUNT_PATH par le chemin relatif du système de fichiers du conteneur sur lequel vous souhaitez installer ce volume, par exemple, /mnt/my-volume.
    • SIZE_LIMIT par la limite de mémoire que vous souhaitez attribuer au volume, en Mio ou Gio (spécifié en Mi ou Gi), par exemple 500Mi. Cette limite doit être inférieure à la mémoire totale spécifiée pour vos conteneurs.
  • Si vous utilisez plusieurs conteneurs, spécifiez les volumes, puis spécifiez les installations de volume pour chaque conteneur :

    gcloud beta 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

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml
  2. Configurez les attributs volumeMounts et volumes comme indiqué :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              sizeLimit: SIZE_LIMIT
              medium: Memory

    Remplacez :

    • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • VOLUME_NAME par le nom que vous souhaitez pour votre volume. La valeur VOLUME_NAME permet de mapper le volume à l'installation du volume.
    • MOUNT_PATH par le chemin relatif du système de fichiers du conteneur sur lequel vous souhaitez installer ce volume, par exemple, /mnt/my-volume.
    • SIZE_LIMIT par la limite de mémoire que vous souhaitez attribuer au volume, en Mio ou Gio (spécifié en Mi ou Gi), par exemple 500Mi. Cette limite doit être inférieure à la mémoire totale spécifiée pour vos conteneurs.
  3. Créez ou mettez à jour le service à l'aide de la commande suivante :

    gcloud run services replace service.yaml

Lire et écrire dans un volume

Si vous utilisez la fonctionnalité d'installation de volume Cloud Run, vous accédez à un volume installé à l'aide des mêmes bibliothèques dans votre langage de programmation que celles que vous utilisez pour lire et écrire des fichiers sur votre système de fichiers local.

Ceci est particulièrement utile si vous utilisez un conteneur existant qui attend que des données soient stockées sur le système de fichiers local et utilise des opérations standards du système de fichiers pour y accéder.

Les extraits suivants supposent une installation de volume avec un mountPath défini sur /mnt/my-volume.

Nodejs

Utilisez le module File System pour créer un fichier ou ajouter des données à un fichier existant dans le volume /mnt/my-volume :

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

Python

Écrivez les données dans un fichier conservé dans le volume /mnt/my-volume :

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

Go

Utilisez le package os pour créer un fichier conservé dans le volume /mnt/my-volume.

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

Java

Utilisez la classe Java.io.File pour créer un fichier journal dans le volume /mnt/my-volume :

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