Configurare i mount dei volumi NFS per i servizi

Questa pagina mostra come montare una condivisione file NFS come volume in Cloud Run. Puoi utilizzare qualsiasi server NFS, incluso il tuo server NFS ospitato on-premise o su una VM di Compute Engine. Se non hai già un server NFS, ti consigliamo Filestore, un'offerta NFS completamente gestita di Cloud de Confiance by S3NS.

Il montaggio della condivisione file NFS come volume in Cloud Run presenta la condivisione file come file nel file system del container. Dopo aver montato la condivisione file come volume, vi accedi come se fosse una directory nel file system locale, utilizzando le operazioni e le librerie del file system del tuo linguaggio di programmazione.

Limitazioni

  • Cloud Run non supporta il blocco NFS. I volumi NFS vengono montati automaticamente in modalità no-lock.
  • Percorsi non consentiti: Cloud Run non consente di montare un volume in /dev, /proc o /sys o nelle relative sottodirectory.

Prima di iniziare

Per montare un server NFS come volume in Cloud Run, assicurati di avere:

  • Una rete VPC in cui è in esecuzione il server NFS o l'istanza Filestore.
  • Un server NFS in esecuzione in una rete VPC, con il servizio Cloud Run connesso a quella rete VPC. Se non hai ancora un server NFS, creane uno creando un'istanza Filestore.
  • Il servizio Cloud Run è collegato alla rete VPC in cui è in esecuzione il server NFS. Per prestazioni ottimali, utilizza il VPC diretto anziché i connettori VPC.
  • Se utilizzi un progetto esistente, assicurati che la configurazione del firewall VPC consenta a Cloud Run di raggiungere il server NFS. (Se inizi da un nuovo progetto, questo è vero per impostazione predefinita). Se utilizzi Filestore come server NFS, segui la documentazione di Filestore per creare una regola firewall in uscita per consentire a Cloud Run di raggiungere Filestore.
  • Imposta le autorizzazioni sulla condivisione file NFS remota per consentire l'accesso all'utente del container. Per impostazione predefinita, Filestore fornisce l'accesso in lettura a tutti gli utenti, ma limita l'accesso in scrittura all'utente root (uid 0). Se il tuo container richiede l'accesso in scrittura e non viene eseguito come utente root, devi utilizzare un client connesso (eseguito come root) per modificare le autorizzazioni di condivisione. Ad esempio, puoi utilizzare il comando chown per cambiare la proprietà dei file o delle directory nell'ID utente specifico con cui viene eseguito il container.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per configurare ed eseguire il deployment dei servizi Cloud Run, chiedi all'amministratore di concederti i seguenti ruoli IAM sul servizio:

  • Cloud Run Developer (roles/run.developer) - il servizio Cloud Run
  • Service Account User (roles/iam.serviceAccountUser) - l'identità di servizio

Se esegui il deployment di un servizio o di una funzione dal codice sorgente, devi anche disporre di ruoli aggiuntivi concessi al tuo progetto e al account di servizio Cloud Build.

Per un elenco di ruoli e autorizzazioni IAM associati a Cloud Run, consulta Ruoli IAM di Cloud Run e Autorizzazioni IAM di Cloud Run. Se il tuo servizio Cloud Run interagisce con le APICloud de Confiance , come le librerie client Cloud, consulta la guida alla configurazione dell'identità del servizio. Per saperne di più sulla concessione dei ruoli, consulta Autorizzazioni di deployment e Gestisci l'accesso.

Monta un volume NFS

Puoi montare più server NFS, istanze Filestore o altri tipi di volumi in percorsi di montaggio diversi.

Se utilizzi più container, specifica prima i volumi, poi i punti di montaggio dei volumi per ogni container.

