NFS-Volume-Bereitstellungen für Jobs konfigurieren

Auf dieser Seite wird beschrieben, wie Sie eine NFS-Dateifreigabe als Volume in Cloud Run bereitstellen. Sie können einen beliebigen NFS-Server verwenden, einschließlich Ihres eigenen NFS-Servers, der lokal oder auf einer Compute Engine-VM gehostet wird. Wenn Sie noch keinen NFS-Server haben, empfehlen wir Filestore, ein vollständig verwaltetes NFS-Angebot von Google Cloud.

Durch das Bereitstellen der NFS-Dateifreigabe als Volume in Cloud Run wird die Dateifreigabe als Dateien im Container-Dateisystem dargestellt. Nachdem Sie die Dateifreigabe als 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.

Unzulässige Pfade

Mit Cloud Run können Sie kein Volume unter /dev, /proc oder /sys oder in deren Unterverzeichnissen bereitstellen.

Beschränkungen

  • Cloud Run unterstützt keine NFS-Sperren. NFS-Volumes werden automatisch im Nicht-Sperrmodus bereitgestellt.

Hinweise

Wenn Sie einen NFS-Server als Volume in Cloud Run bereitstellen möchten, benötigen Sie Folgendes:

  • Ein VPC-Netzwerk, in dem Ihr NFS-Server oder Ihre Filestore-Instanz ausgeführt wird.
  • Einen NFS-Server, der in einem VPC-Netzwerk ausgeführt wird, wobei Ihr Cloud Run-Job mit diesem VPC-Netzwerk verbunden ist. Wenn Sie noch keinen NFS-Server haben, erstellen Sie einen, indem Sie eine Filestore-Instanz erstellen.
  • Ihr Cloud Run-Job ist mit dem VPC-Netzwerk verbunden, in dem Ihr NFS-Server ausgeführt wird. Für eine optimale Leistung sollten Sie Direct VPC anstelle von VPC-Connectors verwenden.
  • Achten Sie bei Verwendung eines vorhandenen Projekts darauf, dass Ihre VPC-Firewall-Konfiguration Cloud Run erlaubt, Ihren NFS-Server zu erreichen. (Wenn Sie mit einem neuen Projekt beginnen, gilt dies standardmäßig.) Wenn Sie Filestore als NFS-Server verwenden, folgen Sie der Filestore-Dokumentation, um eine Firewall-Ausgangsregel zu erstellen, damit Cloud Run Filestore erreichen kann.
  • Legen Sie die Berechtigungen für Ihre NFS-Dateifreigabe so fest, dass der Nutzer des Containers darauf zugreifen kann. Standardmäßig bietet Filestore allen Nutzern Lesezugriff, beschränkt den Schreibzugriff jedoch auf den Root-Nutzer (uid 0). Wenn Ihr Container Schreibzugriff erfordert und nicht als Root-Nutzer ausgeführt wird, müssen Sie einen verbundenen Client (der als Root ausgeführt wird) verwenden, um die Freigabeberechtigungen zu ändern. Mit dem Befehl chown können Sie beispielsweise die Eigentümerschaft der Dateien oder Verzeichnisse in die spezifische Nutzer-ID ändern, unter der Ihr Container ausgeführt wird.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für den Job zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Konfigurieren von Cloud Run-Jobs benötigen:

  • Cloud Run-Entwickler (roles/run.developer) - Cloud Run-Job
  • Dienstkontonutzer (roles/iam.serviceAccountUser) - die Dienstidentität

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-Job 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.

NFS-Volume bereitstellen

Sie können mehrere NFS-Server, Filestore-Instanzen oder andere Volumetypen an verschiedenen Bereitstellungspfaden bereitstellen.

Wenn Sie mehrere Container verwenden, geben Sie zuerst die Volumes und dann die Volume-Bereitstellungen pro Container an.

