Configurare i montaggi dei volumi in memoria per i servizi

Questa pagina descrive come configurare un volume in memoria dedicato che puoi utilizzare per le operazioni di lettura e scrittura di file utilizzando i montaggi dei volumi di Cloud Run. Tieni presente che questa funzionalità è diversa dal file system in memoria integrato fornito da Cloud Run.

Quando monti il volume in memoria in Cloud Run, il volume in memoria viene visualizzato come file nel file system del container. Dopo aver montato il volume in memoria, puoi accedervi come se fosse una directory sul file system locale, utilizzando le operazioni e le librerie del file system del tuo linguaggio di programmazione.

Puoi utilizzare i volumi in memoria per:

  • Limita le dimensioni del volume in memoria. Se limiti le dimensioni di un volume, le scritture su un volume pieno non andranno a buon fine, il che è preferibile rispetto all'interruzione delle istanze da parte di Cloud Run perché il volume consuma troppa memoria.
  • Condividere un volume in memoria tra diversi container in un'istanza Cloud Run. Quando Cloud Run esegue lo scale out a più istanze di un servizio, ogni istanza avrà il proprio volume in memoria condiviso da tutti i container dell'istanza. Questo volume è disponibile per tutti i container quando Cloud Run esegue lo scale out per gestire il traffico.

Comportamento

Quando crei un volume in memoria, ti consigliamo di specificare un limite di dimensioni. Se il volume raggiunge il limite di dimensioni, le ulteriori scritture non andranno a buon fine e verrà visualizzato un errore di memoria insufficiente. L'istanza può gestire questo errore e continuare a essere eseguita.

Tieni presente che il limite di dimensioni è solo un limite: non alloca spazio aggiuntivo per il volume in memoria. Il volume in memoria utilizza la memoria che hai configurato per i container. Se esegui il deployment di più container, la memoria utilizzata da ogni scrittura nel volume viene conteggiata come utilizzo della memoria per il container che ha scritto i dati.

Se non specifichi un limite di dimensioni, questo viene impostato automaticamente sulla metà delle dimensioni totali di tutti i container nel job o nel servizio. Ad esempio, emptyDir volume size = [Memory (Container A) + Memory (Container B) + Memory (Container N)]/2. Questo comportamento predefinito può comportare un limite di dimensioni del volume in memoria superiore alla memoria allocata per alcuni dei tuoi container. Ciò può causare arresti anomali imprevisti se un singolo container supera la memoria allocata mentre tenta di scrivere più dati nel volume, anche se il limite di dimensione del volume non è stato raggiunto.

Sebbene l'impostazione di un limite di dimensioni sia facoltativa, ti consigliamo di impostarne uno per proteggere i tuoi container da errori di memoria insufficiente e arresti anomali.

Percorsi non consentiti

Cloud Run non consente di montare un volume in /dev, /proc e /sys o nelle relative sottodirectory.

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:

Per un elenco di ruoli e autorizzazioni IAM associati a Cloud Run, consulta Ruoli IAM Cloud Run e Autorizzazioni IAM Cloud Run. Se il tuo servizio Cloud Run interagisce con le APIGoogle Cloud , come le librerie client Cloud, consulta la guida alla configurazione dell'identità del servizio. Per ulteriori informazioni sulla concessione dei ruoli, consulta Autorizzazioni di deployment e Gestire l'accesso.

Configura un volume in memoria

Qualsiasi modifica alla configurazione comporta la creazione di una nuova revisione. Anche le revisioni successive riceveranno automaticamente questa impostazione di configurazione, a meno che tu non apporti aggiornamenti espliciti per modificarla.

Dopo aver configurato un volume in memoria per il tuo servizio Cloud Run, viene creato un volume vuoto per ogni istanza Cloud Run avviata e il volume esiste finché l'istanza è in esecuzione. Quando l'istanza smette di essere eseguita, i dati nel volume vengono eliminati definitivamente.