Console

  1. Nella console Cloud de Confiance by S3NS , vai a Cloud Run:

    Vai a Cloud Run

  2. Seleziona Servizi dal menu di navigazione di Cloud Run e fai clic su Esegui il deployment del container per configurare un nuovo servizio. Se stai configurando un servizio esistente, fai clic sul servizio, quindi sulla scheda Container.

  3. Se stai configurando un nuovo servizio, compila la pagina delle impostazioni iniziali del servizio, poi fai clic su Container, networking, sicurezza per espandere la pagina di configurazione del servizio, quindi fai clic su Volumi.

  4. Fai clic su Monta volume.

  5. Fai clic su NFS come tipo di volume.

  6. Nel campo Percorso di montaggio, inserisci il percorso in cui vuoi montare il volume.

  7. Nel campo Server NFS, inserisci il nome di dominio o la località (nel formato IP_ADDRESS) della condivisione file NFS.

  8. Nel campo Percorso, inserisci il percorso della directory del server NFS da montare.

  9. Fai clic su Salva.

  10. Fai clic su Crea per un nuovo servizio. Fai clic su Visualizza differenze e fai di nuovo il deployment, quindi su Esegui il deployment delle modifiche per un servizio esistente.

gcloud

  • Per aggiungere un montaggio del volume:

    gcloud run services update SERVICE \
      --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY

    Sostituisci quanto segue:

    • SERVICE: il nome del servizio.
    • MOUNT_PATH: il percorso relativo in cui stai montando il volume, ad esempio /mnt/my-volume.
    • IP_ADDRESS: la località della condivisione file NFS.
    • NFS_PATH: il percorso della condivisione file NFS che inizia con una barra, ad esempio /example-directory.
    • READ_ONLY: true per rendere il volume di sola lettura o false per consentire le scritture.
  • Se utilizzi più container, specifica prima i volumi, poi i punti di montaggio dei volumi per ogni container:

    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

  1. Se stai creando un nuovo servizio, salta questo passaggio. Se stai aggiornando un servizio esistente, scarica la relativa configurazione YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Aggiorna MOUNT_PATH, VOLUME_NAME, IP_ADDRESS e NFS_PATH in base alle tue esigenze. Se hai più punti di montaggio del volume, avrai più attributi di questo tipo.

    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

    Sostituisci quanto segue:

    • SERVICE: il nome del tuo servizio Cloud Run
    • MOUNT_PATH: il percorso relativo in cui stai montando il volume, ad esempio /mnt/my-volume.
    • VOLUME_NAME: un nome qualsiasi per il volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al punto di montaggio del volume.
    • IP_ADDRESS: l'indirizzo della condivisione file NFS.
    • NFS_PATH: il percorso della condivisione file NFS che inizia con una barra, ad esempio /example-directory.
    • IS_READ_ONLY: True per rendere il volume di sola lettura o False per consentire le scritture.
  3. Crea o aggiorna il servizio utilizzando il seguente comando:

    gcloud run services replace service.yaml

    Il comando gcloud run services replace utilizza per impostazione predefinita il file service.yaml, se presente.

Terraform

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

Aggiungi quanto segue a una risorsa google_cloud_run_v2_service nella configurazione Terraform:
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"]
  }
}

Sostituisci quanto segue:

  • SERVICE: il nome del servizio Cloud Run.
  • REGION: la regione Cloud de Confiance . Ad esempio europe-west1.
  • MOUNT_PATH: il percorso relativo in cui stai montando il volume, ad esempio /mnt/nfs/filestore.
  • VOLUME_NAME: un nome qualsiasi per il volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al montaggio del volume.
  • NFS_PATH: il percorso della condivisione file NFS che inizia con una barra, ad esempio /share1.
  • IS_READ_ONLY: True per rendere il volume di sola lettura o False per consentire le scritture.

Lettura e scrittura su un volume

Se utilizzi la funzionalità di montaggio del volume di Cloud Run, accedi a un volume montato utilizzando le stesse librerie nel tuo linguaggio di programmazione che utilizzi per leggere e scrivere file nel file system locale.

