Website mit Cloud Run bereitstellen

1. Hinweis

Websites zu betreiben kann sehr aufwendig sein, wenn Sie VMs, Cluster, Pods, Dienste usw. erstellen und verwalten müssen. Das ist in Ordnung für größere, mehrstufige Apps. Wenn Sie jedoch nur versuchen, Ihre Website bereitzustellen und sichtbar 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 einer VM oder von reinen 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 über Cloud Build erstellt und in 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, die sich in der Container Registry befindet
  • 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

Einrichten der Umgebung im eigenen Tempo

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

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

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

Cloud Run API aktivieren

Klicken Sie auf das Dreistrich-Menü ☰ > APIs & Dienste > Dashboard > APIs und Dienste aktivieren. .

5dbb2e6e27a55fcf.png

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

f1fd486174a744cf.png

Die Ausfü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 Platform steht eine kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.

Cloud Shell

Sie können Google Cloud und Cloud Run zwar per Fernzugriff von Ihrem Laptop aus nutzen, aber Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird. Die Umgebung ist mit allen erforderlichen Clientbibliotheken und ‑Frameworks vorkonfiguriert.

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

  1. Klicken Sie in der Cloud Console einfach auf Cloud Shell aktivieren fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q, um Cloud Shell zu aktivieren. 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 Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und das Projekt bereits auf Ihre PROJECT_ID festgelegt 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, geben Sie einfach den folgenden Befehl ein:

gcloud config set project <PROJECT_ID>

Suchen Sie nach Ihrem PROJECT_ID? Sehen Sie nach, welche ID Sie bei der Einrichtung verwendet haben, oder suchen Sie sie im Cloud Console-Dashboard:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

In Cloud Shell werden außerdem einige Umgebungsvariablen standardmäßig festgelegt, die bei der Ausführung zukünftiger Befehle nützlich sein können.

echo $GOOGLE_CLOUD_PROJECT

Befehlsausgabe

<PROJECT_ID>
  1. 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 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 um in das entsprechende Verzeichnis zu wechseln. Sie installieren auch die Node.js-Abhängigkeiten, damit Sie die Anwendung 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 Abhängigkeiten installiert, die zum lokalen Ausführen Ihrer App erforderlich sind. Es kann einige Minuten dauern, bis das Script ausgeführt wird.

Führen Sie eine Due-Diligence-Prüfung durch und testen Sie Ihre App. 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 Anwendung öffnen, indem Sie auf Webvorschauacc630712255c604.png und dann auf Vorschau auf Port 8080 klicken.

5869738f0e9ec386.png

Dadurch wird ein neues Fenster geöffnet, in dem Sie Ihren Fancy Store in Aktion 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 einem Macintosh), um den Webserverprozess zu beenden.

4. Docker-Container mit Cloud Build erstellen

Nachdem nun die Quelldateien zur Verfügung stehen, können Sie 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 sich die Arbeit jedoch erleichtern, indem Sie mit Cloud Build den Docker-Container erstellen und das Image mit einem einzigen Befehl in die Container Registry verschieben. 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.

Prüfen Sie zuerst, ob die Cloud Build API aktiviert ist. Führen Sie dazu folgenden Befehl aus:

gcloud services enable cloudbuild.googleapis.com

Wenn die API aktiviert ist, geben Sie in Cloud Shell den folgenden Befehl 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 enthalten:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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, klicken Sie in der Cloud Console auf das Navigationsmenü ☰ > Cloud Build > Verlauf. Dort sehen Sie eine Liste aller bisherigen Builds. Es sollte aber 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 (Bild) klicken.

6e88ed1643dfe629.png

5. Container in Cloud Run bereitstellen

Nachdem Sie einen Container für Ihre Website erstellt und per Push in die Container Registry übertragen haben, können Sie ihn nun in Cloud Run bereitstellen.

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 auch 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 zuvor eingerichteten Umgebungsvariablen ausgeführt.

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 die Funktion ausgeführt werden soll. Wählen Sie die Region aus, die Ihnen am nächsten ist, und akzeptieren Sie den vorgeschlagenen Standarddienstnamen (monolith).

d52d9419c5166674.png

Lassen Sie zu Testzwecken nicht authentifizierte Anfragen an die App zu. Geben Sie dazu y ein.

3a57b32f133dad61.png

Deployment prüfen

Um zu prüfen, ob das Deployment erfolgreich erstellt wurde, führen Sie den folgenden Befehl aus: Es kann einige Minuten 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 enthält verschiedene Informationen. Sie sehen die Bereitstellung, den Nutzer, der sie 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. Daraufhin sollte die Website angezeigt werden, deren Vorschau Sie lokal aufgerufen haben.

6. Neue Überarbeitung mit niedrigerem Gleichzeitigkeitswert erstellen

Stellen Sie Ihre Anwendung 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 jeweils nur eine Anfrage pro Instanz verarbeitet wird.

Test: Stellen Sie dasselbe Container-Image mit einem Gleichzeitigkeitswert von 1 noch einmal bereit 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 zwei erstellte Überarbeitungen zu sehen sein. Klicken Sie auf monolith-00002 und sehen Sie sich die Details an. Der Wert für die Gleichzeitigkeit 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 wieder her, ohne neu bereitzustellen. Sie können den Wert für die Gleichzeitigkeit auf den Standardwert „80“ oder „0“ zurücksetzen. Dadurch werden alle Einschränkungen aufgehoben und der Standardmaximalwert festgelegt, der derzeit 80 beträgt.

Führen Sie den folgenden Befehl in Cloud Shell aus, um die derzeitige Bearbeitung 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. Sie sollte mehr Informationen über das Unternehmen selbst und dessen Produkte enthalten. In diesem Abschnitt fügen Sie der Startseite Text hinzu, um dem Marketingteam zu gefallen.

Offenbar hat einer Ihrer Entwickler die Änderungen bereits unter dem Dateinamen index.js.new erstellt. Kopieren Sie einfach diese Datei 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 die Anwendung 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 ohne Unterbrechung für die Nutzer aktualisiert werden.

Cloud Run behandelt jedes Deployment als neue Version, die online gestellt und dann von Traffic angesteuert wird.

Folgen Sie der Anleitung, um Ihre Website zu aktualisieren.

Befehlszeile

Sie können den Dienst über die Befehlszeile 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.

Rufen Sie die externe URL Ihres Cloud Run-Dienstes noch einmal auf, um die Änderungen zu prüfen. Sie sehen dann, dass der App-Titel aktualisiert 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 der Startseitenkomponente 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