Configurare i montaggi dei volumi in memoria per i servizi

Questa pagina descrive come configurare un volume in memoria dedicato utilizzabile per le letture e le scritture di file usando i montaggi di volumi Cloud Run. Tieni presente che è diversa dalle funzioni integrate file system in memoria fornito da in Cloud Run.

Quando installi il volume in memoria in Cloud Run, vengono visualizzati 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 lo scale out su più istanze di un ogni istanza avrà il proprio servizio 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 raggiunge il limite di dimensioni, ulteriori scritture non riusciranno se la memoria è esaurita . L'istanza può gestire questo errore e continuare a essere in esecuzione.

Ricorda che il limite per le 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, utilizzata da ogni scrittura sul volume viene conteggiata come utilizzo della memoria per il container 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 il limite delle dimensioni del volume in memoria superiore alla memoria allocata per alcuni dei tuoi container. 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.

La proprietà del volume varia in base all'ambiente di esecuzione e al tipo di deployment

Quando installi un volume, l'identità a cui appartengono i file e le directory è diversa a seconda dell'ambiente di esecuzione del carico di lavoro e del fatto che il deployment è costituito da uno o più container.

Nell'ambiente di esecuzione di prima generazione, in cui esegui il deployment container, il volume appartiene all'identità utilizzata per il container. In tutto in altri casi, il volume è di proprietà della directory principale. tra cui:

  • Ambiente di esecuzione di prima generazione in cui esegui il deployment container
  • L'ambiente di seconda generazione

Configurare un volume in memoria

Qualsiasi modifica alla configurazione porta 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

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

    Vai a Cloud Run

  2. Fai clic su Crea servizio se stai configurando un nuovo servizio in cui stai eseguendo il deployment. Se stai configurando un'istanza servizio esistente, fai clic sul servizio e poi su Modifica ed esegui il deployment di una nuova revisione.

  3. Se stai configurando un nuovo servizio, compila il servizio iniziale pagina delle impostazioni come preferisci, poi fai clic su Container, volumi, networking, sicurezza per espandere pagina di configurazione del servizio.

  4. Fai clic sulla scheda Volumi.

    immagine

    • 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.
      • Fai clic su Fine.
    • Fai clic sulla scheda Contenitore.
    • Fai clic sulla scheda Montaggi di volumi.
      • 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
  5. Fai clic su Crea o Esegui il deployment.

gcloud

  • Per aggiungere un volume e montarlo:

    gcloud beta run services update SERVICE \
    --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

    Sostituisci:

    • SERVICE con il nome del tuo servizio.
    • 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. specificato per i tuoi container.
  • Se utilizzi più container, specifica prima i volumi, quindi specifica i montaggi dei volumi per ogni container:

    gcloud beta 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

  1. 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
  2. Configura gli attributi volumeMounts e volumes come mostrato di seguito:

    apiVersion: serving.knative.dev/v1
    kind: Service
    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, per ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già creati. L'URL ha la forma LOCATION-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 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. specificato per i tuoi container.
  3. Crea o aggiorna il servizio utilizzando il comando seguente:

    gcloud run services replace service.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.

Ciò è particolarmente utile se utilizzi un container esistente che prevede dati da archiviare sul file system locale e utilizza il normale file system operazioni per accedervi.

I seguenti snippet presuppongono un montaggio del volume con un valore mountPath impostato su /mnt/my-volume.

Node.js

Utilizzare 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 contenuto 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");