Aplikasi Spring Boot di Kubernetes dengan Postgresql dan Loki

Topik penerapan aplikasi Spring Boot di cluster Kubernetes bukan lagi hal baru, dan banyak resource, termasuk yang ini, telah menulis banyak artikel dengan contoh. Hari ini saya ingin berbicara tidak hanya tentang penerapan aplikasi itu sendiri, tetapi juga tentang layanan terkait, yaitu: database, penyeimbang beban, dan sistem untuk mengumpulkan dan menggabungkan log.





Lebih detail tentang semua komponen:





  1. Aplikasi Spring Boot menggunakan database PostgreSQL





  2. Image server database Docker





  3. Docker Grafana (dasbor untuk menampilkan log)





  4. Sistem pengumpulan log Loki gambar Docker (



    )





  5. Promtail (agen untuk mengirim log ke Loki).



    Cluster Kubernetes akan di-deploy menggunakan microk8s . Nginx, atau lebih tepatnya nginx-ingress-controller, yang ada di microk8s, akan bertindak sebagai penyeimbang beban dan juga server web.









Mari kita lihat penerapan setiap komponen secara terpisah.





Langkah 1: Database

Untuk database, gunakan yaml berikut





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

      
      



File tersebut segera menjelaskan layanan dan penyebaran pangkalan. Sebagai gambar, digunakan gambar Postgres 9.6.Untuk



membuat penerapan , jalankan perintahkubectl apply -f db.yaml







Langkah 2: Grafana

Untuk Grafana, gunakan yaml berikut





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
      
      



Penerapannya mirip dengan yang digunakan untuk database. Perbedaannya ada pada gambar (grafana / grafana: master) dan pada port yang terbuka.





Demikian pula, jalankan perintahkubectl 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.





Langkah 9: Tampilkan log

Untuk melakukan ini, Anda harus masuk ke Grafana menggunakan nama pengguna / kata sandi admin. Setelah itu, Anda harus menentukan Loki (http: // loki: 3000) sebagai sumber data. Kemudian dalam jelajah masukkan {app = "application-name"}.





PS

Pengumpulan log didasarkan pada artikel ini .








All Articles