Container mit Cloud Run auf Node.js bereitstellen und ausführen

Cloud Run ist eine verwaltete Computing-Plattform, mit der Sie zustandslose Container ausführen können, die über HTTP-Anfragen abrufbar sind. Cloud Run arbeitet serverlos und benötigt keine Infrastrukturverwaltung. So können Sie sich ganz auf das Programmieren von Anwendungen konzentrieren. Es basiert auf Knative. Sie können Ihre Container entweder mit Cloud Run (vollständig verwaltet) oder mit Cloud Run for Anthos ausführen. Ziel dieses Codelabs ist es, ein Container-Image zu erstellen und in Cloud Run bereitzustellen.

Voraussetzungen

Einrichtung der Umgebung im eigenen Tempo

Wenn Sie noch kein Google-Konto (Gmail oder Google Apps) haben, müssen Sie eins erstellen. Melden Sie sich in der Google Cloud Platform Console (console.cloud.google.com) an und erstellen Sie ein neues Projekt:

Screenshot vom 10.02.2016, 12:45:26.png

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird in diesem Codelab später als PROJECT_ID bezeichnet.

Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.

Dieses Codelab sollte Sie nicht mehr als ein paar Dollar kosten, aber es könnte mehr sein, wenn Sie sich für mehr Ressourcen entscheiden oder wenn Sie sie laufen lassen (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).

Neuen Nutzern der Google Cloud Platform steht eine kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.

Cloud Shell

Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, verwenden Sie Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird.

Auf dieser Debian-basierten virtuellen Maschine sind alle erforderlichen Entwicklungstools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf der Google Cloud, wodurch Netzwerkleistung und Authentifizierung deutlich verbessert werden. Für dieses Codelab benötigen Sie also nur einen Browser (es funktioniert auch auf einem Chromebook).

Klicken Sie zum Aktivieren von Google Cloud Shell einfach rechts oben in der Entwicklerkonsole auf die Schaltfläche. Das Bereitstellen und Herstellen einer Verbindung zur Umgebung dauert nur wenige Augenblicke:

activateCloudShell.png

Klicken Sie auf die Schaltfläche „Cloud Shell starten“:

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

Sobald Sie mit der Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und das Projekt bereits auf Ihre PROJECT_ID eingestellt ist :

gcloud auth list

Befehlsausgabe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

In Cloud Shell werden auch einige Umgebungsvariablen standardmäßig festgelegt, die beim Ausführen zukünftiger Befehle nützlich sein können.

echo $GOOGLE_CLOUD_PROJECT

Befehlsausgabe

<PROJECT_ID>

Wenn das Projekt aus irgendeinem Grund nicht festgelegt ist, geben Sie einfach den folgenden Befehl ein :

gcloud config set project <PROJECT_ID>

Suchst du nach deinem PROJECT_ID? Prüfen Sie, welche ID Sie in den Einrichtungsschritten verwendet haben, oder suchen Sie sie im Konsolen-Dashboard:

Project_ID.png

WICHTIG: Legen Sie abschließend die Standardzone und die Projektkonfiguration fest:

gcloud config set compute/zone us-central1-f

Sie können verschiedene Zonen auswählen. Weitere Informationen finden Sie in der Dokumentation zu Regionen und Zonen.

Aktivieren Sie die Cloud Run API.

Aktivieren Sie die Cloud Run API in Cloud Shell.

gcloud services enable run.googleapis.com

Wenn die Aktivierung erfolgreich war, erhalten Sie eine Meldung, die ungefähr so aussieht:

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

Sie erstellen eine einfache, auf Express basierende Node.js-Anwendung, die auf HTTP-Anfragen reagiert.

Erstellen Sie in Cloud Shell ein neues Verzeichnis mit dem Namen helloworld-nodejs und wechseln Sie in dieses Verzeichnis, um die App zu erstellen.

mkdir helloworld-nodejs
cd helloworld-nodejs

Erstellen Sie eine package.json-Datei mit folgendem Inhalt:

{
  "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"
  }
}

Beachten Sie, dass die obige Datei einen Befehl zum Starten des Skripts und eine Abhängigkeit vom Express-Framework für Webanwendungen enthält.

Erstellen Sie als Nächstes im selben Verzeichnis eine index.js-Datei und kopieren Sie den folgenden Inhalt hinein:

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);
});

Mit diesem Code wird ein einfacher Webserver erstellt, der den von der Umgebungsvariable PORT definierten Port überwacht. Die Anwendung ist jetzt fertig und kann containerisiert, getestet und in Container Registry hochgeladen werden.

Erstellen Sie zum Containerisieren der Beispielanwendung in dem Verzeichnis, in dem sich die Quelldateien befinden, eine neue Datei namens Dockerfile und kopieren Sie den folgenden Inhalt hinein:

# 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" ]

Erstellen Sie jetzt das Container-Image mit Cloud Build. Dazu führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem sich das Dockerfile befindet:

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

$GOOGLE_CLOUD_PROJECT ist eine Umgebungsvariable, die Ihre Google Cloud-Projekt-ID enthält, wenn Sie in Cloud Shell ausgeführt wird. Sie können sie auch abrufen, indem Sie gcloud config get-value project ausführen.

Nachdem das Image in die Registry hochgeladen wurde, wird eine SUCCESS-Meldung mit dem Image-Namen (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld) angezeigt. Das Image wird in Container Registry gespeichert und kann bei Bedarf wiederverwendet werden.

Lassen Sie sich mit folgendem Befehl alle Container-Images Ihres aktuellen Projekts anzeigen:

gcloud container images list

Wenn Sie die App lokal in Cloud Shell ausführen und testen möchten, können Sie sie mit dem folgenden docker-Standardbefehl starten:

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

Klicken Sie in Cloud Shell auf Webvorschau und wählen Sie Vorschau auf Port 8080 aus.

Dadurch wird ein Browserfenster mit der Meldung Hello World! geöffnet.

Sie können auch einfach curl localhost:8080 verwenden.

Sie können Ihre containerisierte Anwendung mit folgendem Befehl in Cloud Run bereitstellen. Achten Sie darauf, dass Sie den Befehl an den richtigen Imagenamen für die von Ihnen erstellte Anwendung anpassen oder das vordefinierte Image gcr.io/cloudrun/hello verwenden:

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

Mit der Bereitstellungsoption --allow-unauthenticated können Sie die App ohne Authentifizierung aufrufen. Die Bereitstellungsoption --platform managed \ bedeutet, dass Sie die vollständig verwaltete Umgebung (nicht die Kubernetes-Infrastruktur über Anthos) anfordern.

Warten Sie dann einige Sekunden, bis die Bereitstellung abgeschlossen ist. Nach Abschluss wird in der Befehlszeile die Dienst-URL angezeigt.

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

Sie können jetzt den bereitgestellten Container aufrufen. Dazu öffnen Sie die Dienst-URL in einem Webbrowser:

Cloud Run skaliert das Container-Image automatisch horizontal, damit die empfangenen Anfragen bearbeitet werden können, und skaliert es wieder herunter, wenn der Bedarf sinkt. Es fallen nur Kosten für die CPU-, Arbeitsspeicher- und Netzwerkressourcen an, die während der Anfrageverarbeitung verbraucht werden.

Während für Cloud Run keine Kosten anfallen, wenn der Dienst nicht verwendet wird, wird Ihnen dennoch das Speichern des erstellten Container-Images möglicherweise in Rechnung gestellt.

Sie können entweder Ihr Google Cloud-Projekt löschen, um Gebühren zu vermeiden, und so die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beenden oder einfach mit dem folgenden Befehl das helloworld-Image löschen:

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

Führen Sie den folgenden Befehl aus, um den Cloud Run-Dienst zu löschen:

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

Glückwunsch! Sie haben eine in einem Container-Image verpackte Anwendung in Cloud Run bereitgestellt.

Weitere Informationen

Ein guter nächster Schritt wäre die Kurzanleitung: Cloud Run for Anthos in Google Cloud bereitstellen.

Weitere Informationen dazu, wie Sie einen zustandslosen, für Cloud Run geeigneten HTTP-Container aus einer Codequelle erstellen und in Container Registry hochladen, finden Sie in den folgenden Ressourcen:

Weitere Informationen zu Knative, dem zugrunde liegenden Open-Source-Projekt, finden Sie unter Knative.