Konsole

  1. Wechseln Sie in der Google Cloud -Console zur Seite „Cloud Run-Jobs“:

    Zu Cloud Run

  2. Wählen Sie im Menü Jobs aus und klicken Sie auf Container bereitstellen, um die Seite mit den anfänglichen Jobeinstellungen auszufüllen. Wenn Sie einen vorhandenen Job konfigurieren, wählen Sie den Job aus und klicken Sie dann auf Jobkonfiguration ansehen und bearbeiten.

  3. Klicken Sie auf Container, Volumes, Verbindungen, Sicherheit, um die Seite mit den Jobattributen 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 NFS als Volume-Typ aus.
      • Geben Sie im Feld Names des Volume den Namen ein, den Sie für das Volume verwenden möchten.
      • Geben Sie im Feld NFS-Server den Domainnamen oder den Speicherort (im Format IP_ADDRESS) der NFS-Dateifreigabe ein.
      • Geben Sie im Feld Pfad den Pfad zum NFS-Serververzeichnis ein, das Sie bereitstellen möchten.
      • Klicken Sie auf Fertig.
    • Klicken Sie auf den Tab „Container“ und maximieren Sie den Container, in dem Sie das Volume bereitstellen möchten, um ihn zu bearbeiten.
    • Klicken Sie auf den Tab Volume-Bereitstellungen.
      • Klicken Sie auf Volume bereitstellen.
      • Wählen Sie das NFS-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 Aktualisieren.

gcloud

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

    gcloud run jobs update JOB \
    --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH

    Ersetzen Sie:

    • JOB durch den Namen des Jobs.
    • VOLUME_NAME durch den Namen, den Sie Ihrem Volume geben möchten.
    • IP_ADDRESS durch den Speicherort der NFS-Dateifreigabe.
    • NFS_PATH durch den Pfad zur NFS-Dateifreigabe.
    • MOUNT_PATH durch den Pfad im Container-Dateisystem, in dem Sie dieses Volume bereitstellen möchten.
  • So stellen Sie Ihr Volume als schreibgeschütztes Volume bereit:

    --add-volume name VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
  • Wenn Sie mehrere Container verwenden, geben Sie zuerst die Volumes und dann die Volume-Bereitstellungen pro Container an.

    gcloud run jobs update JOB \
    --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
    --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 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
  2. Aktualisieren Sie MOUNT_PATH, VOLUME_NAME, IP_ADDRESS und NFS_PATH nach Bedarf. Wenn Sie mehrere Volume-Bereitstellungen haben, sind mehrere dieser Attribute vorhanden.

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      metadata:
      template:
        metadata:
          annotations:
            run.googleapis.com/execution-environment: gen2
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - name: VOLUME_NAME
                  mountPath: MOUNT_PATH
              volumes:
              - name: VOLUME_NAME
                nfs:
                  server: IP_ADDRESS
                  path: NFS_PATH
                  readonly: IS_READ_ONLY

    Ersetzen

    • JOB durch den Namen Ihres Cloud Run-Jobs.
    • MOUNT_PATH durch den relativen Pfad, unter dem Sie das Volume bereitstellen, z. B. /mnt/my-volume.
    • VOLUME_NAME durch einen beliebigen Namen für Ihr Volume. Der Wert VOLUME_NAME wird verwendet, um das Volume der Volume-Bereitstellung zuzuordnen.
    • IP_ADDRESS durch die Adresse der NFS-Dateifreigabe.
    • NFS_PATH durch den Pfad zur NFS-Dateifreigabe.
    • IS_READ_ONLY durch True, um das Volume schreibgeschützt zu machen, oder durch False, um Schreibvorgänge zuzulassen.
  3. Erstellen oder aktualisieren Sie den Dienst mit dem folgenden Befehl:

    gcloud run jobs replace job.yaml

Terraform

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

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

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
        volume_mounts {
          name       = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }
      vpc_access {
        network_interfaces {
          network    = "default"
          subnetwork = "default"
        }
      }
      volumes {
        name = "VOLUME_NAME"
        nfs {
          server    = google_filestore_instance.default.networks[0].ip_addresses[0]
          path      = "NFS_PATH"
          read_only = IS_READ_ONLY
        }
      }
    }
  }
}

