Das Thema der Bereitstellung einer Spring Boot-Anwendung in einem Kubernetes-Cluster ist nicht mehr neu, und viele Ressourcen, einschließlich dieser, haben bereits viele Artikel mit Beispielen verfasst. Heute möchte ich nicht nur über die Bereitstellung der Anwendung selbst sprechen, sondern auch über die zugehörigen Dienste, nämlich: eine Datenbank, einen Load Balancer und ein System zum Sammeln und Aggregieren von Protokollen.
Im Detail zu allen Komponenten:
Spring Boot-Anwendung mit PostgreSQL-Datenbank
Docker-Datenbankserver-Image
Docker Grafana (Dashboard zum Anzeigen von Protokollen)
Docker-Bild Loki-
(
Protokollsammelsystem)
Promtail (Agent zum Senden von Protokollen an Loki).
Der Kubernetes-Cluster wird mithilfe von microk8s bereitgestellt . Nginx, oder besser gesagt Nginx-Ingress-Controller, der sich in microk8s befindet, fungiert als Load Balancer und auch als Webserver.
Betrachten wir die Bereitstellung jeder Komponente separat.
Schritt 1: Datenbank
Verwenden Sie für die Datenbank das folgende yaml
apiVersion: v1
kind: Service
metadata:
name: db
spec:
ports:
- port: 5432
selector:
app: db
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: db
spec:
selector:
matchLabels:
app: db
strategy:
type: Recreate
template:
metadata:
labels:
app: db
spec:
containers:
- image: postgres:9.6
name: db
env:
- name: POSTGRES_USER
value: admin
- name: POSTGRES_PASSWORD
value: admin
- name: POSTGRES_DB
value: dbname
ports:
- containerPort: 5432
name: db
Die Datei beschreibt sofort sowohl den Dienst als auch die Bereitstellung der Basis. Als Image wird das Postgres 9.6-Image verwendet. Führen Sie den
Befehl aus, um die Bereitstellung zu erstellenkubectl apply -f db.yaml
Schritt 2: Grafana
Verwenden Sie für Grafana das folgende Yaml
apiVersion: v1
kind: Service
metadata:
name: grafana
spec:
ports:
- port: 3000
selector:
app: grafana
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
spec:
selector:
matchLabels:
app: grafana
strategy:
type: Recreate
template:
metadata:
labels:
app: grafana
spec:
containers:
- image: grafana/grafana:master
name: grafana
ports:
- containerPort: 3000
name: grafana
Die Bereitstellung ähnelt der für die Datenbank verwendeten. Der Unterschied liegt im Bild (grafana / grafana: master) und im belichteten Port.
Führen Sie den Befehl auf ähnliche Weise auskubectl apply -f grafana.yaml
3: Loki
yaml
apiVersion: v1
kind: Service
metadata:
name: loki
spec:
ports:
- port: 3100
selector:
app: loki
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: loki
spec:
selector:
matchLabels:
app: loki
strategy:
type: Recreate
template:
metadata:
labels:
app: loki
spec:
containers:
- image: grafana/loki:latest
name: loki
ports:
- containerPort: 3100
name: loki
kubectl apply -f grafana.yaml
4: Promtail
promtail Helm. helm, microk8s( 2 3). Helm . config, .kube, ip . microk8s config
5: Ingress
nginx .
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: server
spec:
rules:
#for nginxinc controller host should be set
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: server
port:
number: 8024
- path: /grafana
pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
kubectl apply -f ingress.yaml
7:
. yaml Docker . . Maven + jkube maven plugin
install
jar , k8s:resource
, k8s:build
Docker o k8s:deploy .
<profile>
<id>kube</id>
<properties>
<spring.profiles.active>docker</spring.profiles.active>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jkube</groupId>
<artifactId>kubernetes-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<verbose>true</verbose>
<images>
<image>
<name>imagename:latest</name>
<alias>some-alias/alias>
<build>
<maintainer>John Smith</maintainer>
<from>fabric8/java-centos-openjdk11-jre</from>
<assembly>
<inline>
<baseDirectory>/deployments</baseDirectory>
</inline>
</assembly>
</build>
</image>
</images>
</configuration>
<executions>
<execution>
<id>run</id>
<goals>
<goal>resource</goal>
<goal>build</goal>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
image. .
.
kubectl expose deployment server --type=LoadBalancer --name=server --port=<some-port>
, ? , : ip , tcp://<ip-service>.
NumberFormatException.
8:
curl , localhost , localhost/grafana Grafana.
Schritt 9: Protokolle anzeigen
Dazu müssen Sie sich mit dem Benutzernamen / Passwort admin bei Grafana anmelden. Danach müssen Sie Loki (http: // loki: 3000) als Datenquelle angeben. Geben Sie dann in Exploration {app = "application-name"} ein.
PS
Das Sammeln von Protokollen basierte auf diesem Artikel .