1. Prima di iniziare
La gestione dei siti web può essere difficile con tutto il carico di lavoro connesso alla creazione e alla gestione di istanze di macchine virtuali (VM), cluster, pod, servizi e così via. Questo può essere ragionevole per applicazioni multilivello di grandi dimensioni, ma se il tuo obiettivo è semplicemente quello di eseguire il deployment del sito web e renderlo visibile, il carico di lavoro è davvero eccessivo.
Con Cloud Run, l'implementazione Google Cloud di Knative, puoi gestire il tuo sito web ed eseguirne il deployment senza alcun overhead di cui hai bisogno per i deployment basati su VM o Kubernetes. Questo approccio semplifica la gestione e consente anche di "scalare fino a zero" quando non arrivano richieste al sito web.
In questo codelab, inizierai con un'immagine Docker creata tramite Cloud Build, che attiverai in Cloud Shell. Quindi, esegui il deployment dell'immagine in Cloud Run con un comando in Cloud Shell.
Prerequisiti
- Familiarità generale con Docker (consulta la sezione Inizia del sito web di Docker).
Obiettivi didattici
- Creare un'immagine Docker con Cloud Build e caricarla in gcr.io
- Eseguire il deployment delle immagini Docker in Cloud Run
- Gestire i deployment di Cloud Run
- Configurare un endpoint per un'app su Cloud Run
Cosa creerai
- Un sito web statico che viene eseguito all'interno di un container Docker
- Una versione di questo contenitore che si trova in Container Registry
- Un deployment di Cloud Run per il tuo sito web statico
Che cosa ti serve
- Un Account Google con accesso amministrativo per creare progetti o un progetto con ruolo di proprietario progetto.
2. Configurazione dell'ambiente
Configurazione dell'ambiente a tuo ritmo
Se non hai ancora un Account Google, devi crearne uno. Poi, accedi alla console Google Cloud e fai clic su Progetto > Crea progetto.
Ricorda l'ID progetto, che viene compilato automaticamente sotto il nome del progetto. L'ID progetto è un nome univoco per tutti i progetti Google Cloud, pertanto il nome nello screenshot è già stato utilizzato e non funzionerà per te. In seguito verrà chiamato PROJECT_ID
.
Successivamente, devi abilitare la fatturazione nella console Cloud per utilizzare le risorse Google Cloud e attivare l'API Cloud Run.
Abilita l'API Cloud Run
Fai clic su Menu di navigazione ☰ > API e servizi > Dashboard > Abilita API e servizi. .
Cerca "API Cloud Run", poi fai clic su API Cloud Run > Attiva.
L'esecuzione di questo codelab non dovrebbe costarti più di qualche dollaro, ma potrebbe essere più cara se decidi di utilizzare più risorse o se le lasci in esecuzione (vedi Pulizia alla fine). Per ulteriori informazioni, vedi Prezzi.
I nuovi utenti di Google Cloud possono beneficiare di una prova senza costi di 300$.
Cloud Shell
Sebbene Google Cloud e Cloud Run possano essere gestiti da remoto dal tuo laptop, utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud. L'ambiente è preconfigurato con tutte le librerie e i framework client di cui hai bisogno.
Questa macchina virtuale basata su Debian viene caricata con tutti gli strumenti di sviluppo di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Ciò significa che per questo codelab ti serve solo un browser (sì, funziona su Chromebook).
- Per attivare Cloud Shell dalla console Cloud, fai clic su Attiva Cloud Shell
(dovrebbero bastare pochi istanti per eseguire il provisioning e connettersi all'ambiente).
Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo PROJECT_ID
.
gcloud auth list
Output comando
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Output comando
[core] project = <PROJECT_ID>
Se, per qualche motivo, il progetto non è impostato, esegui semplicemente il seguente comando:
gcloud config set project <PROJECT_ID>
Stai cercando il tuo PROJECT_ID
? Controlla quale ID hai utilizzato nei passaggi di configurazione o cercalo nella dashboard della console Cloud:
Cloud Shell imposta anche alcune variabili di ambiente per impostazione predefinita, che potrebbero essere utili per l'esecuzione di comandi futuri.
echo $GOOGLE_CLOUD_PROJECT
Output comando
<PROJECT_ID>
- Infine, imposta la zona e la configurazione del progetto predefinite.
gcloud config set compute/zone us-central1-f
Puoi scegliere una serie di zone diverse. Per ulteriori informazioni, consulta Regioni e zone.
3. clona il repository di codice sorgente
Dato che stai eseguendo il deployment di un sito web esistente, puoi semplicemente clonare il codice sorgente dal tuo repository per concentrarti sulla creazione di immagini Docker e sul deployment in Cloud Run.
Esegui i comandi seguenti per clonare il repository nell'istanza di Cloud Shell e passa alla directory appropriata. Installerai anche le dipendenze Node.js per poter testare l'app prima del deployment.
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices ./setup.sh
Questo esegue il clonamento del repository, apporta modifiche alla directory e installa le dipendenze necessarie per eseguire l'app localmente. L'esecuzione dello script potrebbe richiedere alcuni minuti.
Esegui la due diligence e testa l'app. Esegui il seguente comando per avviare il server web:
cd ~/monolith-to-microservices/monolith npm start
Output:
Monolith listening on port 8080!
Puoi visualizzare l'anteprima dell'app facendo clic su Anteprima web e selezionando Anteprima sulla porta 8080.
Si aprirà una nuova finestra in cui puoi vedere il tuo Fancy Store in azione.
Puoi chiudere questa finestra dopo aver visualizzato il sito web. Per arrestare il processo del server web, premi CONTROL+C
(Command+C
su Macintosh) nella finestra del terminale.
4. crea il container in Docker con Cloud Build
Ora che i file sorgente sono pronti per l'uso, puoi "dockerizzare" l'app.
Normalmente, dovrai seguire un approccio in due fasi che prevede la creazione di un container Docker e il relativo push a un registry per archiviare l'immagine da cui GKE esegue il pull. Tuttavia, puoi semplificare la procedura utilizzando Cloud Build per creare il container Docker e inserire l'immagine in Container Registry con un unico comando. Per visualizzare il processo manuale di creazione di un file Dockerfile e del relativo push, consulta la Guida rapida per Container Registry.
Cloud Build comprime i file della directory e li sposta in un bucket Cloud Storage. Il processo di compilazione acquisirà quindi tutti i file dal bucket e userà il Dockerfile presente nella stessa directory per eseguire il processo di compilazione Docker. Dato che hai specificato il flag --tag
con l'host gcr.io per l'immagine Docker, verrà eseguito il push dell'immagine Docker risultante in Container Registry.
Innanzitutto, devi assicurarti di aver attivato l'API Cloud Build. Esegui il comando seguente per abilitarla:
gcloud services enable cloudbuild.googleapis.com
Una volta abilitata l'API, esegui il comando seguente in Cloud Shell per avviare il processo di compilazione:
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .
Il processo richiede qualche minuto, ma al termine verrà restituito un output simile al seguente nel terminale:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 1ae295d9-63cb-482c-959b-bc52e9644d53 2019-08-29T01:56:35+00:00 33S gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz gcr.io/<PROJECT_ID>/monolith:1.0.0 SUCCESS
Per visualizzare la cronologia delle build o per osservare lo svolgimento del processo in tempo reale, puoi andare alla console Cloud e fare clic su Menu di navigazione ☰ > Cloud Build > Cronologia. Qui puoi vedere un elenco di tutte le build precedenti, ma dovrebbe essere riportata solo quella che hai creato.
Se fai clic sull'ID build, vedrai tutti i dettagli relativi a quella build, incluso l'output del log. Puoi visualizzare l'immagine del contenitore creata facendo clic sul link accanto a Immagine.
5. Esegui il deployment del container in Cloud Run
Ora che hai containerizzato il sito web e lo hai inviato a Container Registry, è il momento di eseguire il deployment in Cloud Run.
Per il deployment in Cloud Run è possibile scegliere tra due approcci:
- Cloud Run (completamente gestito) è il modello PaaS in cui viene gestito l'intero ciclo di vita del container. Questo approccio verrà utilizzato per questo codelab.
- Cloud Run for Anthos è Cloud Run con un livello di controllo supplementare che ti consente di utilizzare i tuoi cluster e pod da GKE. Per ulteriori informazioni, consulta Configurare Cloud Run for Anthos su Google Cloud.
Gli esempi di riga di comando saranno in Cloud Shell utilizzando le variabili di ambiente configurate in precedenza.
Riga di comando
Esegui questo comando per eseguire il deployment dell'app:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed
Ti verrà chiesto di specificare la regione in cui vuoi pubblicare l'annuncio. Seleziona la regione più vicina a te, quindi accetta il nome del servizio suggerito predefinito (monolith).
Per scopi di test, consenti le richieste non autenticate all'app. Inserisci y
al prompt.
Verifica il deployment
Per verificare che il deployment sia stato creato correttamente, esegui il seguente comando. Potrebbero essere necessari alcuni istanti prima che Pod status
diventi Running
:
gcloud run services list
Seleziona [1] Cloud Run (completamente gestito).
Output:
SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT ✔ monolith us-east1 <your url> <your email> 2019-09-16T21:07:38.267Z
L'output mostra diverse cose. Puoi vedere il deployment, nonché l'utente che lo ha eseguito (il tuo indirizzo email) e l'URL da usare per accedere all'app. Sembra che tutto sia stato creato correttamente.
Apri l'URL fornito nell'elenco dei servizi nel browser web e dovresti vedere lo stesso sito web di cui hai visualizzato l'anteprima in locale.
6. crea una nuova revisione con minore contemporaneità
Ora esegui di nuovo il deployment dell'app, questa volta regolando uno dei parametri.
Per impostazione predefinita, un'app Cloud Run avrà un valore di concorrenza pari a 80, il che significa che ogni istanza di container gestirà fino a 80 richieste alla volta. Si tratta di una differenza considerevole rispetto al modello Functions as a Service (FaaS), in cui ogni istanza gestisce una richiesta alla volta.
Esegui nuovamente il deployment della stessa immagine container con un valore di contemporaneità pari a 1 (solo a scopo di test) e guarda cosa succede.
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1
Rispondi alle domande successive come hai già fatto la prima volta. Quando il comando ha esito positivo, controlla la console Cloud per visualizzare il risultato.
Nella dashboard di Cloud Run, fai clic sul servizio monolith per visualizzare i dettagli.
Fai clic sulla scheda Revisioni. Dovresti vedere due revisioni create. Fai clic su monolith-00002 ed esamina i dettagli. Dovresti vedere il valore di contemporaneità ridotto a 1.
]
Anche se questa configurazione è sufficiente a scopo di test, nella maggior parte degli scenari di produzione saranno presenti container che supportano più richieste in contemporanea.
Ora ripristina la contemporaneità originale senza ripetere il deployment. Puoi impostare il valore di contemporaneità su 80 o 0, per rimuovere eventuali limitazioni di contemporaneità e impostarlo sul valore massimo predefinito (che al momento della stesura di questo articolo è 80).
Esegui il comando seguente in Cloud Shell per aggiornare la revisione corrente:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80
Noterai che è stata creata un'altra revisione, il traffico è stato reindirizzato e la contemporaneità è di nuovo impostata su 80.
7. apporta modifiche al sito web
Il team di marketing ti ha chiesto di modificare la home page del sito web della tua azienda. Secondo il team, dovrebbe essere più ricca di informazioni relative all'azienda e a ciò che commercializza. In questa sezione aggiungerai del testo alla home page per soddisfare la richiesta del team di marketing.
Sembra che uno dei tuoi sviluppatori abbia già creato le modifiche con il nome file index.js.new
. Puoi semplicemente copiare il file in index.js
per riflettere le modifiche. Segui le istruzioni per apportare le modifiche necessarie.
Esegui i comandi seguenti, copia il file aggiornato con il nome file corretto e stampane i contenuti per verificare le modifiche:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
Il codice risultante dovrebbe avere l'aspetto seguente:
/* Copyright 2019 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import React from "react"; import { makeStyles } from "@material-ui/core/styles"; import Paper from "@material-ui/core/Paper"; import Typography from "@material-ui/core/Typography"; const useStyles = makeStyles(theme => ({ root: { flexGrow: 1 }, paper: { width: "800px", margin: "0 auto", padding: theme.spacing(3, 2) } })); export default function Home() { const classes = useStyles(); return ( <div className={classes.root}> <Paper className={classes.paper}> <Typography variant="h5"> Fancy Fashion & Style Online </Typography> <br /> <Typography variant="body1"> Tired of mainstream fashion ideas, popular trends and societal norms? This line of lifestyle products will help you catch up with the Fancy trend and express your personal style. Start shopping Fancy items now! </Typography> </Paper> </div> ); }
Hai aggiornato i componenti React, ma devi creare la build dell'app React per generare i file statici. Esegui questo comando per creare la build dell'app React e copiarla nella directory pubblica del monolite:
cd ~/monolith-to-microservices/react-app npm run build:monolith
Ora che il codice è aggiornato, devi ricreare il container Docker e pubblicarlo in Container Registry. Puoi usare lo stesso comando di prima, aggiornando però l'etichetta della versione.
Esegui questo comando per attivare un nuovo processo Cloud Build con una versione aggiornata 2.0.0 dell'immagine:
cd ~/monolith-to-microservices/monolith #Feel free to test your application npm start gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .
Nella sezione successiva, userai questa immagine per aggiornare l'app senza tempi di inattività.
8. aggiorna il sito web senza tempi di inattività
Le modifiche sono state completate e il team di marketing è molto soddisfatto dei tuoi aggiornamenti. Ora è il momento di aggiornare il sito web senza interruzioni per gli utenti.
Cloud Run considera ogni deployment come una nuova revisione, che viene messa online e poi riceve il traffico reindirizzato.
Segui le istruzioni successive per aggiornare il tuo sito web.
Riga di comando
Dalla riga di comando, puoi eseguire nuovamente il deployment del servizio per aggiornare l'immagine a una nuova versione con il seguente comando:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed
Verifica il deployment
Convalida l'aggiornamento del deployment eseguendo il seguente comando:
gcloud run services describe monolith --platform managed
L'output è il seguente:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: annotations: client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0 ...
Vedrai che il servizio utilizza la versione più recente dell'immagine di cui è stato eseguito il deployment in una nuova revisione.
Per verificare le modifiche, vai di nuovo all'URL esterno del servizio Cloud Run e nota che il titolo dell'app è stato aggiornato.
Esegui questo comando per elencare i servizi e visualizzare l'indirizzo IP se lo hai dimenticato:
gcloud run services list
Nel sito web dovrebbe essere presente il testo che hai aggiunto al componente della home page.
9. Esegui la pulizia
Eliminare le immagini di Container Registry
# Delete the container image for version 1.0.0 of our monolith gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet # Delete the container image for version 2.0.0 of our monolith gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet
Eliminare gli elementi di Cloud Build da Cloud Storage
# The following command will take all source archives from all builds and delete them from cloud storage # Run this command to print all sources: # gcloud builds list | awk 'NR > 1 {print $4}' gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done
Elimina servizio Cloud Run
gcloud run services delete monolith --platform managed
10. Complimenti
Hai eseguito il deployment, lo hai reso scalabile e lo hai aggiornato con Cloud Run.