Website mit der Google Kubernetes Engine (GKE) bereitstellen, skalieren und aktualisieren

1. Einführung

Das Betreiben von Websites und Anwendungen ist nicht leicht.

Es läuft nicht immer alles nach Plan, Server stürzen ab, Bedarfsspitzen treiben den Ressourcenverbrauch in die Höhe und die Implementierung von Änderungen ohne Ausfallzeit ist kompliziert und stressig.

Stellen Sie sich vor, es gäbe ein Tool, mit dem Sie all das erledigen oder sogar automatisieren könnten. Mit GKE ist dies nicht nur möglich, sondern einfach! In diesem Codelab übernehmen Sie die Rolle eines Entwicklers, der eine E-Commerce-Website für das fiktive Unternehmen Fancy Store betreibt. Aufgrund von Skalierungsproblemen und häufigen Ausfällen wurden Sie beauftragt, Ihre Anwendung in GKE bereitzustellen.

Die Reihenfolge der Übungen orientiert sich am üblichen Vorgehen bei der Cloud-Entwicklung:

  1. GKE-Cluster erstellen
  2. Erstellen Sie einen Docker-Container.
  3. Stellen Sie den Container in GKE bereit.
  4. Geben Sie den Container über einen Dienst frei.
  5. Container auf mehrere Replikate skalieren.
  6. Ändern Sie die Website.
  7. Neue Version ohne Ausfallzeit einführen

Architekturdiagramm

ddba666bd2b02d0d.png

Lerninhalte

  • GKE-Cluster erstellen
  • Docker-Image erstellen
  • Bereitstellen von Docker-Images in Kubernetes
  • Skalieren einer Anwendung in Kubernetes
  • Ausführen von Rolling Updates in Kubernetes

Vorbereitung

  • Ein Google-Konto mit Administratorzugriff zum Erstellen von Projekten oder ein Projekt mit der Rolle „Projektinhaber“
  • Grundlegende Kenntnisse von Docker und Kubernetes (Falls Sie keine grundlegenden Kenntnisse haben, lesen Sie jetzt die Dokumentation zu Docker und Kubernetes.)

2. Umgebung einrichten

Umgebung zum selbstbestimmten Lernen einrichten

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

53dad2cefdae71da.png

Screenshot vom 10.02.2016, 12:45:26.png

Denken Sie daran, dass die Projekt-ID für alle Google Cloud-Projekte ein eindeutiger Name ist. Der Name oben ist 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 verwenden zu können. Neuen Nutzern von Google Cloud steht eine kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung. Wenn Sie kein neuer Nutzer sind, müssen Sie sich keine Sorgen machen, da das Codelab Sie nicht mehr als ein paar Dollar kosten sollte. Das Codelab könnte Sie jedoch mehr kosten, wenn Sie mehr Ressourcen verwenden oder sie weiter laufen lassen (siehe Abschnitt „Bereinigen“ am Ende). Weitere Informationen finden Sie unter Preise.

Cloud Shell

Sie können Google Cloud und GKE zwar von Ihrem Laptop aus per Fernzugriff nutzen, für das Codelab verwenden Sie jedoch Cloud Shell, eine Befehlszeilenumgebung, die in der 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.

3. GKE-Cluster erstellen

Sie haben nun eine funktionsfähige Entwicklungsumgebung. Jetzt benötigen Sie noch einen GKE-Cluster, um darin Ihre Website bereitzustellen. Bevor Sie einen Cluster erstellen, müssen Sie dafür sorgen, dass die richtigen APIs aktiviert sind. Führen Sie den folgenden Befehl aus, um die Containers API zu aktivieren:

gcloud services enable container.googleapis.com

Jetzt können Sie Ihren Cluster erstellen. Führen Sie die folgenden Schritte aus, um einen Cluster namens fancy-cluster mit 3 Knoten zu erstellen:

gcloud container clusters create fancy-cluster --num-nodes 3

Es kann einige Minuten dauern, bis der Cluster erstellt ist. Führen Sie anschließend den folgenden Befehl aus, um die drei Worker-VM-Instanzen des Clusters aufzurufen:

gcloud compute instances list

Ausgabe:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

Sie können Ihren Cluster und die zugehörigen Informationen auch in der Cloud Console aufrufen. Klicken Sie links oben auf das Menü, scrollen Sie nach unten zu Kubernetes Engine und klicken Sie auf „Cluster“. Es sollte der Cluster fancy-cluster zu sehen sein.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

Glückwunsch! Sie haben Ihren ersten Cluster erstellt.

4. Quell-Repository klonen

Da die Website bereits vorhanden ist, müssen Sie nur die Quelle aus dem Repository klonen. Der Schwerpunkt der Aufgabe liegt darauf, Docker-Images zu erstellen und in GKE bereitzustellen.

Führen Sie die folgenden Befehle aus, um das Quell-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 Anwendung testen können, bevor sie bereitgestellt wird.

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

Dadurch wird das Repository geklont, das Verzeichnis geändert und die Abhängigkeiten installiert, die zum lokalen Ausführen der Anwendung erforderlich sind. Die Ausführung des Skripts kann einige Minuten dauern.

Führen Sie eine sorgfältige Prüfung durch und testen Sie Ihre 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 Anwendung aufrufen, indem Sie im Cloud Shell-Menü auf das Symbol für die Webvorschau klicken und „Vorschau auf Port 8080“ auswählen.

5869738f0e9ec386.png

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

9ed25c3f0cbe62fa.png

Sie können das Fenster schließen, nachdem Sie sich die Website angesehen haben. Drücken Sie im Terminalfenster Control+C (Windows oder Mac), um den Webserverprozess zu beenden.

5. 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 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 übertragen. 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 Erstellen werden dann alle Dateien aus dem Bucket abgerufen und mit dem Dockerfile wird der Docker-Build-Prozess ausgeführt. 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 den 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:

cd ~/monolith-to-microservices/monolith
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

Um den Build-Verlauf aufzurufen oder den Prozess in Echtzeit zu verfolgen, können Sie die Cloud Console aufrufen. Klicken Sie links oben auf die Menüschaltfläche, scrollen Sie zu „CI/CD“, klicken Sie auf „Cloud Build“ und dann auf „Verlauf“. Dort sehen Sie eine Liste Ihrer bisherigen Builds. 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, inklusive der Logausgabe.

Auf der Seite „Build-Details“ können Sie das erstellte Container-Image aufrufen. Klicken Sie dazu im Abschnitt „Build-Informationen“ auf den Image-Namen.

6e88ed1643dfe629.png

6. Container in GKE bereitstellen

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

Für das Deployment und die Verwaltung von Anwendungen in einem GKE-Cluster müssen Sie mit dem Kubernetes-Clusterverwaltungssystem kommunizieren. In der Regel verwenden Sie dafür das kubectl-Befehlszeilentool.

Kubernetes stellt Anwendungen als Pods dar. Dies sind Einheiten, die einen Container (oder eine Gruppe eng gekoppelter Container) darstellen. Der Pod ist die kleinste bereitstellbare Einheit in Kubernetes. Hier enthält jeder Pod nur Ihren monolithischen Container.

Zum Bereitstellen Ihrer Anwendung müssen Sie eine Deployment erstellen. Ein Deployment verwaltet mehrere Kopien Ihrer Anwendung, sogenannte Replikate, und plant deren Ausführung auf den einzelnen Knoten in Ihrem Cluster. In diesem Fall wird mit dem Deployment nur ein einziger Pod Ihrer Anwendung ausgeführt. Dazu erstellen Deployments ein ReplicaSet. Das ReplicaSet sorgt dafür, dass immer die vorgegebene Anzahl von Replikaten ausgeführt wird.

Der Befehl kubectl create deployment weist Kubernetes an, in Ihrem Cluster das Deployment monolith mit einem Replikat zu erstellen.

Führen Sie den folgenden Befehl aus, um die Anwendung bereitzustellen:

kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0

Deployment prüfen

Um zu prüfen, ob das Deployment erstellt wurde, führen Sie folgenden Befehl aus. Es kann einige Momente dauern, bis der Pod-Status „Running“ lautet:

kubectl get all

Ausgabe:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-htm7z   1/1     Running   0          6m21s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           20m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       20m

Diese Ausgabe zeigt Folgendes: Sie sehen hier Ihr Deployment als aktuelles Deployment, Ihr ReplicaSet mit der gewünschten Anzahl von einem Pod und den ausgeführten Pod. Sie haben offenbar alles erfolgreich erstellt.

Mit den folgenden Befehlen können Sie sich Ihre Ressourcen einzeln ansehen:

# Show pods
kubectl get pods

# Show deployments
kubectl get deployments

# Show replica sets
kubectl get rs

#You can also combine them
kubectl get pods,deployments

Der volle Nutzen von Kubernetes wird deutlich, wenn Sie einen Pod löschen, um einen Serverabsturz zu simulieren. Probieren Sie es aus!

Kopieren Sie den Namen Ihres Pods aus dem vorherigen Befehl und führen Sie den folgenden Befehl aus, um ihn zu löschen:

kubectl delete pod/<POD_NAME>

Falls die Zeit ausreicht, können Sie den vorherigen Befehl noch einmal ausführen. Sie sollten zwei Pods sehen: einen mit dem Status „Wird beendet“ und einen anderen, der erstellt oder ausgeführt wird:

kubectl get all

Ausgabe:

NAME                            READY   STATUS        RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running       0          4s
pod/monolith-7d8bc7bf68-htm7z   1/1     Terminating   0          9m35s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           24m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       24m

Woran liegt das? Das ReplicaSet hat erkannt, dass der Pod beendet wurde, und hat die Erstellung eines neuen Pods ausgelöst, damit weiterhin die gewünschte Anzahl von Replikaten vorhanden ist. Später werden Sie sehen, wie Sie das Deployment horizontal skalieren können, sodass bei Ausfall einer Instanz keine Unterbrechung für die Nutzer entsteht.

7. GKE-Deployment freigeben

Sie haben Ihre Anwendung in GKE bereitgestellt, es gibt aber keine Möglichkeit, darauf außerhalb des Clusters zuzugreifen. Standardmäßig sind die Container, die Sie in GKE ausführen, nicht über das Internet zugänglich, da sie keine externen IP-Adressen haben. Sie müssen die Anwendung mit einer Dienstressource explizit für Traffic aus dem Internet freigeben. Ein Dienst bietet Netzwerk- und IP-Unterstützung für die Pods Ihrer Anwendung. GKE erstellt eine externe IP-Adresse und einen (kostenpflichtigen) Load-Balancer für Ihre App.

Führen Sie den folgenden Befehl aus, um die Website für das Internet freizugeben:

kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080

Ausgabe:

service/monolith exposed

Auf den Dienst zugreifen

GKE weist die externe IP-Adresse der Dienstressource zu, nicht dem Deployment. Wenn Sie die externe IP-Adresse ermitteln möchten, die GKE für Ihre Anwendung bereitgestellt hat, können Sie den Dienst mit dem Befehl „kubectl get service“ prüfen:

kubectl get service

Ausgabe:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

Kopieren Sie die externe IP-Adresse Ihrer App. Rufen Sie die jeweilige URL (z. B. http://203.0.113.0) in Ihrem Browser auf, um zu prüfen, ob Ihre App abrufbar ist.

9ed25c3f0cbe62fa.png

Sie sollten dieselbe Website sehen, die Sie bereits getestet haben. Glückwunsch! Ihre Website wird jetzt vollständig in Kubernetes ausgeführt.

8. GKE-Deployment skalieren

Ihre Anwendung wird jetzt in GKE ausgeführt und kann über das Internet aufgerufen werden. Wir gehen davon aus, dass Ihre Website sehr beliebt ist. Damit der hohe Traffic verarbeitet werden kann, müssen Sie die Anwendung also auf mehrere Instanzen skalieren. Hier erfahren Sie, wie Sie Ihre Anwendung auf bis zu drei Replikate skalieren.

Führen Sie den folgenden Befehl aus, um das Deployment auf drei Replikate zu skalieren:

kubectl scale deployment monolith --replicas=3

Ausgabe:

deployment.apps/monolith scaled

Skalierte Bereitstellung prüfen

Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Umsetzung erfolgreich war:

kubectl get all

Ausgabe:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running   0          36m
pod/monolith-7d8bc7bf68-7ds7q   1/1     Running   0          45s
pod/monolith-7d8bc7bf68-c5kxk   1/1     Running   0          45s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.27.240.1    <none>         443/TCP        25h
service/monolith     LoadBalancer   10.27.253.64   XX.XX.XX.XX   80:32050/TCP   6m7s

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   3         3         3            3           61m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   3         3         3       61m

Sie sollten jetzt drei Instanzen Ihres Pods mit dem Status „Running“ sehen. Beachten Sie auch, dass Ihr Deployment und ReplicaSet jetzt eine gewünschte Anzahl von drei haben.

9. Website ändern

Ihr Marketingteam hat Sie gebeten, die Startseite Ihrer Website 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 unserer Entwickler die Änderungen bereits unter dem Dateinamen index.js.new erstellt. Sie können die Datei nach index.js kopieren. Die Änderungen sollten dann zu sehen sein. Gehen Sie wie unten beschrieben vor, 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 .

Drücken Sie im Terminalfenster Control+C (Windows oder Mac), um den Webserverprozess zu beenden.

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

10. 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. Gehen Sie wie unten beschrieben vor, um Ihre Website zu aktualisieren.

Der Rolling-Update-Mechanismus von GKE sorgt dafür, dass die Anwendung jederzeit verfügbar ist, auch wenn das System die Instanzen des alten Container-Images bei allen ausgeführten Replikaten durch das neue Image ersetzt.

In der Befehlszeile können Sie Kubernetes mit dem folgenden Befehl anweisen, das Image Ihres Deployments auf eine neue Version zu aktualisieren:

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

Ausgabe:

deployment.apps/monolith image updated

Deployment prüfen

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

kubectl get pods

Ausgabe:

NAME                        READY   STATUS              RESTARTS   AGE
monolith-584fbc994b-4hj68   1/1     Terminating         0          60m
monolith-584fbc994b-fpwdw   1/1     Running             0          60m
monolith-584fbc994b-xsk8s   1/1     Terminating         0          60m
monolith-75f4cf58d5-24cq8   1/1     Running             0          3s
monolith-75f4cf58d5-rfj8r   1/1     Running             0          5s
monolith-75f4cf58d5-xm44v   0/1     ContainerCreating   0          1s

Sie sehen, dass drei neue Pods erstellt und die alten Pods beendet werden. Anhand der AGE-Werte können Sie die neuen von den alten Pods unterscheiden. Am Ende sehen Sie nur noch die drei aktualisierten Pods.

Um die Änderungen zu prüfen, rufen Sie noch einmal die externe IP-Adresse des Load Balancers auf. Sie sehen dann, dass Ihre App aktualisiert wurde.

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

kubectl get svc

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

8006c9938dbd5aa5.png

11. Bereinigen

Git-Repository löschen

cd ~
rm -rf monolith-to-microservices

Container Registry-Images löschen

HINWEIS: Wenn Sie andere Versionen erstellt haben, können Sie dieselbe Syntax verwenden, um auch diese Bilder zu löschen. In diesem Codelab wird davon ausgegangen, dass Sie nur zwei Tags haben.

# 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

HINWEIS: Wenn Sie Cloud Build für andere Artefakte als dieses Codelab verwendet haben, müssen Sie die Quelle manuell aus dem Cloud Storage-Bucket gs://<PROJECT_ID>_cloudbuild/source 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

GKE-Dienst löschen

kubectl delete service monolith
kubectl delete deployment monolith

GKE-Cluster löschen

gcloud container clusters delete fancy-cluster

HINWEIS: Die Ausführung dieses Befehls kann eine Weile dauern.

12. Glückwunsch!

Sie haben Ihre Website in GKE bereitgestellt, skaliert und aktualisiert. Sie sind jetzt mit Docker und Kubernetes vertraut.

Zusätzliche Ressourcen