Sonntag, 10. Mai 2020

Kubernetes Pod mit JProfiler überwachen

Wenn man seine Spring-Boot Applikation unter realen Bedingungen in einem Kubernetes Cluster mit JProfiler inspizieren möchte, muss man den Agenten von JProfiler einschleusen und sich dann mit diesem verbinden.

Hier ist ein Beispiel für ein Projekt mit folgenden Abhängigkeiten.

  • Spring Boot
  • Gradle
  • Google JIB
  • Kubernetes
Ein Docker Image, wie mit folgendem Dockerfile definiert, kann als Basis-Image für das eigene Projekt verwendet werden.

FROM openjdk:11-oracle
RUN yum -y install wget tar
# Download JProfiler
RUN wget https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_11_1_2.tar.gz -P /tmp/ &&\
 tar -xzf /tmp/jprofiler_linux_11_1_2.tar.gz -C /usr/local &&\
 rm /tmp/jprofiler_linux_11_1_2.tar.gz
# Set JProfiler agent variable
ENV JPAGENT_PATH="-agentpath:/usr/local/jprofiler11.1.2/bin/linux-x64/libjprofilerti.so=nowait,port=8849"
# Open port to connect to JProfiler agent
EXPOSE 8849

In der build.gradle Datei des Spring- Boot Projekts kann dieses Image im dem from Block der JIB Konfiguration verwendet werden.

jib {
    from {
        image = 'docker-base-jdk11-jprofiler:latest' // base image with profiling tools    }
    to {
        image = "IMAGE_NAME:${project.version}"    }
    container {
        ports = ['8080','8849']
        labels = [maintainer: 'Markus Hanses <hanses.markus@gmail.com>']
        jvmFlags = ['-agentpath:/usr/local/jprofiler11.1.2/bin/linux-x64/libjprofilerti.so=nowait,port=8849']
    }
}
Im Deployment Manifest der Applikation muss der Port des JProfiler Agenten freigegeben werden.


 -  name: jprofiler
    containerPort: 8849
Anschliessend kann der Port des K8s Pod mit dem einem Port des lokalen Entwicklungsrechners verbunden werden, um den Zugriff in den K8s Cluster zu ermöglichen.
kubectl port-forward POD_NAME 8849:8849
Danach kann die JProfiler Applikation auf dem Entwicklungsrechner über den lokalen Port mit dem K8s Pod verbunden werden und die Applikation überwacht werden. Nach dem Start von JProfiler, muss nun "Attach to running JVM" ausgewählt werden.


Anschliessend wähle "Direct connection to" und gebe die Adresse "localhost", sowie den Port "8849" ein.


Wenn alles wie oben eingerichtet wurde, wird sich der JProfiler nun mit dem Agenten in dem Pod der Spring-Boot Applikation verbinden.


Ein Hinweis: Die Anzahl der Pods für die Spring-Boot Applikation sollte auf 1 herunter gesetzt werden.



Keine Kommentare:

Kommentar veröffentlichen