Aplicación Spring Boot en Kubernetes con Postgresql y Loki

El tema de la implementación de una aplicación Spring Boot en un clúster de Kubernetes ya no es nuevo y muchos recursos, incluido este, ya han escrito muchos artículos con ejemplos. Hoy me gustaría hablar no solo sobre el despliegue de la aplicación en sí, sino también sobre los servicios relacionados, a saber: una base de datos, un equilibrador de carga y un sistema para recopilar y agregar registros.





Más detalladamente sobre todos los componentes:





  1. Aplicación Spring Boot usando la base de datos PostgreSQL





  2. Imagen del servidor de base de datos de Docker





  3. Docker Grafana (panel para mostrar registros)





  4. Sistema de recopilación de registros Loki de imágenes de Docker (



    )





  5. Promtail (agente para enviar registros a Loki).



    El clúster de Kubernetes se implementará mediante microk8s . Nginx, o más bien nginx-ingress-controller, que está en microk8s, actuará como un equilibrador de carga y también como un servidor web.









Veamos la implementación de cada componente por separado.





Paso 1: base de datos

Para la base de datos, use el siguiente 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

      
      



El archivo describe inmediatamente tanto el servicio como el despliegue de la base. Como imagen, se utiliza la imagen de Postgres 9.6.



Para crear la implementación , ejecute el comandokubectl apply -f db.yaml







Paso 2: Grafana

Para Grafana, use el siguiente 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
      
      



La implementación es similar a la utilizada para la base de datos. La diferencia está en la imagen (grafana / grafana: master) y en el puerto expuesto.





Del mismo modo, ejecute el 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.





Paso 9: Mostrar registros

Para hacer esto, debe iniciar sesión en Grafana con el nombre de usuario / contraseña admin. Después de eso, debe especificar Loki (http: // loki: 3000) como fuente de datos. Luego, en explorar, ingrese {app = "application-name"}.





PD

La recopilación de registros se basó en este artículo .








All Articles