resource "google_filestore_instance" "default" {
  name     = "cloudrun-job"
  location = "REGION"
  tier     = "BASIC_HDD"

  file_shares {
    capacity_gb = 1024
    name        = "share1"
  }

  networks {
    network = "default"
    modes   = ["MODE_IPV4"]
  }
}

Ersetzen Sie:

  • JOB_NAME durch den Namen Ihres Cloud Run-Jobs.
  • REGION durch die Google Cloud Region. Beispiel: europe-west1.
  • MOUNT_PATH durch den relativen Pfad, unter dem Sie das Volume bereitstellen, z. B. /mnt/nfs/filestore.
  • VOLUME_NAME durch einen beliebigen Namen für Ihr Volume. Der Wert VOLUME_NAME wird verwendet, um das Volume der Volume-Bereitstellung zuzuordnen.
  • NFS_PATH durch den Pfad zur NFS-Dateifreigabe, beginnend mit einem Schrägstrich, z. B. /share1.
  • IS_READ_ONLY durch True, um das Volume schreibgeschützt zu machen, oder durch False, um Schreibvorgänge zuzulassen.

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

Fehlerbehebung bei NFS

Wenn Probleme auftreten, prüfen Sie Folgendes:

  • Ihr Cloud Run-Dienst ist mit dem VPC-Netzwerk verbunden, in dem sich der NFS-Server befindet.
  • Es gibt keine Firewallregeln, die verhindern, dass Cloud Run den NFS-Server erreicht.
  • Wenn Ihr Container Daten schreiben muss, müssen die Berechtigungen für die NFS-Freigabe so konfiguriert sein, dass Schreibvorgänge durch den Nutzer des Containers zugelassen werden.

Containerstartzeit und NFS-Volume-Bereitstellungen

Wenn Sie NFS-Volume-Bereitstellungen verwenden, kann sich der Startzeitpunkt Ihres Cloud Run-Containers leicht verlängern, da die Volume-Bereitstellung vor dem Start der Container gestartet wird. Der Container wird nur gestartet, wenn NFS erfolgreich bereitgestellt wurde.

NFS stellt ein Volume erst dann bereit, wenn eine Verbindung zum Server hergestellt und ein Dateihandle abgerufen wurde. Wenn Cloud Run keine Verbindung zum Server herstellen kann, kann der Cloud Run-Job nicht gestartet werden.

Netzwerkverzögerungen können sich auf die Containerstartzeit auswirken, da für Cloud Run insgesamt 30 Sekunden Zeit für die Durchführung aller Bereitstellungen zur Verfügung stehen. Wenn die Bereitstellung über NFS länger als 30 Sekunden dauert, wird der Cloud Run-Job nicht gestartet.

NFS-Leistungsmerkmale

Wenn Sie mehrere NFS-Volumes erstellen, werden alle Volumes parallel gemountet.

Da NFS ein Netzwerkdateisystem ist, unterliegt es Bandbreitenbeschränkungen. Der Zugriff auf das Dateisystem kann durch eine begrenzte Bandbreite beeinträchtigt werden.

Wenn Sie auf Ihr NFS-Volume schreiben, wird der Schreibvorgang im Cloud Run-Speicher gespeichert, bis die Daten gelöscht werden. Daten werden unter den folgenden Umständen geleert:

  • Ihre Anwendung leert Dateidaten explizit mit sync(2), msync(2) oder fsync(3).
  • Ihre Anwendung schließt eine Datei mit close(2).
  • Arbeitsspeicherdruck führt zur Rückgewinnung von Systemspeicherressourcen.

Weitere Informationen finden Sie in der Linux-Dokumentation zu NFS.

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 Job mit einem einzelnen Container zu entfernen:

gcloud run jobs update JOB \
    --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 jobs update JOB \
    --clear-volumes \
    --clear-volume-mounts \
    --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 Einbindungspunkte für dieses Volume entfernen.

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

gcloud run jobs update JOB \
    --remove-volume VOLUME_NAME
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH