Topik penerapan aplikasi Spring Boot di cluster Kubernetes bukan lagi hal baru, dan banyak resource, termasuk yang ini, telah menulis banyak artikel dengan contoh. Hari ini saya ingin berbicara tidak hanya tentang penerapan aplikasi itu sendiri, tetapi juga tentang layanan terkait, yaitu: database, penyeimbang beban, dan sistem untuk mengumpulkan dan menggabungkan log.
Lebih detail tentang semua komponen:
Aplikasi Spring Boot menggunakan database PostgreSQL
Image server database Docker
Docker Grafana (dasbor untuk menampilkan log)
Sistem pengumpulan log Loki gambar Docker
(
)
Promtail (agen untuk mengirim log ke Loki).
Cluster Kubernetes akan di-deploy menggunakan microk8s . Nginx, atau lebih tepatnya nginx-ingress-controller, yang ada di microk8s, akan bertindak sebagai penyeimbang beban dan juga server web.
Mari kita lihat penerapan setiap komponen secara terpisah.
Langkah 1: Database
Untuk database, gunakan yaml berikut
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
File tersebut segera menjelaskan layanan dan penyebaran pangkalan. Sebagai gambar, digunakan gambar Postgres 9.6.Untuk
membuat penerapan , jalankan perintahkubectl apply -f db.yaml
Langkah 2: Grafana
Untuk Grafana, gunakan yaml berikut
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
Penerapannya mirip dengan yang digunakan untuk database. Perbedaannya ada pada gambar (grafana / grafana: master) dan pada port yang terbuka.
Demikian pula, jalankan perintahkubectl 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.
Langkah 9: Tampilkan log
Untuk melakukan ini, Anda harus masuk ke Grafana menggunakan nama pengguna / kata sandi admin. Setelah itu, Anda harus menentukan Loki (http: // loki: 3000) sebagai sumber data. Kemudian dalam jelajah masukkan {app = "application-name"}.
PS
Pengumpulan log didasarkan pada artikel ini .