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 ein Tool vor, mit dem Sie all dies erreichen und sogar automatisieren können. Mit GKE ist das nicht nur möglich, sondern ganz 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 Ausfällen sind Sie damit beauftragt, Ihre Anwendung in GKE bereitzustellen.

Die Reihenfolge der Übungen entspricht der Erfahrung eines gängigen Cloud-Entwicklers:

  1. einen GKE-Cluster installieren
  2. Erstellen Sie einen Docker-Container.
  3. Stellen Sie den Container in GKE bereit.
  4. Stellen Sie den Container über einen Dienst bereit.
  5. Container auf mehrere Replikate skalieren
  6. Ändern Sie die Website.
  7. Führen Sie eine neue Version ohne Ausfallzeiten ein.

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. Wenn Sie keine Grundkenntnisse haben, lesen Sie die Informationen zu Docker und Kubernetes.

2. Umgebung einrichten

Umgebung zum selbstbestimmten Lernen einrichten

Wenn Sie noch kein Google-Konto haben, müssen Sie ein Konto 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 ein eindeutiger Name für alle Google Cloud-Projekte ist. Der oben angegebene Name ist bereits vergeben und funktioniert leider nicht für Sie. 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 verwenden zu können. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion mit 300$Guthaben. Wenn Sie kein neuer Nutzer sind, müssen Sie sich keine Sorgen machen, denn das Codelab sollte nicht mehr als ein paar Euro kosten. Das Codelab kann jedoch höhere Kosten kosten, wenn Sie mehr Ressourcen verwenden oder sie weiter ausführen (siehe Abschnitt „Bereinigen“ am Ende). Weitere Informationen finden Sie unter Preise.

Cloud Shell

Sie können Google Cloud und GKE mit Ihrem Laptop aus der Ferne bedienen. Für das Codelab verwenden Sie jedoch Cloud Shell – eine in der Cloud ausgeführte Befehlszeilenumgebung.

Diese Debian-basierte virtuelle Maschine verfügt über alle erforderlichen Entwicklungstools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Für dieses Codelab benötigen Sie also nur einen Browser – ja, er funktioniert auf Chromebooks.

  1. Klicken Sie einfach auf Cloud Shell aktivieren fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q, um Cloud Shell über die Cloud Console zu aktivieren. Die Bereitstellung und Verbindung mit der Umgebung dauert einen Moment.

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 dass das Projekt bereits auf Ihre PROJECT_ID eingestellt ist.

gcloud auth list

Befehlsausgabe

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

Befehlsausgabe

[core]
project = <PROJECT_ID>

Sollte das Projekt aus irgendeinem Grund nicht eingerichtet sein, geben Sie einfach den folgenden Befehl ein:

gcloud config set project <PROJECT_ID>

Du suchst dein Gerät (PROJECT_ID)? Sehen Sie nach, welche ID Sie bei den Einrichtungsschritten verwendet haben, oder rufen Sie sie im Dashboard der Cloud Console auf:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

Befehlsausgabe

<PROJECT_ID>
  1. Legen Sie schließlich 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

Da Sie nun über Ihre funktionierende Entwicklungsumgebung verfügen, benötigen Sie einen GKE-Cluster, in dem Sie Ihre Website bereitstellen können. Bevor Sie einen Cluster erstellen, müssen Sie prüfen, ob die richtigen APIs aktiviert sind. Führen Sie den folgenden Befehl aus, um die Container 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 sich die drei Worker-VM-Instanzen des Clusters anzeigen zu lassen:

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 ansehen. Klicken Sie links oben auf die Menüschaltfläche, 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 es sich um eine vorhandene Website handelt, müssen Sie nur die Quelle aus dem Repository klonen, damit Sie sich auf die Erstellung von Docker-Images und die Bereitstellung in GKE konzentrieren können.

Führen Sie die folgenden Befehle aus, um das Quell-Repository in Ihre Cloud Shell-Instanz zu klonen und in das entsprechende Verzeichnis zu ändern. Außerdem installieren Sie die Node.js-Abhängigkeiten, damit Sie Ihre 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 das Repository geklont, das Verzeichnis geändert und die Abhängigkeiten installiert, die für die lokale Ausführung Ihrer Anwendung erforderlich sind. Es kann einige Minuten dauern, bis das Skript ausgeführt wird.

