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

1. Hinweis

6a5cf23c8e20491f.png

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 wahlweise mit Cloud Run (vollständig verwaltet) oder Cloud Run for Anthos ausführen. Ziel dieses Codelabs ist es, ein Container-Image zu erstellen und in Cloud Run bereitzustellen.

Voraussetzungen

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie eines erstellen.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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 später in diesem Codelab als PROJECT_ID bezeichnet.

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

Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Folgen Sie bitte der Anleitung im Abschnitt „Bereinigen“, in der Sie erfahren, wie Sie Ressourcen herunterfahren können, damit nach Abschluss dieser Anleitung keine Gebühren anfallen. Neue Nutzer von Google Cloud kommen für das Programm für den kostenlosen Testzeitraum mit einem Guthaben von 300$ infrage.

Cloud Shell

Sie können Google Cloud zwar per Fernzugriff von Ihrem Laptop aus bedienen, in diesem Lab verwenden Sie jedoch Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird.

Diese Debian-basierte virtuelle Maschine verfügt über alle Entwicklungstools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Für dieses Codelab benötigen Sie also nur einen Browser (es funktioniert auch auf einem Chromebook).

  1. Klicken Sie zum Aktivieren von Cloud Shell in der Cloud Console einfach auf Cloud Shell aktivieren fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q. Die Bereitstellung und Verbindung mit der Umgebung sollte nur wenige Augenblicke dauern.

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre PROJECT_ID eingestellt ist.

gcloud auth list

Befehlsausgabe

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

Befehlsausgabe

[core]
project = <PROJECT_ID>

Wenn das Projekt aus irgendeinem Grund nicht festgelegt ist, führen Sie einfach den folgenden Befehl aus:

gcloud config set project <PROJECT_ID>

Suchst du nach deinem PROJECT_ID? Sehen Sie nach, welche ID Sie in den Einrichtungsschritten verwendet haben, oder suchen Sie sie im Cloud Console-Dashboard:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

In Cloud Shell werden auch einige Umgebungsvariablen standardmäßig festgelegt, die für zukünftige Befehle nützlich sein können.

echo $GOOGLE_CLOUD_PROJECT

Befehlsausgabe

<PROJECT_ID>
  1. Legen Sie zum Schluss 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 unter 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.

3. Beispiel-App schreiben

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.

4. Anwendung containerisieren und in Container Registry hochladen

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.

Bei erfolgreicher Übertragung in die Registry wird eine SUCCESS-Meldung mit dem Image-Namen (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld) ausgegeben. 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 Webvorschau170b7a95be8c6296.png und wählen Sie Vorschau auf Port 8080 aus.

3618ca3a4a135570.png

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

a0307f34cacf9e6a.png

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

5. In Cloud Run bereitstellen

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:

63260b4d3aee42b8.png

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.

6. Bereinigen

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

7. Glückwunsch

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.