Auf dieser Seite wird beschrieben, wie Sie ein dediziertes In-Memory-Volume konfigurieren, das Sie mit Cloud Run-Volume-Bereitstellungen für Dateilese- und -Schreibvorgänge verwenden können. Beachten Sie, dass sich dieses Feature vom integrierten In-Memory-Dateisystem von Cloud Run unterscheidet.
Wenn Sie das In-Memory-Volume in Cloud Run bereitstellen, wird das In-Memory-Volume als Dateien im Container-Dateisystem angezeigt. Nachdem Sie das In-Memory-Volume bereitgestellt haben, können Sie mithilfe der Dateisystemvorgänge und Bibliotheken Ihrer Programmiersprache auf diese zugreifen, als wäre es ein Verzeichnis in Ihrem lokalen Dateisystem.
Sie können In-Memory-Volumes für Folgendes verwenden:
- Die Größe des In-Memory-Volume begrenzen. Wenn Sie die Größe eines Volumes begrenzen, schlagen Schreibvorgänge auf einem vollen Volume fehl. Das ist besser, als dass Cloud Run Instanzen beendet, weil ein Volumen zu viel Arbeitsspeicher verbraucht.
- Ein In-Memory-Volume zwischen verschiedenen Containern in einer Cloud Run-Instanz teilen. Wenn Cloud Run auf mehrere Instanzen eines Dienstes skaliert wird, hat jede Instanz ein eigenes In-Memory-Volume, das von allen Containern auf dieser Instanz gemeinsam genutzt wird. Dieses Volumen ist für alle Container verfügbar, wenn Cloud Run für die Verarbeitung des Traffics horizontal skaliert wird.
Verhalten
Beim Erstellen eines In-Memory-Volumes empfehlen wir, ein Größenlimit anzugeben. Wenn das Volume die Größenbeschränkung erreicht, schlagen weitere Schreibvorgänge mit einem Fehler aufgrund unzureichenden Speichers fehl. Ihre Instanz kann diesen Fehler beheben und weiter ausgeführt werden.
Beachten Sie, dass die Größenbeschränkung nur ein Limit ist: Sie weist Ihrem In-Memory-Volume keinen zusätzlichen Speicherplatz zu. Stattdessen verbraucht Ihr In-Memory-Volume den Arbeitsspeicher, den Sie für Ihre Container konfiguriert haben. Wenn Sie mehrere Container bereitstellen, zählt der von jedem Schreibvorgang in das Volume verwendete Speicher als Arbeitsspeichernutzung für den Container, der die Daten geschrieben hat.
Wenn Sie keine Größenbeschränkung angeben, wird diese automatisch auf die Hälfte der Gesamtgröße aller Container in Ihrem Job oder Service festgelegt. Beispiel: emptyDir
-Volume-Größe = [Speicher (Container A) + Speicher (Container B) + Speicher (Container N)]/2.
Dieses Standardverhalten kann dazu führen, dass das Größenlimit des In-Memory-Volumes höher ist als der einigen Ihrer Container zugewiesene Arbeitsspeicher. In diesem Fall überschreitet der Container, wenn er weiterhin Speicher in das Volume schreibt, die zugewiesene Speichergröße und stürzt ab, bevor das Größenlimit des Volumes erreicht wird.
Das Festlegen einer Größenbeschränkung ist optional. Wir empfehlen es dennoch, um zu verhindern, dass den Container zu wenig Arbeitsspeicher zur Verfügung steht und es zu einem Absturz kommt.
Unzulässige Pfade
Mit Cloud Run können Sie kein Volume unter /dev
, /proc
und /sys
oder in deren Unterverzeichnissen bereitstellen.
In-Memory-Volume konfigurieren
Jede Konfigurationsänderung führt zur Erstellung einer neuen Überarbeitung. Für nachfolgende Überarbeitungen gilt automatisch dieselbe Konfigurationseinstellung, sofern Sie sie nicht explizit aktualisieren.
Nachdem Sie ein In-Memory-Volume für Ihren Cloud Run-Dienst konfiguriert haben, wird für jede gestartete Cloud Run-Instanz ein leeres Volume erstellt. Dieses Volume besteht, solange diese Instanz ausgeführt wird. Wenn die Instanz nicht mehr ausgeführt wird, werden die Daten im Volume dauerhaft gelöscht.
Console
Wechseln Sie in der Google Cloud Console zur Seite "Cloud Run-Jobs":
Klicken Sie auf Container bereitstellen und wählen Sie Job aus, um die Seite mit den anfänglichen Jobeinstellungen auszufüllen. Wählen Sie den Job aus und klicken Sie dann auf Bearbeiten, wenn Sie einen vorhandenen Job konfigurieren.
Klicken Sie auf Container, Variablen und Secrets, Verbindungen, Sicherheit, um die Seite mit den Jobattributen zu maximieren.
Klicken Sie auf den Tab Volumes.
- Unter Volumes:
- Klicken Sie auf Volume hinzufügen.
- Wählen Sie im Drop-down-Menü Volume-Typ die Option In-Memory als Volume-Typ.
- Geben Sie im Feld Names des Volume den Namen ein, den Sie für das Volume verwenden möchten.
- Geben Sie im Feld Größenbeschränkung das Speicherlimit an, das Sie dem Volume zuweisen möchten. Diese Begrenzung muss kleiner als der für Ihre Container angegebene Gesamtspeicher sein. Auf diesem Volume gespeicherte Daten belegen Arbeitsspeicher, der von dem Container reserviert wurde, der die Daten geschrieben hat.
- Klicken Sie auf Fertig.
- Klicken Sie auf den Container-Tab und maximieren Sie den Container, in dem Sie das Volume bereitstellen, um den Container zu bearbeiten.
- Klicken Sie auf den Tab Volume-Bereitstellungen.
- Klicken Sie auf Volume bereitstellen.
- Wählen Sie das In-Memory-Volume aus dem Menü aus.
- Geben Sie den Pfad an, unter dem Sie das Volume bereitstellen möchten.
- Klicken Sie auf Volume bereitstellen.
- Unter Volumes:
Klicken Sie auf Erstellen oder Aktualisieren.
gcloud
So fügen Sie ein Volume hinzu und stellen es bereit:
gcloud beta run jobs update JOB \ --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
Ersetzen Sie:
JOB
durch den Namen des Jobs.- VOLUME_NAME durch einen beliebigen Namen für Ihr Volume. Der Wert VOLUME_NAME wird verwendet, um das Volume der Volume-Bereitstellung zuzuordnen.
MOUNT_PATH
durch den relativen Pfad im Container-Dateisystem, in dem Sie dieses Volume bereitstellen möchten, z. B./mnt/my-volume
.- SIZE_LIMIT durch die Speicherbegrenzung, die Sie dem Volume zuweisen möchten, in MiB oder GiB (angegeben als Mi oder Gi), z. B.
500Mi
. Diese Begrenzung muss kleiner als der für Ihre Container angegebene Gesamtspeicher sein.
Wenn Sie mehrere Container verwenden, geben Sie zuerst die Volumes und dann die Volume-Bereitstellungen pro Container an.
gcloud beta run jobs update JOB \ --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
Wenn Sie einen neuen Job erstellen, überspringen Sie diesen Schritt. Wenn Sie einen vorhandenen Job aktualisieren, laden Sie die zugehörige YAML-Konfiguration herunter:
gcloud run jobs describe JOB_NAME --format export > job.yaml
Konfigurieren Sie die Attribute
volumeMounts
undvolumes
so:apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME 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
Ersetzen Sie:
- IMAGE_URL durch einen Verweis auf das Container-Image, z. B.
us-docker.pkg.dev/cloudrun/container/hello:latest
. Wenn Sie Artifact Registry verwenden, muss das Repository REPO_NAME bereits erstellt sein. Die URL hat die FormLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. - VOLUME_NAME durch einen beliebigen Namen für Ihr Volume. Der Wert VOLUME_NAME wird verwendet, um das Volume der Volume-Bereitstellung zuzuordnen.
MOUNT_PATH
durch den relativen Pfad im Container-Dateisystem, in dem Sie dieses Volume bereitstellen möchten, z. B./mnt/my-volume
.- SIZE_LIMIT durch die Speicherbegrenzung, die Sie dem Volume zuweisen möchten, in MiB oder GiB (angegeben als Mi oder Gi), z. B.
500Mi
. Diese Begrenzung muss kleiner als der für Ihre Container angegebene Gesamtspeicher sein.
- IMAGE_URL durch einen Verweis auf das Container-Image, z. B.
Erstellen oder aktualisieren Sie den Dienst mit dem folgenden Befehl:
gcloud run jobs replace job.yaml
Lesen und Schreiben auf ein Volume
Wenn Sie das Cloud Run-Feature zur Volume-Bereitstellung verwenden, greifen Sie mit denselben Bibliotheken in Ihrer Programmiersprache auf ein bereitgestelltes Volume zu, mit denen Sie Dateien auf Ihrem lokalen Dateisystem lesen und schreiben.
Dies ist besonders nützlich, wenn Sie einen vorhandenen Container verwenden, der erwartet, dass Daten im lokalen Dateisystem gespeichert werden und ein reguläres Dateisystem für den Zugriff darauf verwendet.
Bei den folgenden Snippets wird von einer Volume-Bereitstellung ausgegangen, bei der mountPath
auf /mnt/my-volume
gesetzt ist.
Nodejs
Verwenden Sie das Dateisystemmodul, um eine neue Datei zu erstellen oder Anhänge einer vorhandenen Datei im Volume /mnt/my-volume
hinzuzufügen:
var fs = require('fs'); fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });
Python
So schreiben Sie in eine Datei, die im Volume /mnt/my-volume
gespeichert ist:
f = open("/mnt/my-volume/sample-logfile.txt", "a")
Go
Verwenden Sie das Paket os
, um eine neue Datei im Volume /mnt/my-volume
zu erstellen
f, err := os.Create("/mnt/my-volume/sample-logfile.txt")
Java
Verwenden Sie die Klasse Java.io.File
, um eine Logdatei im Volume /mnt/my-volume
zu erstellen:
import java.io.File; File f = new File("/mnt/my-volume/sample-logfile.txt");