Gehen Sie mit der Due-Diligence-Prüfung vor 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 anzeigen lassen, 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 Ihren Fancy Store in Aktion sehen können.

9ed25c3f0cbe62fa.png

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

5. Docker-Container mit Cloud Build erstellen

Da Ihre Quelldateien nun bereit sind, können Sie Ihre Anwendung in den Docker-Container einbinden.

Normalerweise müssten Sie einen zweistufigen Ansatz verfolgen, bei dem ein Docker-Container erstellt und in eine Registry übertragen wird, um das von GKE abgerufene Image zu speichern. Sie können das Leben jedoch einfacher gestalten, wenn Sie mit Cloud Build mit einem einzigen Befehl den Docker-Container erstellen und das Image in Container Registry ablegen. Wie Sie ein Dockerfile manuell erstellen und übertragen, erfahren Sie unter Schnellstart für Container Registry.

Cloud Build komprimiert die Dateien aus dem Verzeichnis und verschiebt sie in einen Cloud Storage-Bucket. Beim Build-Prozess werden die Dateien aus dem Bucket abgerufen und mit dem Dockerfile der Docker-Build-Prozess ausgeführt. Da Sie das Flag --tag mit dem Host als gcr.io für das Docker-Image angegeben haben, wird das resultierende Docker-Image in Container Registry übertragen.

Zuerst müssen Sie die Cloud Build API aktivieren, indem Sie den folgenden Befehl ausführen:

gcloud services enable cloudbuild.googleapis.com

Führen Sie nach der Aktivierung der API den folgenden Befehl in Cloud Shell aus, 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. Nachdem er abgeschlossen ist, wird im Terminal die folgende Ausgabe angezeigt:

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

In der Cloud Console können Sie Ihren Build-Verlauf ansehen oder den Prozess in Echtzeit verfolgen. Klicken Sie links oben auf die Menüschaltfläche, scrollen Sie nach unten zu „Ci/CD“, klicken Sie auf „Cloud Build“ und schließlich auf „Verlauf“. Dort sehen Sie eine Liste Ihrer vorherigen Builds, es sollte jedoch nur derjenige vorhanden sein, den Sie erstellt haben.

4c753ede203255f6.png

Wenn Sie auf die Build-ID klicken, sehen Sie alle Details für diesen Build, einschließlich der Logausgabe.

Auf der Seite mit den Build-Details können Sie das erstellte Container-Image aufrufen. Klicken Sie dazu im Abschnitt mit den 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 Container Registry übertragen haben, können Sie ihn in Kubernetes bereitstellen.

Zum Bereitstellen und Verwalten von Anwendungen in einem GKE-Cluster müssen Sie mit dem Kubernetes-Clusterverwaltungssystem kommunizieren. In der Regel verwenden Sie dazu das kubectl-Befehlszeilentool.

Kubernetes stellt Anwendungen als Pods dar, also 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 der Anwendung müssen Sie ein Deployment erstellen. Ein Deployment verwaltet mehrere Kopien Ihrer Anwendung, sogenannte Replikate, und plant deren Ausführung auf den einzelnen Knoten im Cluster. In diesem Fall führt das Deployment nur einen Pod Ihrer Anwendung aus. Um das zu gewährleisten, erstellen Deployments ein ReplicaSet. Das ReplicaSet stellt sicher, dass die Anzahl der angegebenen Replikate immer ausgeführt werden.

Der Befehl kubectl create deployment bewirkt, dass Kubernetes ein Deployment namens monolith in Ihrem Cluster mit 1 Replikat erstellt.

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

Prüfen Sie mit dem folgenden Befehl, ob das Deployment erfolgreich erstellt wurde. Es kann einen Moment dauern, bis der Pod-Status „Wird ausgeführt“ 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 Ihnen verschiedene Dinge. Sie können Ihr Deployment sehen, das aktuell ist. Ihr ReplicaSet mit einer gewünschten Pod-Anzahl von eins und den laufenden Pod. Sie haben alle Dateien erfolgreich erstellt.

Mit den folgenden Befehlen können Sie 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

Um alle Vorteile von Kubernetes zu nutzen, können Sie einen Serverabsturz simulieren, den Pod löschen und abwarten, was passiert.

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

kubectl delete pod/<POD_NAME>