Console

  1. Nella console Google Cloud , vai a Cloud Run:

    Vai a Cloud Run

  2. Seleziona Servizi dal menu e fai clic su Esegui il deployment del contenitore per configurare un nuovo servizio. Se stai configurando un servizio esistente, fai clic sul servizio, quindi su Modifica ed esegui il deployment della nuova revisione.

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

  4. Fai clic sulla scheda Volumi.

    immagine

    • Nella sezione Volumi:
      • Fai clic su Aggiungi volume.
      • Nel menu a discesa Tipo di volume, seleziona In-memory come tipo di volume.
      • Nel campo Nome volume, inserisci il nome che vuoi utilizzare per il volume.
      • Fai clic su Fine.
    • Fai clic sulla scheda Contenitore.
    • Fai clic sulla scheda Montaggi volumi.
      • Fai clic su Monta volume.
      • Seleziona il volume in memoria dal menu.
      • Specifica il percorso in cui vuoi montare il volume.
      • Fai clic su Monta volume.
  5. Fai clic su Crea o Esegui il deployment.

gcloud

  • Per aggiungere un volume e montarlo:

    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

    Sostituisci:

    • SERVICE con il nome del tuo servizio.
    • VOLUME_NAME con il nome che preferisci per il volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al punto di montaggio del volume.
    • MOUNT_PATH con il percorso relativo all'interno del file system del container in cui vuoi montare questo volume, ad esempio /mnt/my-volume.
    • SIZE_LIMIT con il limite di memoria che vuoi assegnare al volume, in MiB o GiB (specificati come Mi o Gi), ad esempio 500Mi. Questo limite deve essere inferiore alla memoria totale specificata per i container.
  • Se utilizzi più container, specifica prima i volumi, poi specifica i montaggi dei volumi per ogni container:

    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. 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. Configura gli attributi volumeMounts e volumes come mostrato:

    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

    Sostituisci:

    • IMAGE_URL con un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • VOLUME_NAME con il nome che preferisci per il volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al punto di montaggio del volume.
    • MOUNT_PATH con il percorso relativo all'interno del file system del container in cui vuoi montare questo volume, ad esempio /mnt/my-volume.
    • SIZE_LIMIT con il limite di memoria che vuoi assegnare al volume, in MiB o GiB (specificati come Mi o Gi), ad esempio 500Mi. Questo limite deve essere inferiore alla memoria totale specificata per i container.
  3. Crea o aggiorna il servizio utilizzando il seguente comando:

    gcloud run services replace service.yaml

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

Sostituisci:

  • SERVICE_NAME con il nome del tuo servizio Cloud Run.
  • REGION con la regione Google Cloud . Ad esempio europe-west1.
  • IMAGE_URL con un riferimento all'immagine container.
  • VOLUME_NAME con il nome che preferisci per il volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al punto di montaggio del volume.
  • MOUNT_PATH con il percorso relativo all'interno del file system del container in cui vuoi montare questo volume, ad esempio, /mnt/my-volume.
  • SIZE_LIMIT con il limite di memoria che vuoi assegnare al volume, in MiB o GiB (specificato come Mi o Gi), ad esempio 500Mi. Questo limite deve essere inferiore alla memoria totale specificata per i tuoi container.

Lettura e scrittura in 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.

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

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

Nodejs

Utilizza il modulo File System per creare un nuovo file o aggiungere contenuti 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");

Cancella e rimuovi volumi e montaggi dei volumi

Puoi cancellare tutti i volumi e i relativi punti di montaggio oppure rimuovere singoli volumi e i relativi punti di montaggio.

Cancella tutti i volumi e i relativi punti di montaggio

Per cancellare tutti i volumi e i montaggi dei volumi dal servizio a singolo container, esegui questo comando:

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

Se hai più container, segui le convenzioni della CLI sidecar per cancellare i volumi e i montaggi dei volumi:

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

Rimuovere singoli volumi e montaggi di volumi

Per rimuovere un volume, devi rimuovere anche tutti i relativi montaggi.

Per rimuovere singoli volumi o punti di montaggio dei 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