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
Dans la console Google Cloud, accédez à Cloud Run :
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.
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.
Cliquez sur l'onglet Volumes.
- 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.
- Sous Volumes :
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
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
Configurez les attributs
volumeMounts
etvolumes
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.
- IMAGE_URL par une référence à l'image de conteneur, par exemple
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");