Wenn Sie schnell genug sind, können Sie den vorherigen Befehl ausführen, um alle noch einmal zu sehen. Es sollten dann zwei Pods angezeigt werden, einer wird beendet und der andere wird erstellt oder ausgeführt:

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 erfahren Sie, wie Sie mithilfe von Skalierung sicherstellen, dass mehrere Instanzen ausgeführt werden, damit bei einem Ausfall einer Instanz keine Ausfallzeiten für Ihre Nutzer auftreten.

7. GKE-Deployment freigeben

Sie haben Ihre Anwendung in GKE bereitgestellt, haben jedoch keine Möglichkeit, außerhalb des Clusters darauf 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 über eine 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 die Anwendung.

Führen Sie den folgenden Befehl aus, um Ihre Website im Internet zu veröffentlichen:

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 die Anwendung bereitgestellt hat, können Sie den Dienst mit dem Befehl „kubectl get service“ überprü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

Nachdem Sie die externe IP-Adresse für Ihre Anwendung ermittelt haben, kopieren Sie sie. Rufen Sie diese URL in Ihrem Browser auf (z. B. http://203.0.113.0), um zu prüfen, ob Ihre Anwendung zugänglich ist.

9ed25c3f0cbe62fa.png

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

8. GKE-Deployment skalieren

Da Sie nun eine laufende Instanz Ihrer Anwendung in GKE haben und im Internet verfügbar gemacht haben, ist Ihre Website sehr beliebt. Sie benötigen eine Möglichkeit, Ihre Anwendung auf mehrere Instanzen zu skalieren, damit Sie den Traffic verarbeiten können. Hier erfahren Sie, wie Sie Ihre Anwendung auf bis zu drei Replikate skalieren.

Führen Sie den folgenden Befehl aus, um Ihre Bereitstellung auf bis zu 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 das Deployment erfolgreich skaliert wurde:

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 drei Instanzen Ihres Pods sehen. Beachten Sie außerdem, 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. Es sollte informativer sein, indem er erklärt, was Ihr Unternehmen ist und was Sie tatsächlich verkaufen. In diesem Abschnitt fügen Sie der Startseite Text hinzu, um die Zufriedenheit des Marketingteams zu steigern. Offenbar hat einer unserer Entwickler die Änderungen bereits unter dem Dateinamen index.js.new erstellt. Sie können die Datei zu index.js kopieren. Ihre Änderungen sollten dann übernommen werden. Gehen Sie wie unten beschrieben vor, um die entsprechenden Änderungen vorzunehmen.

Führen Sie die folgenden Befehle aus, kopieren Sie die aktualisierte Datei an den richtigen Dateinamen und geben Sie den Inhalt 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 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 denselben Befehl wie zuvor verwenden, aber dieses Mal müssen Sie 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 .

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

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

10. Website ohne Ausfallzeit aktualisieren

Die Änderungen wurden durchgeführt und das Marketingteam ist mit dem Ergebnis sehr zufrieden. Es ist an der Zeit, die Website ohne Unterbrechung für die Nutzer zu aktualisieren. Gehen Sie wie unten beschrieben vor, um Ihre Website zu aktualisieren.

Die Rolling Updates von GKE sorgen dafür, dass Ihre Anwendung auch dann verfügbar bleibt, wenn das System bei allen ausgeführten Replikaten die Instanzen des alten Container-Images durch das neue Image ersetzt.

Mit dem folgenden Befehl können Sie Kubernetes über die Befehlszeile mitteilen, dass Sie das Image für Ihr Deployment auf eine neue Version aktualisieren möchten:

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

Ausgabe:

deployment.apps/monolith image updated

Deployment prüfen

Mit dem folgenden Befehl können Sie die Aktualisierung Ihres Deployments validieren:

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 heruntergefahren werden. Sie können anhand des Alters feststellen, welche neu und welche alt sind. Schließlich sehen Sie nur noch drei Pods, also Ihre drei aktualisierten Pods.

Um Ihre Änderungen zu prüfen, rufen Sie noch einmal die externe IP-Adresse des Load-Balancers auf und sehen Sie an, dass Ihre Anwendung 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

Ihre Website sollte den Text enthalten, den Sie der Startseitenkomponente 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 auch zum Löschen dieser Images verwenden. 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 Ihre 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: Dieser Befehl 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