Auf dieser Seite wird gezeigt, 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-Dienst mit diesem VPC-Netzwerk verbunden ist. Wenn Sie noch keinen NFS-Server haben, erstellen Sie eine Filestore-Instanz, indem Sie eine Filestore-Instanz erstellen.
- Ihr Cloud Run-Dienst ist mit dem VPC-Netzwerk verbunden, in dem Ihr NFS-Server ausgeführt wird. Verwenden Sie für eine optimale Leistung Direct VPC anstelle von VPC-Connectors.
- 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 Firewallregel für ausgehenden Traffic zu erstellen, damit Cloud Run Filestore erreichen kann.
- Legen Sie die Berechtigungen für Ihre Remote-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 benötigt 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. Sie können beispielsweise den Befehlchownverwenden, um den Eigentümer der Dateien oder Verzeichnisse in die spezifische Nutzer-ID zu ändern, unter der Ihr Container ausgeführt wird.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für den Dienst zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Konfigurieren und Bereitstellen von Cloud Run-Diensten benötigen:
-
Cloud Run-Entwickler (
roles/run.developer) – der Cloud Run-Dienst -
Dienstkontonutzer (
roles/iam.serviceAccountUser) – die Dienstidentität
Wenn Sie einen Dienst oder eine Funktion aus Quellcode bereitstellen, müssen Ihnen außerdem zusätzliche Rollen für Ihr Projekt und Ihr Cloud Build-Dienstkonto zugewiesen werden.
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 mit Google 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 Volume-Typen unter verschiedenen Bereitstellungspfaden bereitstellen.
Wenn Sie mehrere Container verwenden, geben Sie zuerst die Volumes und dann die Volume-Bereitstellungen pro Container an.
Console
Rufen Sie in der Google Cloud Console Cloud Run auf:
Wählen Sie im Cloud Run-Navigationsmenü 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.
Wenn Sie einen neuen Dienst konfigurieren, füllen Sie die Seite mit den anfänglichen Diensteinstellungen aus und klicken Sie dann auf Container, Netzwerk, Sicherheit, um die Seite zur Dienstkonfiguration zu maximieren.
Klicken Sie auf den Tab Volumes.
- Klicken Sie auf Volume bereitstellen.
- Klicken Sie als Volume-Typ auf NFS.
- Geben Sie im Feld Bereitstellungspfad den Pfad ein, unter dem Sie das Volume bereitstellen 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 Speichern.
Klicken Sie auf Erstellen oder Bereitstellen.
gcloud
gcloud run services update
So fügen Sie eine Volume-Bereitstellung hinzu:
gcloud beta run services update SERVICE \ --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY
Ersetzen Sie Folgendes:
- SERVICE: der Name Ihres Dienstes.
- MOUNT_PATH: der relative Pfad, unter dem Sie das Volume bereitstellen, z. B.
/mnt/my-volume. - IP_ADDRESS: der Speicherort der NFS-Dateifreigabe.
- NFS_PATH: der Pfad zur NFS-Dateifreigabe, beginnend mit einem
Schrägstrich, z. B.
/example-directory. - READ_ONLY:
true, um das Volume schreibgeschützt zu machen, oderfalse, um Schreibvorgänge zuzulassen.
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=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
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
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: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/execution-environment: gen2 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 Sie Folgendes:
- SERVICE: der Name Ihres Cloud Run-Dienstes
- MOUNT_PATH: der relative Pfad, unter dem Sie das Volume bereitstellen, z. B.
/mnt/my-volume. - VOLUME_NAME: ein beliebiger Name für Ihr Volume. Der Wert VOLUME_NAME wird verwendet, um das Volume der Volume-Bereitstellung zuzuordnen.
- IP_ADDRESS: die Adresse der NFS-Dateifreigabe.
- NFS_PATH: der Pfad zur NFS-Dateifreigabe, beginnend mit einem Schrägstrich, z. B.
/example-directory. - IS_READ_ONLY:
True, um das Volume schreibgeschützt zu machen, oderFalse, um Schreibvorgänge zuzulassen.
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 einergoogle_cloud_run_v2_service
Ressource in Ihrer Terraform-Konfiguration Folgendes hinzu:resource "google_cloud_run_v2_service" "default" {
name = "SERVICE"
location = "REGION"
template {
execution_environment = "EXECUTION_ENVIRONMENT_GEN2"
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-service-ro"
location = "REGION"
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "share1"
}
networks {
network = "default"
modes = ["MODE_IPV4"]
}
}
Ersetzen Sie Folgendes:
- SERVICE: der Name Ihres Cloud Run-Dienstes.
- REGION: die Google Cloud Region. Beispiel:
europe-west1. - MOUNT_PATH: der relative Pfad, unter dem Sie das
Volume bereitstellen, z. B.
/mnt/nfs/filestore. - VOLUME_NAME: ein beliebiger Name für Ihr Volume. Der Wert VOLUME_NAME wird verwendet, um das Volume der Volume-Bereitstellung zuzuordnen.
- NFS_PATH: der Pfad zur NFS-Dateifreigabe, beginnend mit einem
Schrägstrich, z. B.
/share1. - IS_READ_ONLY:
True, um das Volume schreibgeschützt zu machen, oderFalse, 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.
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");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, prüfen Sie, ob die Berechtigungen für die NFS-Freigabe so konfiguriert sind, dass Schreibvorgänge vom Nutzer Ihres 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-Dienst nicht gestartet werden.
Außerdem können sich Netzwerkverzögerungen auf die Containerstartzeit auswirken, da Cloud Run ein Zeitlimit von insgesamt 30 Sekunden für alle Bereitstellungen hat. Wenn die Bereitstellung über NFS länger als 30 Sekunden dauert, kann der Cloud Run-Dienst nicht gestartet werden.
NFS-Leistungsmerkmale
Wenn Sie mehrere NFS-Volumes erstellen, werden alle Volumes parallel bereitgestellt.
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 folgenden Umständen gelöscht:
- Ihre Anwendung löscht Dateidaten explizit mit sync(2), msync(2) oder fsync(3).
- Ihre Anwendung schließt eine Datei mit close(2).
- Speicherlast erzwingt die Rückforderung von Systemspeicherressourcen.
Weitere Informationen finden Sie in der Linux-Dokumentation zu NFS.
Volumes und Volume-Bereitstellungen 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 löschen:
gcloud run services update SERVICE \ --clear-volumes --clear-volume-mounts
Wenn Sie mehrere Container haben, folgen Sie den CLI-Konventionen für Sidecars, 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-Bereitstellungen 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