Configura i montaggi dei volumi in memoria per i pool di worker

Questa pagina descrive come configurare un volume in memoria dedicato che puoi utilizzare per le operazioni di lettura e scrittura dei 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, questo viene visualizzato come file nel file system del container. Dopo aver montato il volume in memoria, puoi accedervi come se fosse una directory nel file system locale, utilizzando le operazioni e le librerie del file system del linguaggio di programmazione.

Puoi utilizzare i volumi in memoria per:

  • Limitare le dimensioni del volume in memoria. Quando limiti le dimensioni di un volume, le scritture su un volume completo non andranno a buon fine, il che è preferibile rispetto alla terminazione delle istanze da parte di Cloud Run perché il volume consuma troppa memoria.
  • Condividere un volume in memoria tra diversi container in una singola istanza di Cloud Run. Quando Cloud Run esegue lo scale out a più istanze di un pool di worker, ogni pool di worker avrà il proprio volume in memoria condiviso da tutti i container del pool di worker. 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 scritture successive 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 invece la memoria configurata per i container. Se esegui il deployment di più container, la memoria utilizzata da ogni scrittura sul 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, dimensioni del volume emptyDir = [Memoria (Container A) + Memoria (Container B) + Memoria (Container N)]/2. Questo comportamento predefinito può comportare un limite di dimensioni del volume in memoria superiore alla memoria allocata per alcuni container. Ciò può causare arresti anomali imprevisti se un singolo container supera la memoria allocata mentre tenta di scrivere più dati sul volume, anche se il limite di dimensioni del volume non è stato raggiunto.

Anche se l'impostazione di un limite di dimensioni è facoltativa, ti consigliamo di impostarne uno per proteggere i 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 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 pool di worker di Cloud Run interagisce con Google Cloud API, 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.

Configurare 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 servizio Cloud Run, viene creato un volume vuoto per ogni istanza di 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.

Configura un montaggio del volume in memoria utilizzando la Google Cloud console, la Google Cloud CLI, YAML o Terraform.

Console

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

    Vai a Cloud Run

  2. Seleziona Pool di worker dal menu e fai clic su Esegui il deployment del container per configurare un nuovo pool di worker. Se stai configurando un pool di worker esistente, fai clic sul pool di worker, quindi su Modifica ed esegui il deployment di una nuova revisione.

  3. Se stai configurando un nuovo pool di worker, compila la pagina iniziale del pool di worker, quindi fai clic su Container, networking, sicurezza per espandere la pagina di configurazione dei pool di worker.

  4. Fai clic sulla scheda Volumi.

    immagine

    • Fai clic su Monta volume.
    • Fai clic su In memoria come tipo di volume.
    • Nel campo Percorso di montaggio, inserisci il percorso in cui vuoi montare il volume.
    • Nel campo Nome volume, inserisci il nome del volume.
    • (Facoltativo) Inserisci il Limite di dimensioni e l'Unità di memoria per specificare il limite di memoria che vuoi assegnare al volume. Questo limite deve essere inferiore alla memoria totale specificata per i container. I dati archiviati in questo volume utilizzano memoria riservata dal container che ha scritto i dati.
    • Fai clic su Salva.
  5. Fai clic su Crea o Esegui il deployment.

gcloud

  • Per montare un volume:

    gcloud run worker-pools update WORKER_POOL \
      --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT

    Sostituisci quanto segue:

    • WORKER_POOL: il nome del pool di worker.
    • MOUNT_PATH: il percorso relativo all'interno del file system del container in cui vuoi montare questo volume, ad esempio /mnt/my-volume.
    • SIZE_LIMIT: 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 container.
  • Se utilizzi più container, specifica prima i volumi, poi i montaggi dei volumi per ogni container:

    gcloud run worker-pools update WORKER_POOL \
      --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 pool di worker, salta questo passaggio. Se stai aggiornando un pool di worker esistente, scarica la relativa configurazione YAML:

    gcloud run worker-pools describe WORKER_POOL --format export > workerpool.yaml
  2. L'esempio seguente contiene la configurazione YAML:

    apiVersion: run.googleapis.com/v1
    kind: WorkerPool
    metadata:
      name: WORKER_POOL
    spec:
      template:
        spec:
          containers:
          - name: CONTAINER_NAME
            image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              medium: Memory
              sizeLimit: SIZE_LIMIT

    Sostituisci quanto segue:

    • WORKER_POOL: il nome del pool di worker di Cloud Run.
    • CONTAINER_NAME: il nome del container.
    • IMAGE_URL: un riferimento all'immagine container che contiene il pool di worker, ad esempio us-docker.pkg.dev/cloudrun/container/worker-pool:latest
    • VOLUME_NAME: qualsiasi nome che vuoi assegnare al volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al montaggio del volume.
    • MOUNT_PATH: il percorso relativo in cui stai montando il volume, ad esempio /mnt/my-volume.
    • SIZE_LIMIT: 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 container.
  3. Crea o aggiorna il pool di worker utilizzando il seguente comando:

    gcloud run worker-pools replace workerpool.yaml

