Website mit Cloud Run bereitstellen

1. Hinweis

Websites zu betreiben kann sehr aufwendig sein, wenn Sie VM-Instanzen, Cluster, Pods, Dienste usw. erstellen und verwalten müssen. Bei größeren, mehrstufigen Anwendungen ist das angemessen. Wenn es aber nur darum geht, eine Website bereitzustellen und zugänglich zu machen, ist der Aufwand oft viel zu groß.

Mit Cloud Run, der Google Cloud-Implementierung von Knative, können Sie Ihre Website verwalten und bereitstellen, ohne den Aufwand für eine Infrastruktur bei Verwendung von VM- oder Kubernetes-Deployments bewältigen zu müssen. Dies ist nicht nur aus Verwaltungsperspektive ein einfacherer Ansatz, sondern bietet Ihnen auch die Möglichkeit, auf null zu skalieren, wenn keine Anfragen an Ihre Website eingehen.

In diesem Codelab beginnen Sie mit einem Docker-Image, das mithilfe von Cloud Build erstellt und von Cloud Shell ausgelöst wird. Anschließend stellen Sie dieses Image mit einem Cloud Shell-Befehl in Cloud Run bereit.

Vorbereitung

Lerninhalte

  • Docker-Image mit Cloud Build erstellen und auf gcr.io hochladen
  • Docker-Images in Cloud Run bereitstellen
  • Cloud Run-Deployments verwalten
  • Endpunkt für eine Anwendung in Cloud Run einrichten

Aufgaben

  • Eine statische Website, die in einem Docker-Container ausgeführt wird
  • Eine Version dieses Containers in Container Registry
  • Eine Cloud Run-Bereitstellung für Ihre statische Website

Voraussetzungen

  • Ein Google-Konto mit Administratorzugriff zum Erstellen von Projekten oder eines Projekts mit der Rolle „Projektinhaber“

2. Umgebung einrichten

Umgebung zum selbstbestimmten Lernen einrichten

Wenn Sie noch kein Google-Konto haben, müssen Sie eines erstellen. Melden Sie sich dann in der Google Cloud Console an und klicken Sie auf Projekt > Projekt erstellen.

53dad2cefdae71da.png

faab21976aabeb4c.png

Merken Sie sich die Projekt-ID, die automatisch unter Ihrem Projektnamen eingefügt wird. Die Projekt-ID ist für alle Google Cloud-Projekte ein eindeutiger Name. Der Name im Screenshot ist also bereits vergeben und kann nicht verwendet werden. Sie wird später als PROJECT_ID bezeichnet.

Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen zu verwenden und die Cloud Run API zu aktivieren.

Cloud Run API aktivieren

Klicken Sie auf das Navigationsmenü ☰ > APIs & Dienste > Dashboard > APIs & Dienste aktivieren. .

5dbb2e6e27a55fcf.png

Suchen Sie nach „Cloud Run API“ und klicken Sie dann auf Cloud Run API > Aktivieren.

f1fd486174a744cf.png

Die Durchführung dieses Codelabs 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 Bereinigen am Ende). Weitere Informationen finden Sie unter Preise.

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

Cloud Shell

Während Sie Google Cloud und Cloud Run von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Lab Cloud Shell verwendet, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird. Die Umgebung ist mit allen Clientbibliotheken und Frameworks vorkonfiguriert, die Sie benötigen.

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.

3. Quell-Repository klonen

Da Sie eine vorhandene Website bereitstellen, müssen Sie nur die Quelle aus Ihrem Repository klonen. Dann können Sie sich darauf konzentrieren, Docker-Images zu erstellen und in Cloud Run bereitzustellen.

Führen Sie die folgenden Befehle aus, um das Repository in Ihre Cloud Shell-Instanz zu klonen und in das entsprechende Verzeichnis zu wechseln. Sie installieren auch die Node.js-Abhängigkeiten, damit Sie die App vor der Bereitstellung testen können.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Dadurch wird Ihr Repository geklont, in das Verzeichnis gewechselt und die für die lokale Ausführung Ihrer App erforderlichen Abhängigkeiten werden installiert. Es kann einige Minuten dauern, bis das Skript ausgeführt wird.

Testen Sie Ihre App sorgfältig. Führen Sie den folgenden Befehl aus, um den Webserver zu starten:

cd ~/monolith-to-microservices/monolith
npm start

Ausgabe:

Monolith listening on port 8080!

Sie können eine Vorschau Ihrer App aufrufen, indem Sie auf Webvorschauacc630712255c604.png klicken und Vorschau auf Port 8080 auswählen.

5869738f0e9ec386.png

Dadurch sollte ein neues Fenster geöffnet werden, in dem Sie den Fancy Store im Einsatz sehen können.

9ed25c3f0cbe62fa.png

Sie können dieses Fenster schließen, nachdem Sie sich die Website angesehen haben. Drücken Sie im Terminalfenster CONTROL+C (Command+C auf Macintosh), um den Webserverprozess zu beenden.

4. Docker-Container mit Cloud Build erstellen

Nachdem jetzt die Quelldateien zur Verfügung stehen, kann im nächsten Schritt der Docker-Container für Ihre Anwendung erstellt werden.

Normalerweise sind dafür zwei Schritte erforderlich. Zuerst muss ein Docker-Container erstellt und dann per Push in eine Registry übertragen werden, damit GKE das Image abrufen kann. Sie können diesen Vorgang jedoch vereinfachen und mit einem einzigen Befehl den Docker-Container mit Cloud Build erstellen sowie das Image in Container Registry platzieren. Wie Sie ein Dockerfile manuell erstellen und übertragen, können Sie in der Kurzanleitung für Container Registry nachlesen.

Cloud Build komprimiert die Dateien aus dem Verzeichnis und verschiebt sie in einen Cloud Storage-Bucket. Beim Build-Prozess werden dann alle Dateien aus dem Bucket übernommen und das Docker-Image wird mit dem Dockerfile im selben Verzeichnis erstellt. Da Sie für den Host das Flag --tag als gcr.io für das Docker-Image angegeben haben, wird das fertige Docker-Image per Push nach Container Registry übertragen.

Als Erstes müssen Sie die Cloud Build API aktivieren. Führen Sie dazu folgenden Befehl aus:

gcloud services enable cloudbuild.googleapis.com

Wenn die API aktiviert ist, geben Sie folgenden Befehl in Cloud Shell ein, um den Build-Prozess zu starten:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

Dieser Vorgang dauert einige Minuten. Nach Abschluss ist im Terminal in etwa folgende Ausgabe zu sehen:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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

Wenn Sie den Build-Verlauf einsehen oder den Vorgang in Echtzeit beobachten möchten, rufen Sie die Cloud Console auf und klicken Sie auf das Navigationsmenü ☰ > Cloud Build > Verlauf. Dort wird eine Liste aller bisherigen Builds angezeigt. In diesem Fall sollte nur der von Ihnen erstellte Build zu sehen sein.

4c753ede203255f6.png

Wenn Sie auf die Build-ID klicken, werden alle Details zu diesem Build angezeigt, einschließlich der Logausgabe. Sie können das erstellte Container-Image aufrufen, indem Sie auf den Link neben Image klicken.

6e88ed1643dfe629.png

5. Container in Cloud Run bereitstellen

Nachdem Sie für Ihre Website einen Container erstellt und per Push nach Container Registry übertragen haben, soll dieser nun in Cloud Run bereitgestellt werden.

Dazu haben Sie zwei Möglichkeiten:

  • Cloud Run (vollständig verwaltet) ist das PaaS-Modell, bei dem der gesamte Lebenszyklus eines Containers verwaltet wird. Diesen Ansatz verwenden Sie in diesem Codelab.
  • Cloud Run for Anthos ist Cloud Run mit einer zusätzlichen Steuerungsebene, mit der eigene Cluster und Pods aus GKE verwendet werden können. Weitere Informationen finden Sie unter Cloud Run for Anthos in Google Cloud einrichten.

Die Befehlszeilenbeispiele werden in Cloud Shell mit den Umgebungsvariablen ausgeführt, die Sie zuvor eingerichtet haben.

Befehlszeile

Stellen Sie die Anwendung mit dem folgenden Befehl bereit:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

Sie werden aufgefordert, die Region anzugeben, in der sie ausgeführt werden soll. Wählen Sie die Region aus, die Ihnen am nächsten ist, und übernehmen Sie dann den vorgeschlagenen Standarddienstnamen „monolith“.

d52d9419c5166674.png

Lassen Sie für Testzwecke nicht authentifizierte Anfragen an die App zu. Geben Sie an der Eingabeaufforderung y ein.

3a57b32f133dad61.png

Deployment prüfen

Führen Sie den folgenden Befehl aus, um zu prüfen, ob das Deployment erfolgreich erstellt wurde. Es kann einige Momente dauern, bis Pod status Running ist:

gcloud run services list

Wählen Sie [1] Cloud Run (vollständig verwaltet) aus.

Ausgabe:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

Die Ausgabe zeigt Folgendes: Sie sehen das Deployment, den Nutzer, der es bereitgestellt hat (Ihre E-Mail-Adresse), und die URL für den Zugriff auf die Anwendung. Es wurde also alles erstellt.

Öffnen Sie die in der Liste der Dienste angegebene URL in Ihrem Webbrowser. Sie sollten dieselbe Website sehen, deren Vorschau Sie lokal aufgerufen haben.

6. Neue Überarbeitung mit niedrigerem Gleichzeitigkeitswert erstellen

Stellen Sie Ihre App mit einem geänderten Parameter noch einmal bereit.

Standardmäßig hat eine Cloud Run-Anwendung einen Gleichzeitigkeitswert von 80. Das bedeutet, dass jede Containerinstanz bis zu 80 Anfragen gleichzeitig verarbeiten kann. Das ist ein großer Unterschied zum Functions-as-a-Service-Modell (FaaS), bei dem sich immer nur eine einzige Anfrage verarbeiten lässt.

Stellen Sie dasselbe Container-Image mit einem Gleichzeitigkeitswert von 1 noch einmal bereit (nur zu Testzwecken) und sehen Sie sich das Ergebnis an.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

Beantworten Sie die nachfolgenden Fragen wie beim ersten Mal. Wenn der Befehl ausgeführt wurde, können Sie sich das Ergebnis in der Cloud Console ansehen.

Klicken Sie im Cloud Run-Dashboard auf den Dienst monolith, um die Details aufzurufen.

7d1eed2e4728a4f2.png

Klicken Sie auf den Tab Überarbeitungen. Es sollten nun zwei erstellte Überarbeitungen zu sehen sein. Klicken Sie auf monolith-00002 und sehen Sie sich die Details an. Der Gleichzeitigkeitswert sollte auf 1 reduziert sein.

217185c0eccc87dd.png]

4ad481b8bcd0343d.png

Diese Konfiguration reicht für Testzwecke aus. In den meisten Produktionsszenarien werden aber Container benötigt, die mehrere Anfragen gleichzeitig unterstützen.

Stellen Sie nun den ursprünglichen Gleichzeitigkeitswert ohne neues Deployment wieder her. Sie können den Gleichzeitigkeitswert auf den Standardwert 80 oder auf 0 festlegen. Mit 0 wird die Beschränkung der Gleichzeitigkeit aufgehoben und automatisch der standardmäßige Höchstwert (also 80) festgelegt.

Führen Sie den folgenden Befehl in Cloud Shell aus, um die aktuelle Revision zu aktualisieren:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

Es wurde nun eine weitere Überarbeitung erstellt. Der Traffic wurde umgeleitet und für die Gleichzeitigkeit gilt wieder der Wert 80.

7. Website ändern

Ihr Marketingteam hat Sie gebeten, die Startseite der Website Ihres Unternehmens zu ändern. Diese Seite soll mehr Informationen zu Ihrem Unternehmen und den angebotenen Produkten enthalten. In diesem Abschnitt fügen Sie der Startseite neue Texte hinzu, um dem Wunsch des Marketingteams nachzukommen.

Offenbar hat einer Ihrer Entwickler die Änderungen bereits unter dem Dateinamen index.js.new erstellt. Kopieren Sie diese Datei einfach nach index.js. Die Änderungen sollten dann zu sehen sein. Folgen Sie der Anleitung, um die entsprechenden Änderungen vorzunehmen.

Führen Sie die folgenden Befehle aus, um die aktualisierte Datei in den korrekten Dateinamen zu kopieren, und rufen Sie dann deren Inhalt auf, um die Änderungen zu prüfen:

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

Der Code sollte dann in etwa so aussehen:

/*
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 &amp; 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>
  );
}

Sie haben die React-Komponenten aktualisiert, müssen aber noch die React-Anwendung erstellen, um die statischen Dateien zu generieren. Führen Sie den folgenden Befehl aus, um die React-Anwendung zu erstellen und in das öffentliche monolith-Verzeichnis zu kopieren:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

Nachdem der Code aktualisiert wurde, müssen Sie den Docker-Container neu erstellen und in Container Registry veröffentlichen. Sie können dazu den gleichen Befehl wie zuvor verwenden. Nur das Versionslabel muss geändert werden.

Führen Sie den folgenden Befehl aus, um ein neues Cloud Build mit der aktualisierten Image-Version 2.0.0 auszulösen:

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 .

Im nächsten Abschnitt verwenden Sie dieses Image, um Ihre App ohne Ausfallzeit zu aktualisieren.

8. Website ohne Ausfallzeit aktualisieren

Die Änderungen wurden durchgeführt und das Marketingteam ist mit dem Ergebnis sehr zufrieden. Nun soll die Website unterbrechungsfrei aktualisiert werden.

Cloud Run behandelt jedes Deployment als neue Überarbeitung, die online gestellt wird, bevor Traffic zum Deployment weitergeleitet wird.

Folgen Sie der Anleitung unten, um Ihre Website zu aktualisieren.

Befehlszeile

In der Befehlszeile können Sie den Dienst noch einmal bereitstellen, um das Image mit dem folgenden Befehl auf eine neue Version zu aktualisieren:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

Deployment prüfen

Sie können das aktualisierte Deployment mit dem folgenden Befehl prüfen:

gcloud run services describe monolith --platform managed 

Sie erhalten folgende Ausgabe:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

Sie können darin erkennen, dass der Dienst nun die neueste Version Ihres Images verwendet, die in einer neuen Überarbeitung bereitgestellt wurde.

Um die Änderungen zu prüfen, rufen Sie noch einmal die externe URL Ihres Cloud Run-Dienstes auf. Sie sehen dann, dass der Titel Ihrer App geändert wurde.

Führen Sie den folgenden Befehl aus, um die Dienste aufzulisten und die IP-Adresse aufzurufen, falls Sie sie vergessen haben:

gcloud run services list

Auf Ihrer Website sollte nun der Text dargestellt sein, den Sie gerade der Startseite hinzugefügt haben.

451ca252acae6928.png

9. Bereinigen

Container Registry-Images löschen

# 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

Cloud Build-Artefakte aus Cloud Storage löschen

# 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

Cloud Run-Dienst löschen

gcloud run services delete monolith --platform managed

10. Glückwunsch

Sie haben Ihre Website mit Cloud Run bereitgestellt, skaliert und aktualisiert.

Weitere Informationen