Questo è particolarmente utile se utilizzi un container esistente che prevede che i dati vengano archiviati nel file system locale e utilizza le normali operazioni del file system per accedervi.

Gli snippet seguenti presuppongono un montaggio del volume con un mountPath impostato su /mnt/my-volume.

Nodejs

Utilizza il modulo File System per creare un nuovo file o aggiungerlo a un file esistente nel volume /mnt/my-volume:

var fs = require('fs');
fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });

Python

Scrivi in un file conservato nel volume, /mnt/my-volume:

f = open("/mnt/my-volume/sample-logfile.txt", "a")

Vai

Utilizza il pacchetto os per creare un nuovo file conservato nel volume /mnt/my-volume:

f, err := os.Create("/mnt/my-volume/sample-logfile.txt")

Java

Utilizza la classe Java.io.File per creare un file di log nel volume /mnt/my-volume:

import java.io.File;
File f = new File("/mnt/my-volume/sample-logfile.txt");

Risolvi i problemi relativi a NFS

Se riscontri problemi, controlla quanto segue:

  • Il servizio Cloud Run è connesso alla rete VPC su cui si trova il server NFS.
  • Non esistono regole firewall che impediscono a Cloud Run di raggiungere il server NFS.
  • Se il container deve scrivere dati, assicurati che le autorizzazioni di condivisione NFS siano configurate per consentire le scritture dall'utente del container.

Tempo di avvio del container e punti di montaggio dei volumi NFS

L'utilizzo dei montaggi dei volumi NFS può aumentare leggermente l'ora di inizio a freddo del container Cloud Run, perché il montaggio del volume viene avviato prima dei container. Il container verrà avviato solo se l'NFS viene montato correttamente.

Tieni presente che NFS monta un volume correttamente solo dopo aver stabilito una connessione al server e aver recuperato un handle di file. Se Cloud Run non riesce a stabilire una connessione al server, il servizio Cloud Run non verrà avviato.

Inoltre, eventuali ritardi di rete possono influire sul tempo di avvio del container, poiché Cloud Run ha un timeout totale di 30 secondi per tutti i montaggi. Se il montaggio di NFS richiede più di 30 secondi, l'avvio del servizio Cloud Run non riuscirà.

Caratteristiche delle prestazioni NFS

Se crei più di un volume NFS, tutti i volumi vengono montati in parallelo.

Poiché NFS è un Network File System, è soggetto a limiti di larghezza di banda e l'accesso al file system può essere influenzato da una larghezza di banda limitata.

Quando scrivi sul volume NFS, la scrittura viene archiviata nella memoria di Cloud Run fino allo svuotamento dei dati. I dati vengono scaricati nelle seguenti circostanze:

  • La tua applicazione svuota i dati dei file in modo esplicito utilizzando sync(2), msync(2) o fsync(3).
  • La tua applicazione chiude un file con close(2).
  • La pressione della memoria forza il recupero delle risorse di memoria di sistema.

Per saperne di più, consulta la documentazione di Linux su NFS.

Cancella e rimuovi volumi e punti di montaggio dei volumi

Puoi cancellare tutti i volumi e i montaggi oppure rimuovere singoli volumi e montaggi di volumi.

Cancella tutti i volumi e i punti di montaggio dei volumi

Per cancellare tutti i volumi e i punti di montaggio dei volumi dal servizio single-container, esegui questo comando:

gcloud run services update SERVICE \
    --clear-volumes \
    --clear-volume-mounts
Se hai più container, segui le convenzioni dell'interfaccia a riga di comando dei sidecar per cancellare volumi e montaggi dei volumi:

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

Rimuovi singoli volumi e punti di montaggio dei volumi

Per rimuovere un volume, devi anche rimuovere tutti i montaggi dei volumi che lo utilizzano.

Per rimuovere singoli volumi o montaggi di volumi, utilizza i flag remove-volume e remove-volume-mount:

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