Terraform

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

Per specificare un singolo container, volume e montaggio del volume:

resource "google_cloud_run_v2_worker_pool" "default" {
  name     = "WORKER_POOL"
  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 quanto segue:

  • WORKER_POOL: il nome del pool di worker di Cloud Run.
  • REGION: la Google Cloud regione, ad esempio, europe-west1.
  • IMAGE_URL: un riferimento all'immagine container che contiene il pool di worker, ad esempio us-docker.pkg.dev/cloudrun/container/worker-pool:latest.
  • VOLUME_NAME: qualsiasi nome che vuoi assegnare al volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al montaggio del volume.
  • MOUNT_PATH: il percorso relativo all'interno del file system del container in cui vuoi montare questo volume, ad esempio /mnt/my-volume.
  • SIZE_LIMIT: 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 container.

Per specificare più container, volumi e montaggi dei volumi:

resource "google_cloud_run_v2_worker_pool" "default" {
  name     = "WORKER_POOL"
  location = "REGION"

  template {
    containers {
      image = "IMAGE_URL"
      volume_mounts {
        name = "VOLUME_NAME"
        mount_path = "MOUNT_PATH"
      }
    }
    containers {
      image = "IMAGE_URL_2"
      volume_mounts {
        name = "VOLUME_NAME_2"
        mount_path = "MOUNT_PATH_2"
      }
    }
    volumes {
      name = "VOLUME_NAME"
      empty_dir {
        medium = "MEMORY"
        size_limit = "SIZE_LIMIT"
      }
    }
    volumes {
      name = "VOLUME_NAME_2"
      empty_dir {
        medium = "MEMORY"
        size_limit = "SIZE_LIMIT_2"
      }
    }
  }
}

Sostituisci quanto segue:

  • WORKER_POOL: il nome del pool di worker di Cloud Run.
  • REGION: la Google Cloud regione, ad esempio, europe-west1.
  • IMAGE_URL, IMAGE_URL_2: un riferimento all'immagine container che contiene il pool di worker, ad esempio us-docker.pkg.dev/cloudrun/container/worker-pool:latest.
  • VOLUME_NAME, VOLUME_NAME_2: qualsiasi nome che vuoi assegnare al tuo volume. Questo valore viene utilizzato per mappare il volume al montaggio del volume.
  • MOUNT_PATH, MOUNT_PATH_2: il percorso relativo all'interno del file system del container in cui vuoi montare questo volume, ad esempio /mnt/my-volume.
  • SIZE_LIMIT, SIZE_LIMIT_2: 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 container.

Visualizzare la configurazione variabile di ambiente per il pool di worker

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

    Vai a Cloud Run

  2. Fai clic su Pool di worker per visualizzare l'elenco dei pool di worker di cui è stato eseguito il deployment.

  3. Fai clic sul pool di worker che vuoi esaminare per visualizzare il riquadro dei dettagli.

  4. Fai clic sulla scheda Container per visualizzare la configurazione dei container del pool di worker.

Leggere e scrivere su un volume

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

Questa funzionalità è 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.

I seguenti snippet 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 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");

Cancellare e rimuovere volumi e montaggi dei volumi

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

Cancellare tutti i volumi e i montaggi dei volumi

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

gcloud run worker-pools update WORKER_POOL \
    --clear-volumes
    --clear-volume-mounts

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

gcloud run worker-pools update WORKER_POOL \
    --container=container1 \
    --clear-volumes
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

Rimuovere singoli volumi e montaggi dei volumi

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

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

gcloud run worker-pools update WORKER_POOL \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH