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.
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. La tua 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 consuma 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 di 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 nell'istanza. Ad esempio, dimensioni del volume emptyDir = [Memoria (Container A) + Memoria (Container B) + Memoria (Container N)]/2.
Questo comportamento predefinito può comportare che il limite di dimensioni del volume in memoria sia superiore alla memoria allocata per alcuni dei 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 dall'out of memory e dall'arresto anomalo.
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 la tua istanza 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
Dopo aver configurato un volume in memoria per l'istanza di 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 Google Cloud CLI o YAML.
gcloud
Per montare un volume:
gcloud beta run instances update INSTANCE \ --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT
Sostituisci quanto segue:
- INSTANCE: il nome dell'istanza.
- 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 specifica i montaggi dei volumi per ogni container:
gcloud beta run instances update INSTANCE \ --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
Se stai creando una nuova istanza, salta questo passaggio. Se stai aggiornando un'istanza esistente, scarica la relativa configurazione YAML:
gcloud beta run instances describe INSTANCE --format export > instance.yaml
L'esempio seguente contiene la configurazione YAML:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA 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:
- INSTANCE: il nome dell'istanza di Cloud Run.
- CONTAINER_NAME: il nome del container.
IMAGE_URL: un riferimento all'immagine container, ad esempious-docker.pkg.dev/cloudrun/container/hello: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.
Crea o aggiorna l'istanza utilizzando il comando seguente:
gcloud beta run instances replace instance.yaml
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 dall'istanza a container singolo, esegui questo comando:
gcloud beta run instances update INSTANCE \ --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 beta run instances update INSTANCE \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH