Spring-Boot-Java-Anwendung auf Kubernetes in Google Kubernetes Engine bereitstellen
Informationen zu diesem Codelab
1. Hinweis
Kubernetes ist ein Open-Source-Projekt, das in vielen verschiedenen Umgebungen ausgeführt werden kann – von Laptops bis hin zu hochverfügbaren Clustern mit mehreren Knoten, von öffentlichen Clouds bis zu lokalen Bereitstellungen und von VM-Instanzen bis hin zu Bare-Metal-Servern.
In diesem Codelab stellen Sie eine einfache Spring-Boot-Java-Webanwendung auf Kubernetes in GKE bereit. Das Ziel ist, dass Ihre Webanwendung als replizierte Anwendung auf Kubernetes ausgeführt wird. Sie nehmen Code, den Sie auf Ihrem Computer entwickeln, in ein Docker-Container-Image um und führen das Image in GKE aus.
Sie verwenden GKE, einen vollständig verwalteten Kubernetes-Dienst in Google Cloud, damit Sie sich auf die Nutzung von Kubernetes konzentrieren können, anstatt die zugrunde liegende Infrastruktur einzurichten.
Wenn Sie Kubernetes auf Ihrem lokalen Computer, z. B. einem Entwicklungslaptop, ausführen möchten, sehen Sie sich Minikube an. Hier wird die einfache Einrichtung eines Kubernetes-Clusters mit einem einzelnen Knoten zu Entwicklungszwecken und Tests angeboten. Wenn Sie möchten, können Sie Minikube verwenden.
Im Codelab wird der Beispielcode aus der Anleitung Anwendung mit Spring Boot verwenden verwendet.
Voraussetzungen
- Kenntnisse in der Programmiersprache Java und in Tools
- Kenntnisse in standardmäßigen Linux-Texteditoren wie Vim, Emacs und nano
Aufgabe
- Eine einfache Java-Anwendung als Docker-Container verpacken.
- Kubernetes-Cluster in GKE erstellen
- Java-Anwendung in Kubernetes on GKE bereitstellen
- Skalieren Sie Ihren Dienst und führen Sie ein Upgrade aus.
- Dashboard aufrufen, eine webbasierte Kubernetes-Benutzeroberfläche.
Voraussetzungen
- Ein Google Cloud-Projekt
- Ein Browser, z. B. Google Chrome
2. Einrichtung und Anforderungen
Umgebung im eigenen Tempo einrichten
- Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie eins erstellen.
Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. In diesem Codelab wird sie später als PROJECT_ID
bezeichnet.
- Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen zu nutzen.
Das Durcharbeiten dieses Codelabs sollte nicht mehr als ein paar Euro kosten. Es kann aber auch sein, dass du mehr Ressourcen benötigst oder wenn du sie nicht mehr nutzen möchtest.
Neuen Google Cloud-Nutzern steht ein kostenloser Testzeitraum im Wert von 300$ zur Verfügung.
Cloud Shell aktivieren
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren
.
Wenn Sie Cloud Shell noch nie gestartet haben, sehen Sie einen Zwischenbildschirm („Below the fold“ (mit Scrollen sichtbar) mit einer Beschreibung, worum es sich dabei handelt. Klicken Sie in diesem Fall auf Weiter. In diesem Fall wird es nicht wieder angezeigt. So sieht der einmalige Bildschirm aus:
Die Bereitstellung und Verbindung mit Cloud Shell dauert nur wenige Minuten.
Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Es bietet ein 5-GB-Basisverzeichnis und wird in Google Cloud ausgeführt, was die Netzwerkleistung und Authentifizierung erheblich verbessert. In diesem Codelab lassen sich viele oder sogar alle Aufgaben ganz einfach über einen Browser oder Ihr Chromebook erledigen.
Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt bereits auf Ihre Projekt-ID festgelegt ist.
- Führen Sie in Cloud Shell den folgenden Befehl aus, um zu bestätigen, dass Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
Befehlsausgabe
[core] project = <PROJECT_ID>
Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:
gcloud config set project <PROJECT_ID>
Befehlsausgabe
Updated property [core/project].
3. Quellcode abrufen
Nach dem Start von Cloud Shell können Sie den Beispielcode im Basisverzeichnis über die Befehlszeile klonen.
$ git clone https://github.com/spring-guides/gs-spring-boot.git $ cd gs-spring-boot/complete
4. App lokal ausführen
- Du kannst die Spring Boot App ganz normal mit dem Spring Boot-Plug-in starten.
$ ./mvnw -DskipTests spring-boot:run
- Klicken Sie nach dem Start der App in der Cloud Shell-Symbolleiste auf Webvorschau
und wählen Sie Vorschau auf Port 8080 aus.
Im Browser wird ein Tab geöffnet und eine Verbindung zum soeben gestarteten Server hergestellt.
5. Java-Anwendung als Docker-Container verpacken
Als Nächstes müssen Sie Ihre Anwendung so vorbereiten, dass sie auf Kubernetes ausgeführt werden kann. Dazu legen Sie zuerst den Container und seine Inhalte fest.
- Erstellen Sie die JAR-Datei für die Anwendung.
$ ./mvnw -DskipTests package
- Aktivieren Sie Container Registry, um das zu erstellende Container-Image zu speichern.
$ gcloud services enable containerregistry.googleapis.com
- Sie erstellen mit Jib das Container-Image und verschieben es in die Container Registry.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- Wenn alles funktioniert, sehen Sie das Container-Image in der Konsole, indem Sie zu Container Registry > Images gehen. Sie haben jetzt ein projektweites Docker-Image, auf das Kubernetes zugreifen kann. Wie Sie in wenigen Minuten sehen, steht Kubernetes zur Verfügung.
- Wenn der Vorgang abgeschlossen ist (es dauert etwas, bis Sie alles heruntergeladen und extrahiert haben), können Sie das Image mit dem folgenden Befehl lokal testen. Damit wird ein Docker-Container als Daemon auf Port 8080 aus dem neu erstellten Container-Image ausgeführt:
$ docker run -ti --rm -p 8080:8080 \ gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- Nutzen Sie wieder die Webvorschaufunktion von Cloud Shell.
- Sie sollten die Standardseite in einem neuen Tab sehen. Nachdem Sie bestätigt haben, dass die Anwendung lokal in einem Docker-Container ausgeführt wird, können Sie den ausgeführten Container durch Drücken von
Control+C
beenden.
6. Cluster erstellen
Sie können Ihren GKE-Cluster jetzt erstellen. Ein Cluster besteht aus einem Kubernetes API-Server, der von Google verwaltet wird, und aus einer Reihe von Worker-Knoten. Die Worker-Knoten sind Compute Engine-VMs.
- Überprüfen Sie zuerst, ob die zugehörigen API-Funktionen aktiviert sind.
$ gcloud services enable compute.googleapis.com container.googleapis.com Operation "operations/..." finished successfully
- Erstellen Sie einen Cluster mit zwei
n1-standard-1
-Knoten. Dies dauert einige Minuten.
$ gcloud container clusters create hello-java-cluster \ --num-nodes 2 \ --machine-type n1-standard-1 \ --zone us-central1-c
Am Ende sollten Sie den erstellten Cluster sehen.
Creating cluster hello-java-cluster...done. Created [https://container.googleapis.com/v1/projects/...]. kubeconfig entry generated for hello-dotnet-cluster. NAME ZONE MASTER_VERSION hello-java-cluster us-central1-c ...
Sie sollten jetzt einen voll funktionsfähigen Kubernetes-Cluster mit GKE haben.
Jetzt können Sie Ihre containerisierte Anwendung im Kubernetes-Cluster bereitstellen. Ab jetzt verwenden Sie die Befehlszeile kubectl
(bereits in Ihrer Cloud Shell-Umgebung eingerichtet). Für den Rest des Codelabs müssen der Kubernetes-Client und die Serverversion mindestens 1.2 sein. kubectl version
zeigt die aktuelle Version des Befehls an.
7. Ihre Anwendung auf Kubernetes bereitstellen
- Bei einem Kubernetes-Deployment können mehrere Instanzen Ihrer Anwendung mit dem von Ihnen erstellten Container-Image erstellt, verwaltet und skaliert werden. Stellen Sie eine Instanz Ihrer Anwendung mit dem Befehl
kubectl run
in Kubernetes bereit.
$ kubectl create deployment hello-java \ --image=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- Führen Sie den folgenden Befehl aus, um die von Ihnen erstellte Bereitstellung aufzurufen:
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 1 1 1 1 37s
- Führen Sie den folgenden Befehl aus, um die durch das Deployment erstellten Anwendungsinstanzen anzusehen:
$ kubectl get pods NAME READY STATUS RESTARTS AGE hello-java-714049816-ztzrb 1/1 Running 0 57s
Der Container sollte aktuell unter Kubernetes verwaltet werden, Sie müssen ihn aber auch für die Außenwelt zugänglich machen.
8. Externen Traffic zulassen
Standardmäßig ist der Pod nur über seine interne IP-Adresse im Cluster zugänglich. Damit der hello-java
-Container von außerhalb des Kubernetes-Netzwerks zugänglich ist, muss der Pod als Kubernetes-Dienst verfügbar gemacht werden.
- In Cloud Shell können Sie den Pod mit dem Befehl
kubectl expose
und dem Flag--type=LoadBalancer
dem öffentlichen Internet zugänglich machen. Dieses Flag ist für die Erstellung einer extern zugänglichen IP-Adresse erforderlich.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
Das im Befehl verwendete Flag gibt an, dass Sie den Load-Balancer verwenden, der von der zugrunde liegenden Infrastruktur bereitgestellt wird. Beachten Sie, dass Sie das Deployment direkt bereitstellen, nicht den Pod. Dies führt dazu, dass der entsprechende Dienst den Traffic auf allen von der Bereitstellung verwalteten Pods auslastet (in diesem Fall nur ein Pod, später werden jedoch weitere Replikate hinzugefügt).
Der Kubernetes-Master erstellt den Load-Balancer und die zugehörigen Compute Engine-Weiterleitungsregeln, Zielpools und Firewallregeln, um den Dienst vollständig von außerhalb von Google Cloud zugänglich zu machen.
- Wenn Sie die öffentlich zugängliche IP-Adresse des Dienstes ermitteln möchten, fordern Sie einfach
kubectl
an, um alle Clusterdienste aufzulisten.
$ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE Hello-java 10.3.253.62 aaa.bbb.ccc.ddd 8080/TCP 1m kubernetes 10.3.240.1 <none> 443/TCP 5m
- Für Ihren Dienst werden zwei IP-Adressen angegeben, die beide Port 8080 bereitstellen. Dies ist die interne IP-Adresse, die nur in Ihrer Virtual Private Cloud sichtbar ist. Die andere ist die externe IP-Adresse mit Load-Balancing. Im Beispiel lautet die externe IP-Adresse
aaa.bbb.ccc.ddd
. Sie sollten den Dienst jetzt erreichen, indem Sie Ihren Browser auf http://<EXTERNAL_IP>:8080 verweisen.
9. Dienste skalieren
Eine der leistungsstarken Funktionen von Kubernetes ist die einfache Skalierung Ihrer Anwendung. Angenommen, Sie benötigen plötzlich eine größere Kapazität für Ihre Anwendung. Sie können einfach den Replikations-Controller anweisen, eine neue Anzahl von Replikaten für Ihre Anwendungsinstanzen zu verwalten.
$ kubectl scale deployment hello-java --replicas=3 deployment "hello-java" scaled $ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 3 3 3 3 22m
Beachten Sie die deklarative Herangehensweise. Anstatt neue Instanzen zu starten oder anzuhalten, deklarieren Sie, wie viele Instanzen zu jeder Zeit ausgeführt werden sollen. Beim Abgleich von Kubernetes-Abgleichsschleifen wird lediglich sichergestellt, dass die Realität Ihren Anforderungen entspricht und bei Bedarf Maßnahmen ergriffen werden.
10. Upgrade für Ihren Dienst bereitstellen
Die Produktions-App, die Sie bereitstellen möchten, muss bald behoben oder mit zusätzlichen Funktionen ausgestattet werden. Mit Kubernetes können Sie eine neue Version in der Produktion bereitstellen, ohne Ihre Nutzer zu beeinträchtigen.
- Öffnen Sie den Code-Editor. Klicken Sie dazu im Cloud Shell-Menü auf Editor starten
.
- Rufen Sie
src/main/java/hello/HelloController.java
auf und aktualisieren Sie den Wert der Antwort.
package hello;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Google Kubernetes Engine!";
}
}
- Sie können mit Jib eine neue Version des Container-Images erstellen und übertragen.
$ ./mvnw -DskipTests package \ com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2
Sie können jetzt den Replikations-Controller von Kubernetes reibungslos auf die neue Version der Anwendung aktualisieren.
- Wenn Sie das Image-Label für Ihren ausgeführten Container ändern möchten, müssen Sie das vorhandene
hello-java
-Deployment bearbeiten und das Image vongcr.io/PROJECT_ID/hello-java:v1
ingcr.io/PROJECT_ID/hello-java:v2
ändern.
- Mit dem Befehl
kubectl set image
können Sie Kubernetes bitten, die neue Version Ihrer Anwendung mit den rollierenden Updates nacheinander im gesamten Cluster bereitzustellen.
$ kubectl set image deployment/hello-java \ hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2 deployment "hello-java" image updated
- Überprüfen Sie http://EXTERNAL_IP:8080 noch einmal, ob die neue Antwort zurückgegeben wird.
11. Rollback durchführen
Hoppla! Haben Sie einen Fehler mit einer neuen Version der App gemacht? Möglicherweise enthielt die neue Version einen Fehler und Sie müssen schnell ein Rollback durchführen. Mit Kubernetes können Sie ganz einfach den vorherigen Zustand wiederherstellen. Führen Sie mit dem folgenden Befehl ein Rollback der Anwendung durch:
$ kubectl rollout undo deployment/hello-java
12. Glückwunsch
Sie haben gelernt, wie Sie eine neue Java-basierte Webanwendung in Kubernetes in GKE erstellen und bereitstellen.