Aplicativo Spring Boot no Kubernetes com Postgresql e Loki

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:





  1. Aplicativo Spring Boot usando banco de dados PostgreSQL





  2. Imagem do servidor de banco de dados Docker





  3. Docker Grafana (painel para exibição de registros)





  4. Sistema de coleta de registro de imagem Docker Loki(



    )





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








All Articles