Tutorial sull'utilizzo di Filestore con Cloud Run

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo tutorial mostra come montare Filestore come file system di rete su un servizio Cloud Run per condividere dati tra più container e servizi. Questo tutorial utilizza l'ambiente di esecuzione di seconda generazione di Cloud Run.

L'ambiente di esecuzione di seconda generazione consente di montare i file system di rete in una directory nel container. Il montaggio di un file system consente la condivisione di risorse tra un sistema host e le istanze di container e la persistenza delle risorse in seguito alla garbage collection di un'istanza di container.

L'utilizzo di un file system di rete con Cloud Run richiede una conoscenza avanzata di Docker perché il tuo container deve eseguire più processi, inclusi il processo di montaggio del file system e di applicazione. Questo tutorial illustra i concetti necessari insieme a un esempio pratico; tuttavia, quando adatti questo tutorial alla tua applicazione, assicurati di aver compreso le implicazioni di eventuali modifiche che potresti apportare.

Panoramica sulla progettazione

L'istanza Filestore è ospitata in una rete Virtual Private Cloud (VPC). Le risorse all'interno di una rete VPC utilizzano un intervallo di indirizzi IP privati per comunicare con le API e i servizi Google; pertanto, i client devono trovarsi sulla stessa rete dell'istanza Filestore per accedere ai file archiviati su tale istanza. Per il servizio Cloud Run è necessario un connettore di accesso VPC serverless per connettersi alla rete VPC per comunicare con Filestore. Scopri di più sull'accesso VPC serverless.

architettura-file system

Il diagramma mostra il servizio Cloud Run che si connette all'istanza Filestore tramite un connettore di accesso VPC serverless. Per ottenere le migliori prestazioni, l'istanza e il connettore Filestore si trovano nella stessa rete VPC, "default" e nella stessa area geografica/zona del servizio Cloud Run.

Limitazioni

  • Questo tutorial non descrive come scegliere un file system o requisiti pronti per la produzione. Scopri di più sui concetti del Filestore e sui livelli di servizio.

  • Questo tutorial non mostra come utilizzare un file system o discutere dei pattern di accesso ai file.

Obiettivi

  • Crea un'istanza Filestore sulla rete VPC predefinita per utilizzarla come condivisione di file.

  • Crea un connettore di accesso VPC serverless sulla stessa rete VPC predefinita per connetterti al servizio Cloud Run.

  • Crea un Dockerfile con pacchetti di sistema e init-process per gestire i processi di montaggio e applicazione.

  • Eseguire il deployment in Cloud Run e verificare l'accesso al file system nel servizio.

Costi

Questo tutorial utilizza componenti fatturabili di Google Cloud, tra cui:

Autorizzazioni

Le autorizzazioni necessarie per questo tutorial possono essere soddisfatte dai ruoli Proprietario o Editor. L'insieme minimo di ruoli è:

Le autorizzazioni IAM controllano solo l'accesso alle operazioni Filestore, ad esempio la creazione di un'istanza Filestore. Per controllare l'accesso alle operazioni sulla condivisione file, ad esempio la lettura o l'esecuzione, utilizza le autorizzazioni dei file POSIX. Scopri di più sul controllo dell'accesso.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  4. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  6. Abilita le API Cloud Run, Filestore, Serverless VPC Access, Artifact Registry, and Cloud Build .

    Abilita le API

  7. Installa e inizializza l'interfaccia a riga di comando gcloud.

Configurazione delle impostazioni predefinite di gcloud

Per configurare gcloud con i valori predefiniti per il tuo servizio Cloud Run:

  1. Imposta il progetto predefinito:

    gcloud config set project PROJECT_ID

    Sostituisci PROJECT_ID con il nome del progetto creato per questo tutorial.

  2. Configura gcloud per l'area geografica scelta:

    gcloud config set run/region REGION

    Sostituisci REGION con l'area geografica supportata da Cloud Run a tua scelta.

  3. Configura gcloud per Filestore:

    gcloud config set filestore/zone ZONE
    

    Sostituisci ZONE con la zona supportata di Filestore.

Recupero dell'esempio di codice in corso...

Per recuperare l'esempio di codice da utilizzare:

  1. Clona il repository delle app di esempio sul tuo computer locale:

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git

    In alternativa, puoi scaricare l'esempio come file ZIP ed estrarlo.

  2. Passa alla directory che contiene il codice campione di Cloud Run:

    Python

    cd python-docs-samples/run/filesystem/

    Java

    cd java-docs-samples/run/filesystem/

Nozioni di base sul codice

Normalmente, dovresti eseguire un singolo processo o una singola applicazione all'interno di un container. L'esecuzione di un singolo processo per container riduce la complessità di gestione del ciclo di vita di più processi: la gestione dei riavvii, l'interruzione del container in caso di errore e la responsabilità di PID 1, come l'inoltro del segnale e il raccolto di bambini zombie. Tuttavia, l'utilizzo dei file system di rete in Cloud Run richiede l'utilizzo di container multiprocessi per eseguire sia il processo di montaggio del file system che l'applicazione. Questo tutorial mostra come terminare il container in caso di errore del processo e gestire le responsabilità PID 1. Il comando di montaggio dispone di una funzionalità integrata per gestire i nuovi tentativi.

Puoi utilizzare un gestore di processo per eseguire e gestire più processi come punto di contatto del container. Questo tutorial utilizza tini, un servizio di sostituzione init che ripulisce i processi di zombie ed esegue la deviazione del segnale. Nello specifico, questo processo di inizializzazione consente al segnale SIGTERM di shutdown di propagarsi all'applicazione. Il segnale SIGTERM può essere rilevato per la fine di un'applicazione. Scopri di più sul ciclo di vita di un container su Cloud Run.

Definizione della configurazione dell'ambiente con il Dockerfile

Questo servizio Cloud Run richiede uno o più pacchetti di sistema aggiuntivi non disponibili per impostazione predefinita. L'istruzione RUN installerà tini come processo iniziale e nfs-common, che fornisce funzionalità client NFS minime. Scopri di più sull'utilizzo dei pacchetti di sistema nel servizio Cloud Run nel tutorial sull'utilizzo dei pacchetti di sistema.

Le istruzioni successive creano una directory di lavoro, copiano il codice sorgente e installano le dipendenze dell'app.

Il ENTRYPOINT specifica il programma binario di inizializzazione che antepone alle istruzioni CMD, in questo caso è lo script di avvio. In questo modo viene avviato un singolo processo tini e tutti i proxy ricevuti vengono trasmessi a una sessione rooted in quel processo secondario.

L'istruzione CMD imposta il comando da eseguire durante l'esecuzione dell'immagine, ovvero lo script di avvio. Fornisce anche argomenti predefiniti per ENTRYPOINT. Scoprire come interagiscono CMD e ENTRYPOINT.

Python

# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.10-slim

# Install system dependencies
RUN apt-get update -y && apt-get install -y \
    tini \
    nfs-common \
    && apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/nfs/filestore

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

# Install production dependencies.
RUN pip install -r requirements.txt

# Ensure the script is executable
RUN chmod +x /app/run.sh

# Use tini to manage zombie processes and signal forwarding
# https://github.com/krallin/tini
ENTRYPOINT ["/usr/bin/tini", "--"]

# Pass the startup script as arguments to tini
CMD ["/app/run.sh"]

Java


# Use the official maven/Java 11 image to create a build artifact.
# https://hub.docker.com/_/maven
FROM maven:3.8.5-jdk-11 as builder

# Copy local code to the container image.
WORKDIR /app
COPY pom.xml .
COPY src ./src

# Build a release artifact.
RUN mvn package -DskipTests

# Use AdoptOpenJDK for base image.
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM eclipse-temurin:18-jdk

# Install filesystem dependencies
RUN apt-get update -y && apt-get install -y \
    tini \
    nfs-kernel-server \
    nfs-common \
    && apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/nfs/filestore

# Copy the jar to the production image from the builder stage.
COPY --from=builder /app/target/filesystem-*.jar /filesystem.jar

# Copy the statup script
COPY run.sh ./run.sh
RUN chmod +x ./run.sh

# Use tini to manage zombie processes and signal forwarding
# https://github.com/krallin/tini
ENTRYPOINT ["/usr/bin/tini", "--"]

# Run the web service on container startup.
CMD ["/run.sh"]

Definizione dei processi nello script di avvio

Lo script di avvio crea una directory come punto di montaggio in cui l'istanza di Filestore viene resa accessibile. Successivamente, lo script utilizza il comando mount per collegare l'istanza Filestore, specificando l'indirizzo IP dell'istanza e il nome della condivisione file al punto di montaggio del servizio, quindi avvia il server dell'applicazione. Il comando mount dispone di una funzionalità di ripetizione integrata; pertanto non sono necessari ulteriori script di bash. Infine, il comando wait viene utilizzato per rilevare qualsiasi processo in background da uscire e quindi uscire dallo script.

Python

#!/usr/bin/env bash
set -eo pipefail

# Create mount directory for service.
mkdir -p $MNT_DIR

echo "Mounting Cloud Filestore."
mount -o nolock $FILESTORE_IP_ADDRESS:/$FILE_SHARE_NAME $MNT_DIR
echo "Mounting completed."

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
# Timeout is set to 0 to disable the timeouts of the workers to allow Cloud Run to handle instance scaling.
exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

# Exit immediately when one of the background processes terminate.
wait -n

Java

#!/usr/bin/env bash
set -eo pipefail

# Create mount directory for service
mkdir -p $MNT_DIR

echo "Mounting Cloud Filestore."
mount -o nolock $FILESTORE_IP_ADDRESS:/$FILE_SHARE_NAME $MNT_DIR
echo "Mounting completed."

# Start the application
java -jar filesystem.jar

# Exit immediately when one of the background processes terminate.
wait -n

Utilizzo dei file

Python

Vedi main.py per interagire con il file system.

Java

Vedi FilesystemApplication.java per interagire con il filesystem.

Spedizione del servizio

  1. Crea un'istanza Filestore:

    gcloud filestore instances create INSTANCE_ID \
        --tier=STANDARD \
        --file-share=name=FILE_SHARE_NAME,capacity=1TiB \
        --network=name="default"
    

    Sostituisci INSTANCE_ID con il nome dell'istanza Filestore, ad esempio my-filestore-instance, e FILE_SHARE_NAME con il nome della directory gestita dall'istanza Filestore, ad esempio vol1. Vedi Denominazione dell'istanza e Denominazione della condivisione file.

    Per accedere ai file archiviati su tale istanza, i client (servizio Cloud Run) devono trovarsi sulla stessa rete dell'istanza Filestore. Questo comando crea l'istanza nella rete VPC predefinita e assegna un intervallo di indirizzi IP gratuito. I nuovi progetti iniziano con una rete predefinita e molto probabilmente non è necessario crearne una separata.

    Per ulteriori informazioni sulla configurazione dell'istanza, vedi Creazione di istanze.

  2. Configura un connettore di accesso VPC serverless:

    Per connetterti all'istanza Filestore, il servizio Cloud Run deve accedere alla rete VPC autorizzata dell'istanza Filestore.

    Ogni connettore VPC richiede una propria subnet /28 in cui posizionare le istanze del connettore. Questo intervallo IP non deve sovrapporsi ad alcuna prenotazione di indirizzi IP esistente nella tua rete VPC. Ad esempio, 10.8.0.0 (/28) funzionerà nella maggior parte dei nuovi progetti oppure puoi specificare un altro intervallo IP personalizzato non utilizzato, come 10.9.0.0 (/28). Puoi vedere quali intervalli IP sono attualmente prenotati in Google Cloud Console.

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
      --region REGION \
      --range "10.8.0.0/28"
    

    Sostituisci CONNECTOR_NAME con il nome del connettore.

    Questo comando crea un connettore nella rete VPC predefinita, come nell'istanza Filestore, con dimensione della macchina e2-micro. L'aumento delle dimensioni della macchina del connettore può migliorare la velocità effettiva del connettore, ma anche l'aumento dei costi. Il connettore deve trovarsi anche nella stessa area geografica del servizio Cloud Run. Scopri di più sulla configurazione dell'accesso VPC serverless.

  3. Definisci una variabile di ambiente con l'indirizzo IP per l'istanza Filestore:

    export FILESTORE_IP_ADDRESS=$(gcloud filestore instances describe INSTANCE_ID --format "value(networks.ipAddresses[0])")
    
  4. Crea un account di servizio da utilizzare come identità di servizio. Per impostazione predefinita, questo metodo non ha privilegi diversi dall'appartenenza al progetto.

    gcloud iam service-accounts create fs-identity

    Questo servizio non deve interagire con nessun altro elemento in Google Cloud, quindi non è necessario assegnare autorizzazioni aggiuntive a questo account di servizio.

  5. Crea ed esegui il deployment dell'immagine container su Cloud Run:

    gcloud beta run deploy filesystem-app --source . \
        --vpc-connector CONNECTOR_NAME \
        --execution-environment gen2 \
        --allow-unauthenticated \
        --service-account fs-identity \
        --update-env-vars FILESTORE_IP_ADDRESS=$FILESTORE_IP_ADDRESS,FILE_SHARE_NAME=FILE_SHARE_NAME
    

    Questo comando crea ed esegue il deployment del servizio Cloud Run e specifica il connettore VPC e l'ambiente di esecuzione di seconda generazione. Il deployment dall'origine creerà l'immagine in base al Dockerfile ed eseguirà il push dell'immagine al repository Artifact Registry: cloud-run-source-deploy.

    Scopri di più sul deployment dal codice sorgente.

Debug

Se il deployment non va a buon fine, controlla Cloud Logging per ulteriori dettagli.

  • Se la connessione scade, assicurati di fornire l'indirizzo IP corretto dell'istanza Filestore.

  • Se il server ha negato l'accesso, assicurati che il nome della condivisione file sia corretto.

  • Se vuoi che tutti i log della procedura di montaggio, utilizza il flag --verbose in combinazione con il comando mount: mount --verbose -o nolock $FILESTORE_IP_ADDRESS:/$FILE_SHARE_NAME $MNT_DIR

Provalo

Per provare il servizio completo:

  1. Vai al browser che rimanda all'URL fornito nel passaggio precedente.
  2. Dovresti vedere un file appena creato nella tua istanza di Filestore.
  3. Fai clic sul file per visualizzarne i contenuti.

Se scegli di continuare a sviluppare questi servizi, ricorda che hanno limitato l'accesso a Identity and Access Management (IAM) al resto di Google Cloud e dovranno disporre di ruoli IAM aggiuntivi per accedere a molti altri servizi.

Discussione sui costi

Esempio di ripartizione dei costi per un servizio, ospitato in Iowa (us-central1) con un'istanza di 1 TiB Filestore e un connettore di accesso VPC serverless. Visita le singole pagine dei prezzi per conoscere i prezzi più aggiornati.

Prodotto Costo al mese
Filestore (non dipende dall'importo utilizzato) Costo = capacità sottoposta a provisioning (1024 GiB o 1 TiB) * prezzo del livello regionale (us-central1)

Livello standard: 1024 GiB * $0,20/mese = $204,80
Premium Premium/High Scale SSD: 1024 GiB * $0.30/mo = $307.20
6.04 .6
Accesso VPC serverless Costo = prezzo per le dimensioni della macchina * numero di istanze (il valore predefinito delle istanze è 2)

f1-micro: 3,88 $ * 2 istanze = 7,76 $
e2-micro: 6,11 $ * 2 istanze = 12,22 $
e2-standard-4: 97,83 $ * 2 istanze = 195,66 $
Cloud Run Costo = CPU + memoria + richieste + networking
Totale 204,80 $ + 12,22 $= 217,02 $/mese + costo di Cloud Run

Questo tutorial utilizza un'istanza Filestore Standard (Basic HDD). Il livello di servizio di un'istanza Filestore è una combinazione del tipo di istanza e del tipo di archiviazione. È possibile eseguire l'upgrade del tipo di istanza per aumentare la capacità e la scalabilità. È possibile eseguire l'upgrade del tipo di archiviazione per migliorare le prestazioni. Scopri di più sui suggerimenti per il tipo di archiviazione. Anche l'area geografica e la capacità influiscono sui prezzi di Filestore. Ad esempio, un'istanza TiB Standard di Livello 1 in Iowa (us-central1) costa 0,20 $per GiB al mese, ovvero circa 204,80 $al mese.

I prezzi del connettore di accesso VPC serverless dipendono dalle dimensioni e dal numero di istanze e dal traffico in uscita dalla rete. L'aumento delle dimensioni e del numero può migliorare la velocità effettiva o ridurre la latenza dei messaggi. Sono disponibili tre dimensioni di macchine: f1-micro, e2-micro ed e2-standard-4. Il numero minimo di istanze è due, pertanto il costo minimo è il doppio del costo di quella dimensione della macchina.

I prezzi di Cloud Run vengono calcolati in base all'utilizzo delle risorse, arrotondati ai 100 ms più vicini, per memoria, CPU, numero di richieste e networking. Pertanto, il costo varierà in base alle impostazioni del servizio, al numero di richieste e al tempo di esecuzione del servizio. Questo servizio costa almeno 217,02 $al mese. Visualizza ed esplora una stima nel Calcolatore prezzi di Google Cloud.

Esegui la pulizia

Se hai creato un nuovo progetto per questo tutorial, elimina il progetto. Se hai utilizzato un progetto esistente e vuoi mantenerlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.

Per eliminare il progetto:

  1. In Google Cloud Console, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Eliminazione delle risorse del tutorial

  1. Elimina il servizio Cloud Run di cui hai eseguito il deployment in questo tutorial:

    gcloud run services delete SERVICE-NAME

    Dove SERVICE-NAME è il nome del servizio che hai scelto.

    Puoi anche eliminare i servizi Cloud Run da Google Cloud Console.

  2. Rimuovi la configurazione dell'area geografica predefinita di gcloud che hai aggiunto durante la configurazione del tutorial:

     gcloud config unset run/region
    
  3. Rimuovi la configurazione del progetto:

     gcloud config unset project
    
  4. Elimina altre risorse Google Cloud create in questo tutorial:

Passaggi successivi