Questa pagina descrive come configurare un volume in-memory dedicato che puoi 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-memory 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, vi accedi come se fosse una directory nel 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 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 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. 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 nel volume viene conteggiata come memoria utilizzata dal 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 servizio. Ad esempio,
dimensioni del volume emptyDir = [Memoria (container A) + Memoria (container B) + Memoria (container N)]/2.
Questo comportamento predefinito può far sì che il limite di dimensioni del volume in memoria sia superiore all'allocazione della memoria 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 dimensioni del volume non è stato raggiunto.
Sebbene l'impostazione di un limite di dimensioni sia facoltativa, ti consigliamo di impostarne uno per evitare che i container esauriscano la memoria e si arrestino in modo anomalo.
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 di servizi Cloud Run, chiedi all'amministratore di concederti i seguenti ruoli IAM:
- Cloud Run Developer (
roles/run.developer) sul servizio Cloud Run - Utente dell'account di servizio (
roles/iam.serviceAccountUser) sull'identità di servizio
Se esegui il deployment di un servizio o di una funzione dal codice sorgente, devi anche disporre di ruoli aggiuntivi concessi al tuo progetto e al account di servizio Cloud Build.
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 tuo servizio Cloud Run interagisce con le APIGoogle Cloud , 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.
Configura 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 smette di essere eseguita, i dati nel volume vengono eliminati definitivamente.
Console
Nella console Google Cloud , vai a Cloud Run:
Seleziona Servizi dal menu di navigazione di Cloud Run:
Se stai configurando un nuovo servizio, fai clic su Esegui il deployment del container e compila la pagina delle impostazioni iniziali del servizio. Poi fai clic su Container, networking, sicurezza per espandere la pagina di configurazione del servizio e fai clic su Volumi.
Se stai configurando un servizio esistente, fai clic sul servizio, quindi sulla scheda Container.
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.
(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.
Fai clic su Crea per un nuovo servizio. Fai clic su Visualizza differenze e fai di nuovo il deployment, quindi su Esegui il deployment delle modifiche per un servizio esistente.
gcloud
Per montare un volume:
gcloud run services update SERVICE \ --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT
Sostituisci quanto segue:
- SERVICE: il nome del servizio.
- 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 punti di montaggio 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
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
Configura gli attributi
volumeMountsevolumescome 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 quanto segue:
IMAGE_URL: un riferimento all'immagine container, ad esempious-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL segue il formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.- VOLUME_NAME: un nome qualsiasi per il volume. Il valore VOLUME_NAME viene utilizzato per mappare il volume al punto di 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.
Crea o aggiorna il servizio utilizzando il seguente comando:
gcloud run services replace service.yaml
Il comando
gcloud run services replaceutilizza per impostazione predefinita il fileservice.yaml, se presente.
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Aggiungi quanto segue a una risorsagoogle_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 quanto segue:
- SERVICE_NAME: il nome del servizio Cloud Run.
- REGION: la regione Google Cloud . Ad esempio
europe-west1. IMAGE_URL: un riferimento all'immagine container, ad esempious-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL segue il formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.- VOLUME_NAME: un nome qualsiasi per il 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.
Scrivi
Per specificare i montaggi dei volumi in memoria nel file compose.yaml, utilizza l'estensione x-google-cloudrun:volume-type: in-memory specifica di Google.
services: web: image: IMAGE volumes: - VOLUME_NAME:MOUNT_PATH volumes: VOLUME_NAME: x-google-cloudrun: volume-type: in-memory
Sostituisci quanto segue:
- IMAGE: l'URL dell'immagine container.
- VOLUME_NAME: il nome del volume in memoria.
- MOUNT_PATH: il percorso in cui vuoi montare il volume, ad esempio
/mnt/my-volume.
Esegui il deployment dei servizi
Per eseguire il deployment dei servizi, esegui il comando
gcloud run compose up:gcloud run compose up compose.yamlRispondi
ya eventuali prompt per installare i componenti richiesti o per abilitare le API.(Facoltativo) Rendi pubblico il servizio se vuoi consentire l'accesso non autenticato al servizio.
Dopo il deployment, viene visualizzato l'URL del servizio Cloud Run. Copia questo URL e incollalo nel browser per visualizzare il container in esecuzione. Puoi disattivare l'autenticazione predefinita dalla console Google Cloud .
Lettura e scrittura su 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.
Questo è 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.
Gli snippet seguenti 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 aggiungerlo 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 punti di montaggio dei volumi
Puoi cancellare tutti i volumi e i montaggi oppure rimuovere singoli volumi e montaggi di volumi.
Cancella tutti i volumi e i punti di montaggio dei volumi
Per cancellare tutti i volumi e i punti di montaggio dei volumi dal servizio single-container, esegui questo comando:
gcloud run services update SERVICE \ --clear-volumes \ --clear-volume-mounts
gcloud run services update SERVICE \ --container=container1 \ --clear-volumes \ --clear-volume-mounts \ --container=container2 \ --clear-volumes \ --clear-volume-mounts
Rimuovi singoli volumi e punti di montaggio dei volumi
Per rimuovere un volume, devi anche rimuovere tutti i montaggi dei volumi che lo utilizzano.
Per rimuovere singoli volumi o montaggi di 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