Website mit Cloud Run bereitstellen

Das Ausführen von Websites kann schwierig sein, da der Aufwand zum Erstellen und Verwalten von VM-Instanzen, -Clustern, -Pods, -Diensten und vielem mehr besteht. Für größere, mehrschichtige Anwendungen ist das in Ordnung, aber wenn Sie Ihre Website nur sichtbar machen möchten, dann ist das sehr aufwendig.

Mit Cloud Run, der Google Cloud-Implementierung von Knative, können Sie Ihre Website verwalten und bereitstellen – ohne den Aufwand für VM- oder Kubernetes-basierte Bereitstellungen. Dies vereinfacht nicht nur den Verwaltungsprozess, sondern ermöglicht es Ihnen auch, auf null zu skalieren, wenn keine Anfragen auf Ihrer Website eingehen.

Cloud Run ermöglicht nicht nur eine serverlose Entwicklung in Container, sondern kann auch auf Ihren eigenen Google Kubernetes Engine-Clustern (GKE) oder einer vollständig verwalteten Cloud-as-a-Service-Lösung (PaaS) ausgeführt werden. Sie testen das letzte Szenario in diesem Codelab.

Das folgende Diagramm zeigt den Fluss der Bereitstellung und des Cloud Run-Hostings. Sie beginnen mit einem Docker-Image, das über Cloud Build erstellt wurde und das Sie in Cloud Shell auslösen. Anschließend stellen Sie dieses Image mit einem Befehl in Cloud Shell in Cloud Run bereit.

Vorbereitung

Lerninhalte

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

Aufgaben

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

Voraussetzungen

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

Umgebung zum selbstbestimmten Lernen einrichten

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

Speichern Sie 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 wurde also bereits vergeben und funktioniert nicht. 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 nutzen und die Cloud Run API zu aktivieren.

Cloud Run API aktivieren

Klicken Sie auf Navigationsmenü ☰> APIs & Services > Dashboard> APIs und Services aktivieren. .

Suchen Sie nach der Cloud Run API und klicken Sie auf Cloud Run API > Aktivieren.

Das Durcharbeiten dieses Codelabs sollte nicht mehr als ein paar Dollar kosten. Es kann aber auch sein, dass Sie mehr Ressourcen verwenden oder sie weiterverwenden möchten (siehe Bereinigen am Ende). Weitere Informationen finden Sie unter Preise.

Neuen Google Cloud-Nutzern steht ein kostenloser Testzeitraum im Wert von 300$ zur Verfügung.

Cloud Shell

Google Cloud und Cloud Run können zwar per Remotezugriff über Ihren Laptop ausgeführt werden, Sie verwenden jedoch Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird. Die Umgebung ist mit allen erforderlichen Clientbibliotheken und Frameworks vorkonfiguriert.

Diese Debian-basierte virtuelle Maschine ist mit allen Entwicklertools ausgestattet, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud, wodurch Netzwerkleistung und Authentifizierung deutlich verbessert werden. Für dieses Codelab ist also nur ein Browser erforderlich, er funktioniert auch auf einem Chromebook.

Klicken Sie zum Aktivieren von Google Cloud Shell in der Entwicklerkonsole einfach auf die Schaltfläche oben rechts. Es dauert nur einen Moment, bis die Umgebung bereitgestellt und eine Verbindung hergestellt wird.

activateCloudShell.png

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

Screenshot 14.06.2017 um 22:13:43 Uhr.png

Wenn die Verbindung zur Cloud Shell hergestellt ist, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt auf Ihren PROJECT_ID gesetzt ist :

gcloud auth list

Befehlsausgabe

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

Befehlsausgabe

[core]
project = <PROJECT_ID>

Cloud Shell legt außerdem einige Umgebungsvariablen standardmäßig fest, die nützlich sein können, wenn Sie zukünftige Befehle ausführen.

echo $GOOGLE_CLOUD_PROJECT

Befehlsausgabe

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Suchen Sie Ihr PROJECT_ID? Sehen Sie nach, welche ID Sie bei der Einrichtung verwendet haben, oder suchen Sie sie im Dashboard der Konsole:

Projekt_ID.png

WICHTIG: Legen Sie zuletzt die Standardzone und die Projektkonfiguration fest:

gcloud config set compute/zone us-central1-f

Sie können aus verschiedenen Zonen wählen. Weitere Informationen finden Sie in der Dokumentation zu Regionen und Zonen.

Da Sie eine vorhandene Website bereitstellen, müssen Sie nur die Quelle aus Ihrem Repository klonen, sodass Sie sich auf das Erstellen von Docker-Images und das Bereitstellen in Cloud Run konzentrieren können.

Führen Sie die folgenden Befehle aus, um das Repository auf die Cloud Shell-Instanz zu klonen und in das entsprechende Verzeichnis zu wechseln. Außerdem installieren Sie 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, das Verzeichnis wird geändert und die Abhängigkeiten werden installiert, die zum lokalen Ausführen Ihrer App erforderlich sind. Die Ausführung des Skripts kann einige Minuten dauern.

Führen Sie die Sorgfaltsprüfung durch und testen Sie die Anwendung. 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 Webvorschau klicken und Vorschau auf Port 8080 auswählen.

Daraufhin wird ein neues Fenster geöffnet, in dem Sie Ihren Fancy Store in Aktion sehen können.

Sie können dieses Fenster schließen, nachdem Sie die Website aufgerufen haben. Beenden Sie den Webserverprozess, indem Sie im Terminal-Fenster auf CONTROL+C (Command+C auf Macintosh) drücken.

Nachdem die Quelldateien nun einsatzbereit sind, ist es Zeit für die Dockerisierung Ihrer Anwendung.

Normalerweise müssen Sie in zwei Schritten einen Docker-Container erstellen und in eine Registry verschieben, in dem das Image gespeichert wird, aus dem GKE abgerufen werden kann. Mit Cloud Build ist das Ganze aber noch einfacher, weil Sie damit den Docker-Container erstellen und das Image mit nur einem Befehl in Container Registry ablegen können. Informationen zum manuellen Erstellen eines Dockerfile und zum Übertragen der Datei finden Sie in der Kurzanleitung für Container Registry.

Cloud Build komprimiert die Dateien aus dem Verzeichnis und verschiebt sie in einen Cloud Storage-Bucket. Der Build-Prozess verwendet dann alle Dateien aus dem Bucket und verwendet das Dockerfile, das sich im selben Verzeichnis für die Ausführung des Docker-Build-Prozesses befindet. Da Sie für das Host das Flag --tag als gcr.io für das Docker-Image angegeben haben, wird das resultierende Docker-Image in die 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

Nachdem die API aktiviert wurde, führen Sie in Cloud Shell den folgenden Befehl aus:

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

Die Aktualisierung dauert einige Minuten. Nach Abschluss des Vorgangs wird im Terminal eine Ausgabe angezeigt, die der folgenden ähnelt:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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 Ihren Build-Verlauf ansehen oder den Prozess in Echtzeit ansehen möchten, rufen Sie die Cloud Console auf und klicken Sie auf das Navigationsmenü ☰ > Cloud Build > Verlauf. Hier finden Sie eine Liste aller vorherigen Builds, aber nur die von Ihnen erstellten.

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

Nachdem Sie die Website nun in Container Registry übertragen haben, können Sie sie in Cloud Run bereitstellen.

Dazu haben Sie zwei Möglichkeiten:

  • Cloud Run (vollständig verwaltet) ist das PaaS-Modell, bei dem der gesamte Containerlebenszyklus verwaltet wird. Sie verwenden diesen Ansatz für dieses Codelab.
  • Cloud Run for Anthos ist Cloud Run mit einer zusätzlichen Kontrollebene, über die Sie Ihre Cluster und Pods aus GKE bereitstellen können. Weitere Informationen finden Sie unter Cloud Run for Anthos in Google Cloud einrichten.

Befehlszeilenbeispiele finden Sie in Cloud Shell mit den Umgebungsvariablen, 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 

Du wirst aufgefordert, die Region anzugeben, die du verwenden möchtest. Wählen Sie die Region aus, die Ihnen am nächsten ist. Übernehmen Sie dann den vorgeschlagenen Standarddienstnamen (monolith).

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

Deployment prüfen

Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Bereitstellung erfolgreich erstellt wurde. Es kann einen Moment dauern, bis die Pod status auf Running gesetzt 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 sowohl Ihre Bereitstellung als auch den Nutzer, der sie bereitgestellt hat (Ihre E-Mail-Adresse), sowie die URL, über die Sie auf die Anwendung zugreifen können. Sie haben offenbar alles erstellt.

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

Stellen Sie Ihre Anwendung jetzt noch einmal bereit, passen Sie diesmal einen der Parameter an.

Eine Cloud Run-Anwendung hat standardmäßig einen Wert für die Gleichzeitigkeit von 80. Das bedeutet, dass jede Containerinstanz bis zu 80 Anfragen gleichzeitig verarbeitet. Das ist ein starker Absprung vom FaaS-Modell (Function as a Service), bei dem eine Instanz nacheinander bearbeitet wird.

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

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

Beantworten Sie die folgenden Fragen wie beim ersten Mal. Nachdem der Befehl ausgeführt wurde, sehen Sie in der Cloud Console nach, ob das Ergebnis angezeigt wird.

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

Klicken Sie auf den Tab Überarbeitungen. Sie sollten zwei Überarbeitungen sehen. Klicken Sie auf monolith-00002 und prüfen Sie die Details. Der Wert für die Gleichzeitigkeit sollte auf 1 verringert sein.

]

Auch wenn diese Konfiguration für Tests ausreicht, gibt es in den meisten Produktionsszenarien Container, die mehrere gleichzeitige Anfragen unterstützen.

Jetzt die ursprüngliche Gleichzeitigkeit wiederherstellen, ohne die Bereitstellung neu durchzuführen. Sie können für den Wert der Nebenläufigkeit den Standardwert von 80 oder 0 festlegen. Dadurch werden alle Gleichzeitigkeitsbeschränkungen entfernt und der Standardgrenzwert festgelegt, der zum Zeitpunkt der Eingabe dieses Werts bei 80 liegt.

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

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

Beachten Sie, dass eine andere Überarbeitung erstellt wurde, dass der Traffic umgeleitet wurde und dass die Nebenläufigkeit wieder auf 80 festgelegt ist.

Ihr Marketingteam hat Sie gebeten, die Startseite Ihrer Unternehmenswebsite zu ändern. Sie sollte die Informationen zum Unternehmen und seinen Verkauf besser beschreiben. In diesem Abschnitt fügen Sie der Startseite Text hinzu, um das Marketingteam zufriedenzustellen.

Offenbar hat einer Ihrer Entwickler die Änderungen bereits für den Dateinamen index.js.new erstellt. Kopieren Sie die Datei einfach in index.js – Ihre Änderungen werden dann übernommen. Folgen Sie der Anleitung, um die erforderlichen Änderungen vorzunehmen.

Führen Sie folgende Befehle aus, kopieren Sie die aktualisierte Datei in den richtigen Dateinamen und drucken Sie die Inhalte aus, 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 anzulegen 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 zwar den gleichen Befehl wie zuvor verwenden, nur dieses Mal müssen Sie jedoch das Versionslabel aktualisieren.

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 Ausfallzeiten zu aktualisieren.

Die Änderungen wurden durchgeführt und das Marketingteam ist mit dem Ergebnis sehr zufrieden. Aktualisieren Sie die Website ohne Unterbrechung für die Nutzer.

Cloud Run behandelt jede Bereitstellung als neue Überarbeitung, die wieder online gestellt und dann Traffic weitergeleitet wird.

Führen Sie die nächsten Schritte aus, um Ihre Website zu aktualisieren.

Befehlszeile

Mit dem folgenden Befehl können Sie über die Befehlszeile den Dienst noch einmal bereitstellen, um das Image auf eine neue Version zu aktualisieren:

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

Deployment prüfen

Überprüfen Sie das Bereitstellungsupdate mit dem folgenden Befehl:

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

Ihr Dienst verwendet nun die neueste Version Ihres Images, die in einer neuen Überarbeitung bereitgestellt wurde.

Rufen Sie noch einmal die externe URL Ihres Cloud Run-Dienstes auf und prüfen Sie, ob 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

Jetzt sollte der Text der Website auf der Startseite der Komponente zu sehen sein.

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

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

Weitere Informationen