In-Memory-Volume-Bereitstellungen für Dienste konfigurieren

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 es 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 in dieser Instanz gemeinsam genutzt wird. Dieses Volume ist für alle Container verfügbar, wenn Cloud Run skaliert wird, um den Traffic zu verarbeiten.

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 Dienst 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. Dies kann zu unerwarteten Abstürzen führen, wenn ein einzelner Container den ihm zugewiesenen Arbeitsspeicher überschreitet, während er versucht, weitere Daten in das Volume zu schreiben, obwohl das Größenlimit des Volumes noch nicht erreicht ist.

Das Festlegen einer Größenbeschränkung ist optional. Wir empfehlen es dennoch, um zu verhindern, dass den Containern 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.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Konfigurieren und Bereitstellen von Cloud Run-Diensten benötigen:

Eine Liste der IAM-Rollen und -Berechtigungen im Zusammenhang mit Cloud Run finden Sie unter IAM-Rollen für Cloud Run und IAM-Berechtigungen für Cloud Run. Wenn Ihr Cloud Run-Dienst mitGoogle Cloud APIs wie Cloud-Clientbibliotheken verknüpft ist, lesen Sie die Konfigurationsanleitung für Dienstidentitäten. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Bereitstellungsberechtigungen und Zugriff verwalten.

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

  1. Rufen Sie in der Google Cloud Console Cloud Run auf:

    Zu Cloud Run

  2. Wählen Sie im Menü Dienste aus und klicken Sie auf Container bereitstellen, um einen neuen Dienst zu konfigurieren. Wenn Sie einen vorhandenen Dienst konfigurieren möchten, klicken Sie auf den Dienst und dann auf Neue Überarbeitung bearbeiten und bereitstellen.

  3. Wenn Sie einen neuen Dienst konfigurieren, füllen Sie die Seite mit den anfänglichen Diensteinstellungen aus und klicken Sie dann auf Container, Volumes, Netzwerk, Sicherheit, um die Seite zur Dienstkonfiguration zu maximieren.

  4. Klicken Sie auf den Tab Volumes.

    Bild

    • 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.
      • Klicken Sie auf Fertig.
    • Klicken Sie auf den Container-Tab.
    • 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.
  5. Klicken Sie auf Erstellen oder Bereitstellen.

gcloud

  • So fügen Sie ein Volume hinzu und stellen es bereit:

    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

    Ersetzen Sie:

    • SERVICE durch den Namen des Dienstes.
    • 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 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. Wenn Sie einen neuen Dienst erstellen, überspringen Sie diesen Schritt. Wenn Sie einen vorhandenen Dienst aktualisieren, laden Sie die zugehörige YAML-Konfiguration herunter:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Konfigurieren Sie die Attribute volumeMounts und volumes so:

    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

    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 Form LOCATION-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.
  3. Erstellen oder aktualisieren Sie den Dienst mit dem folgenden Befehl:

    gcloud run services replace service.yaml

Terraform

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

Fügen Sie einer google_cloud_run_v2_service-Ressource in Ihrer Terraform-Konfiguration Folgendes hinzu:

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"
      }
    }
  }
}

Ersetzen Sie:

  • SERVICE_NAME durch den Namen Ihres Cloud Run-Dienstes.
  • REGION durch die Google Cloud Region. Beispiel: europe-west1.
  • IMAGE_URL durch einen Verweis auf das Container-Image.
  • 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.

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.

In den folgenden Snippets wird davon ausgegangen, dass ein Volume bereitgestellt wird, bei dem mountPath auf /mnt/my-volume festgelegt ist.

Node.js

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");

Laufwerke und Bereitstellungspunkte löschen und entfernen

Sie können alle Volumes und Bereitstellungen löschen oder einzelne Volumes und Volume-Bereitstellungen entfernen.

Alle Volumes und Volume-Bereitstellungen löschen

Führen Sie den folgenden Befehl aus, um alle Volumes und Volume-Bereitstellungen aus Ihrem Dienst mit einem einzelnen Container zu entfernen:

gcloud run services update SERVICE \
    --clear-volumes
    --clear-volume-mounts

Wenn Sie mehrere Container haben, folgen Sie den Sidecars-CLI-Konventionen, um Volumes und Volume-Bereitstellungen zu löschen:

gcloud run services update SERVICE \
    --container=container1 \
    --clear-volumes
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

Einzelne Volumes und Volume-Bereitstellungen entfernen

Wenn Sie ein Volume entfernen möchten, müssen Sie auch alle Volume-Mounts entfernen, die dieses Volume verwenden.

Verwenden Sie die Flags remove-volume und remove-volume-mount, um einzelne Volumes oder Volume-Bereitstellungen zu entfernen:

gcloud run services update SERVICE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH