Debug application
At this point, we deployed our application within a local cluster. But now we have a problem. How do I debug my application that is inside the docker that is inside the kubernetes that is inside a virtual machine?
Prepare to debug
In this case, we will use a remote Java debug.
First step:
Prepare your Dockerfile:
FROM openjdk:11.0.3-jdk-slim
RUN mkdir /usr/myapp
COPY target/java-kubernetes.jar /usr/myapp/app.jar
WORKDIR /usr/myapp
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar app.jar" ]
This ENTRYPOINT allows you to pass options to the java through $JAVA_OPTS environment variable.
Second step:
Changing app-configmap.yaml
file to fill $JAVA_OPTS
.
JAVA_OPTS: "-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n -Xms256m -Xmx512m -XX:MaxMetaspaceSize=128m"
Third step:
Building and deploy app:
mvn clean install
eval $(minikube -p dev.to docker-env) && docker build --force-rm -t java-k8s .
kubectl apply -f kubernetes/app/
Fourth step:
Exposing debug port to localhost:
Get pods:
kubectl get pods -n dev-to
NAME READY STATUS RESTARTS AGE
myapp-7796bc89bf-h2f82 1/1 Running 0 3h3m
Expose pod 5005 port:
kubectl port-forward -n dev-to myapp-7796bc89bf-h2f82 5005:5005
Forwarding from 127.0.0.1:5005 -> 5005
Forwarding from [::1]:5005 -> 5005
Change your pod name as necessary.
Create a remote debug on your IDE:
On IntelliJ, go to Run/Debug Configurations.
- Add new remote configuration like this:
After that, run the configuration. You should see the message below:
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Check if works:
Now, you can set a breakpoint in the HelloController
.
minikube -p dev.to service -n dev-to myapp --url
http://192.168.99.100:32301
curl http://192.168.99.100:32301/hello
Conclusion
In this part, we learned about how to debug application inside a local kubernetes cluster.
In the next part, we will see some good practices and how to access application with friendly URL using Ingress.
See you soon!
Top comments (1)
eu apliquei (apply) o configmap.yaml com um JAVA_OPTS sem os comandos que permitem debug. Como devo proceder? Fazer apenas um novo apply com o arquivo modificado já funciona!?