Questa pagina descrive come configurare un volume in memoria dedicato da utilizzare per le letture e le scritture 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 installi il volume in memoria in Cloud Run, 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 si limitano le dimensioni di un volume, le scritture a un volume completo hanno esito negativo, il che è preferibile che le istanze Cloud Run siano terminate a causa del volume che consuma troppa memoria.
- Condividere un volume in memoria tra container diversi in un'unica istanza Cloud Run. Quando Cloud Run esegue lo scale out per più istanze di un servizio, ogni istanza avrà il proprio volume in memoria condiviso da tutti i container nell'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 il volume raggiunge il limite di dimensioni, le ulteriori scritture non riusciranno e genereranno un errore di memoria insufficiente. L'istanza può gestire questo errore e continuare a essere in esecuzione.
Tieni presente che il limite di dimensioni è solo un limite: non alloca spazio aggiuntivo per il tuo volume in memoria. Piuttosto, il volume in memoria consuma la memoria configurata per i container. Se esegui il deployment di più container, la memoria utilizzata da ogni scrittura nel volume viene conteggiata come memoria utilizzata per il container che ha scritto i dati.
Se non specifichi un limite di dimensione, questo viene impostato automaticamente sulla metà della
dimensione totale di tutti i container nel job o nel servizio. Ad esempio,
dimensione del volume emptyDir
= [Memoria (container A) + Memoria (container B) + Memoria (container N)]/2.
Questo comportamento predefinito può comportare che il limite delle dimensioni del volume in memoria sia superiore alla memoria allocata per alcuni dei container. In questa situazione,
se il container continua a scrivere memoria nel volume, supererà la memoria allocata
e si arresta in modo anomalo prima che venga raggiunto il limite delle dimensioni del volume.
L'impostazione di un limite di dimensione è facoltativa, ma ti consigliamo di impostarne uno per proteggere i container dalla perdita di 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.
La proprietà del volume varia in base all'ambiente di esecuzione e al tipo di deployment
Quando monta un volume, l'identità a cui appartengono i file e le directory varia a seconda dell'ambiente di esecuzione del carico di lavoro e del fatto che il deployment sia costituito da uno o più container.
Nell'ambiente di esecuzione di prima generazione in cui esegui il deployment di un singolo container, il volume appartiene all'identità utilizzata per il container. In tutti gli altri casi, il volume è di proprietà della directory principale. Ciò include:
- L'ambiente di esecuzione di prima generazione in cui esegui il deployment di più container
- L'ambiente di seconda generazione
Configurare un volume in memoria
Qualsiasi modifica alla configurazione porta alla creazione di una nuova revisione. Anche le revisioni successive riceveranno automaticamente questa impostazione di 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 e il volume esiste finché l'istanza è in esecuzione. Quando l'istanza arresta l'esecuzione, i dati nel volume vengono eliminati definitivamente.
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 tuo 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 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 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 di seguito:apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME metadata: annotations: run.googleapis.com/launch-stage: BETA spec: template: metadata: 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à 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 relativo montaggio.
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 container.
- IMAGE_URL con un riferimento all'immagine container,
ad esempio
Sostituisci il servizio con la nuova configurazione utilizzando il seguente comando:
gcloud beta run jobs replace job.yaml
Lettura e scrittura a volume
Se utilizzi la funzionalità di montaggio del volume di Cloud Run, puoi accedere a un volume montato utilizzando le stesse librerie nel tuo linguaggio di programmazione che utilizzi per leggere e scrivere file sul tuo file system locale.
Ciò è particolarmente utile se utilizzi un container esistente che prevede l'archiviazione dei dati nel file system locale e che utilizza le normali operazioni del file system per accedervi.
I seguenti snippet presuppongono un montaggio del volume con un valore mountPath
impostato su /mnt/my-volume
.
Node.js
Utilizza il modulo File system per creare un nuovo file o aggiungerlo a un elemento
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 contenuto nel volume, /mnt/my-volume
:
f = open("/mnt/my-volume/sample-logfile.txt", "a")
Go
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");