Spring Boot-Anwendung in Kubernetes mit Postgresql und Loki

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:





  1. Spring Boot-Anwendung mit PostgreSQL-Datenbank





  2. Docker-Datenbankserver-Image





  3. Docker Grafana (Dashboard zum Anzeigen von Protokollen)





  4. Docker-Bild Loki-(



    Protokollsammelsystem)





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








All Articles