Application Spring Boot dans Kubernetes avec Postgresql et Loki

Le sujet du déploiement d'une application Spring Boot dans un cluster Kubernetes n'est plus nouveau et de nombreuses ressources, dont celle-ci, ont déjà rédigé de nombreux articles avec des exemples. Aujourd'hui, je voudrais parler non seulement du déploiement de l'application elle-même, mais aussi des services associés, à savoir: une base de données, un équilibreur de charge et un système de collecte et d'agrégation de journaux.





Plus en détail sur tous les composants:





  1. Application Spring Boot utilisant la base de données PostgreSQL





  2. Image du serveur de base de données Docker





  3. Docker Grafana (tableau de bord pour l'affichage des journaux)





  4. Système de collecte de journaux Docker image Loki(



    )





  5. Promtail (agent pour l'envoi de logs à Loki).



    Le cluster Kubernetes sera déployé à l'aide de microk8 . Nginx, ou plutôt nginx-ingress-controller, qui est dans microk8s, agira comme un équilibreur de charge et aussi un serveur Web.









Regardons le déploiement de chaque composant séparément.





Étape 1: base de données

Pour la base de données, utilisez le yaml suivant





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

      
      



Le fichier décrit immédiatement à la fois le service et le déploiement de la base. En tant qu'image, l'image Postgres 9.6 est utilisée.



Pour créer le déploiement , exécutez la commandekubectl apply -f db.yaml







Étape 2: Grafana

Pour Grafana, utilisez le yaml suivant





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
      
      



Le déploiement est similaire à celui utilisé pour la base de données. La différence réside dans l'image (grafana / grafana: master) et dans le port exposé.





De même, exécutez la commandekubectl apply -f grafana.yaml







Étape 3: Loki

Comme ci-dessus 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

      
      



Et l'équipekubectl apply -f grafana.yaml







Étape 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.





Étape 9: Afficher les journaux

Pour ce faire, vous devez vous connecter à Grafana en utilisant le nom d'utilisateur / mot de passe admin. Après cela, vous devez spécifier Loki (http: // loki: 3000) comme source de données. Ensuite, dans explore, entrez {app = "application-name"}.





PS

La collecte des journaux était basée sur cet article .








All Articles