Questa pagina descrive come configurare un volume in-memory dedicato che puoi utilizzare per le letture e le scritture dei file utilizzando i mount dei volumi Cloud Run. Tieni presente che è diversa dalle funzionalità integrate file system in memoria fornito da in Cloud Run.
Quando lomonti in Cloud Run, il volume in memoria viene visualizzato come file nel file system del container. Dopo aver montato lo strumento volume, si accede a quest'ultimo come se fosse una directory sul file 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. Quando limiti le dimensioni di un volume, scritture a tutto volume non riusciranno, il che è preferibile avere Termina le istanze Cloud Run a causa del volume consumano troppa memoria.
- Condividere un volume in memoria tra container diversi in un unico Cloud Run in esecuzione in un'istanza Compute Engine. Quando Cloud Run esegue la scalabilità orizzontale a più istanze di un servizio, ogni istanza avrà il proprio volume in memoria condiviso da tutti i container su quell'istanza. Questo volume è disponibile per tutti i container quando Cloud Run fa lo scale out per gestire il traffico.
Comportamento
Quando crei un volume in memoria, ti consigliamo di specificare un limite di dimensioni. Se raggiunge il limite di dimensioni, ulteriori scritture non riusciranno se la memoria è esaurita . L'istanza può gestire questo errore e continuare a funzionare.
Tieni presente che il limite di dimensioni è solo un limite: non alloca spazio aggiuntivo per il volume in memoria. Piuttosto, il volume in memoria consuma la memoria che configurate 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 dimensione, questo viene automaticamente impostato sulla metà del
dimensione totale di tutti i container nel tuo job o servizio. Ad esempio:
Dimensione 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 contenitori. In questa situazione,
se il container continua a scrivere memoria nel volume, supererà la sua
memoria allocata e si arresta in modo anomalo prima del raggiungimento del limite di dimensioni del volume.
Anche se l'impostazione di un limite di dimensione è facoltativa, ti consigliamo di impostarne uno per proteggere dei container dall'esaurimento della memoria e dagli arresti anomali.
Percorsi non consentiti
Cloud Run non consente di montare un volume su /dev
,
/proc
e /sys
o nelle relative sottodirectory.
Configurare un volume in memoria
Qualsiasi modifica alla configurazione comporta la creazione di una nuova revisione. Anche le revisioni successive ricevono automaticamente di questa configurazione, a meno che 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 Cloud Run avviata il volume esiste finché l'istanza è in esecuzione. Quando l'istanza termina l'esecuzione, dati nel volume vengono eliminati definitivamente.
Console
Nella console Google Cloud, vai alla pagina dei job Cloud Run:
Fai clic su Esegui il deployment del container e seleziona Job per compilare il job iniziale. nella pagina delle impostazioni. Se stai configurando un job esistente, selezionalo e fai clic su Modifica.
Fai clic su Contenitore, variabili e secret, connessioni, sicurezza per espandere la pagina delle proprietà del job.
Fai clic sulla scheda Volumi.
- In Volumi:
- Fai clic su Aggiungi volume.
- Nel menu a discesa Tipo di volume, seleziona In memoria come tipo di volume.
- Nel campo Nome volume, inserisci il nome che vuoi utilizzare per il volume.
- Nel campo Limite di dimensioni, specifica il limite di memoria da assegnare al volume. Questo limite deve essere inferiore alla memoria totale specificata per i container. I dati archiviati in questo volume consumano memoria riservata dal container che ha scritto i dati.
- Fai clic su Fine.
- Fai clic sulla scheda Contenitore, quindi espandi il contenitore che stai montando il volume per modificare il container.
- Fai clic sulla scheda Montaggi volume.
- Fai clic su Installa volume.
- Seleziona il volume in memoria dal menu.
- Specifica il percorso in cui vuoi montare il volume.
- Fai clic su Monta volume.
- In Volumi:
Fai clic su Crea o Aggiorna.
gcloud
Per aggiungere un volume e montarlo:
gcloud beta run jobs update JOB \ --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
Sostituisci:
JOB
con il nome del job.- VOLUME_NAME con il nome che preferisci per il volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al relativo montaggio.
MOUNT_PATH
con il percorso relativo all'interno del container file system in cui vuoi montare questo volume, ad esempio/mnt/my-volume
.- SIZE_LIMIT con il limite di memoria che vuoi assegnare al volume, tra
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, quindi specifica i montaggi dei volumi per ogni container:
gcloud beta run jobs update JOB \ --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 un nuovo job, salta questo passaggio. Se stai aggiornando un job esistente, scarica la relativa configurazione YAML:
gcloud run jobs describe JOB_NAME --format export > job.yaml
Configura gli attributi
volumeMounts
evolumes
come mostrato:apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME metadata: annotations: run.googleapis.com/launch-stage: BETA 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 del 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 formaLOCATION-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 montaggio del volume.
MOUNT_PATH
con il percorso relativo all'interno del container file system in cui vuoi montare questo volume, ad esempio/mnt/my-volume
.- SIZE_LIMIT con il limite di memoria da 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.
- IMAGE_URL con un riferimento all'immagine del container, ad esempio
Crea o aggiorna il job utilizzando il comando seguente:
gcloud run jobs replace job.yaml
Lettura e scrittura a volume
Se utilizzi la funzionalità di montaggio del volume di Cloud Run, accedi a un volume utilizzando le stesse librerie del linguaggio di programmazione che utilizzi per leggere e scrivere file sul file system locale.
Questo è particolarmente utile se utilizzi un contenitore esistente che si aspetta che i dati vengano archiviati nel file system locale e utilizza operazioni di file system regolari per accedervi.
I seguenti snippet presuppongono un montaggio del volume con un valore mountPath
impostato su /mnt/my-volume
.
Nodejs
Utilizza il modulo File system per creare un nuovo file o aggiungerlo a un file
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 contenuto 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");