Esegui il deployment di un container ed eseguilo con Cloud Run su Node.js

1. Prima di iniziare

6a5cf23c8e20491f.png

Cloud Run è una piattaforma gestita di computing che consente di eseguire container stateless richiamabili tramite richieste HTTP. Cloud Run è serverless: elimina la necessità di gestire l'infrastruttura, così puoi concentrarti su ciò che conta di più, ovvero creare app fantastiche. È basato su Knative per consentirti di scegliere se eseguire i container con Cloud Run (completamente gestito) o Cloud Run for Anthos. L'obiettivo di questo codelab è creare un'immagine container ed eseguirne il deployment su Cloud Run.

Prerequisiti

N/D

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già un account Gmail o G Suite, devi crearne uno.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Ricorda l'ID progetto, un nome univoco tra tutti i progetti Google Cloud (il nome sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID.

  1. Successivamente, dovrai abilitare la fatturazione in Cloud Console per utilizzare le risorse Google Cloud.

L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Assicurati di seguire le istruzioni riportate nella sezione "Pulizia", che ti consiglia come arrestare le risorse in modo da non incorrere in addebiti oltre questo tutorial. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Cloud Shell

Anche se Google Cloud può essere gestito da remoto dal tuo laptop, utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud.

Questa macchina virtuale basata su Debian viene caricata con tutti gli strumenti di sviluppo di cui avrai 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 servirà solo un browser (sì, funziona su Chromebook).

  1. Per attivare Cloud Shell dalla console Cloud, fai clic su Attiva Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

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 questo comando:

gcloud config set project <PROJECT_ID>

Stai cercando PROJECT_ID? Controlla l'ID che hai utilizzato nei passaggi di configurazione o cercalo nella dashboard della console Cloud:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell imposta anche alcune variabili di ambiente per impostazione predefinita, che potrebbero essere utili quando esegui i comandi futuri.

echo $GOOGLE_CLOUD_PROJECT

Output comando

<PROJECT_ID>
  1. 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 saperne di più, consulta Regioni e zone.

Abilita l'API Cloud Run

Da Cloud Shell, abilita l'API Cloud Run.

gcloud services enable run.googleapis.com

Dovrebbe essere visualizzato un messaggio di operazione riuscita simile a questo:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. Scrivi l'app di esempio

Creerai una semplice app Node.js basata su Express che risponde alle richieste HTTP.

Per creare l'app, utilizza Cloud Shell per creare una nuova directory denominata helloworld-nodejs e passa a questa directory.

mkdir helloworld-nodejs
cd helloworld-nodejs

Crea un file package.json con il seguente contenuto:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Molto importante: il file sopra contiene un comando di avvio di script e una dipendenza dal framework dell'app web Express.

Quindi, nella stessa directory, crea un file index.js e copia al suo interno il seguente contenuto:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

Questo codice crea un server web di base in ascolto sulla porta definita dalla variabile di ambiente PORT. La tua app è ora pronta per essere containerizzata, testata e caricata in Container Registry.

4. containerizza l'app e caricala in Container Registry

Per containerizzare l'app di esempio, crea un nuovo file denominato Dockerfile nella stessa directory dei file di origine e copia al suo interno il seguente contenuto:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

Ora crea la tua immagine container utilizzando Cloud Build eseguendo questo comando dalla directory contenente il Dockerfile:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT è una variabile di ambiente che contiene l'ID progetto Google Cloud quando viene eseguita in Cloud Shell. Puoi ottenerlo anche eseguendo gcloud config get-value project.

Una volta eseguito il push in Container Registry, vedrai un messaggio SUCCESS contenente il nome dell'immagine (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld). L'immagine è archiviata in Container Registry e, se lo desideri, può essere riutilizzata.

Puoi elencare tutte le immagini container associate al tuo progetto corrente usando questo comando:

gcloud container images list

Se vuoi eseguire e testare l'app in locale da Cloud Shell, puoi avviarla utilizzando questo comando docker standard:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

In Cloud Shell, fai clic su Anteprima web 170b7a95be8c6296.png e seleziona Anteprima sulla porta 8080.

3618ca3a4a135570.png

Si apre una finestra del browser con il messaggio Hello World!

a0307f34cacf9e6a.png

Puoi anche utilizzare semplicemente curl localhost:8080.

5. Esegui il deployment in Cloud Run

Il deployment dell'app containerizzata su Cloud Run viene eseguito utilizzando il comando seguente (assicurati di modificarlo in base al nome corretto dell'immagine per l'app che hai creato o utilizza l'immagine predefinita gcr.io/cloudrun/hello):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

L'opzione di deployment --allow-unauthenticated ti consente di raggiungere l'app senza autenticazione. L'opzione di deployment --platform managed \ indica che stai richiedendo l'ambiente completamente gestito (non l'infrastruttura Kubernetes tramite Anthos).

Attendi qualche istante fino al completamento del deployment. Al termine, la riga di comando visualizza l'URL del servizio.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

Ora puoi visitare il container di cui hai eseguito il deployment aprendo l'URL del servizio in un browser web:

63260b4d3aee42b8.png

Cloud Run scala automaticamente e orizzontalmente l'immagine container per gestire le richieste ricevute, quindi fa lo scale down quando la domanda diminuisce. Paghi solo per la CPU, la memoria e le risorse di rete utilizzate durante la gestione delle richieste.

6. Esegui la pulizia

Sebbene Cloud Run non addebiti costi quando il servizio non è in uso, ti potrebbero comunque essere addebitati i costi di archiviazione dell'immagine container creata.

Puoi eliminare il tuo progetto Google Cloud per evitare addebiti, interrompendo così la fatturazione per tutte le risorse utilizzate per quel progetto, o semplicemente eliminare la tua immagine helloworld utilizzando questo comando:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

Per eliminare il servizio Cloud Run, utilizza questo comando:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

7. Complimenti

Complimenti! Hai eseguito il deployment di un'app pacchettizzata in un'immagine container su Cloud Run.

Scopri di più

Un buon passo successivo è consultare la Guida rapida: deployment su Cloud Run for Anthos in Google Cloud.

Per saperne di più sulla creazione di un container HTTP stateless adatto per Cloud Run dall'origine del codice e su come eseguirne il push in Container Registry, consulta le seguenti risorse:

Per saperne di più su Knative, il progetto open source sottostante, consulta Knative.