O tópico de implantação de um aplicativo Spring Boot em um cluster Kubernetes não é mais novo, e muitos recursos, incluindo este, já escreveram muitos artigos com exemplos. Hoje gostaria de falar não apenas sobre a implantação do aplicativo em si, mas também sobre os serviços relacionados, a saber: banco de dados, balanceador de carga e sistema de coleta e agregação de logs.
Mais detalhadamente sobre todos os componentes:
Aplicativo Spring Boot usando banco de dados PostgreSQL
Imagem do servidor de banco de dados Docker
Docker Grafana (painel para exibição de registros)
Sistema de coleta de registro de imagem Docker Loki
(
)
Promtail (agente para enviar logs para Loki).
O cluster Kubernetes será implantado usando microk8s . Nginx, ou melhor, nginx-ingress-controller, que está no microk8s, atuará como um balanceador de carga e também um servidor web.
Vejamos a implantação de cada componente separadamente.
Etapa 1: Banco de dados
Para o banco de dados, use o seguinte 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
O arquivo descreve imediatamente o serviço e a implantação da base. Como uma imagem, a imagem Postgres 9.6 é usada.
Para criar a implantação , execute o comandokubectl apply -f db.yaml
Etapa 2: Grafana
Para Grafana, use o seguinte 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
A implantação é semelhante à usada para o banco de dados. A diferença está na imagem (grafana / grafana: master) e na porta exposta.
Da mesma forma, execute o comandokubectl 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.
Etapa 9: Exibir registros
Para fazer isso, você precisa entrar no Grafana usando o nome de usuário / senha admin. Depois disso, você deve especificar Loki (http: // loki: 3000) como a fonte de dados. Em seguida, em explorar, digite {app = "nome do aplicativo"}.
PS
A coleta de logs foi baseada neste artigo .