Pretty much the title of the question.
I am working with an Ubuntu system that has a k8s deployment with multiple nodes and with multiple pods that run Docker containers. A few of the pods are nodeJS microservices which run the following command at initiation:
node app.js
Sometimes I need to debug the microservice by adding logs, changing logic inside, etc.
Working with the same microservices in Windows I could just change the source code and restart the node.exe process. How would I achieve doing the same in Linux with a Kubernetes deployment?
I attempted to run a shell:
user@node1:~$ kubectl exec my-microservice-XXXX -it -- sh
Change source code and save: nano app.js
Find the node process: ps aux
PID USER TIME COMMAND
1 root 0:00 npm
22 root 0:00 npm
42 root 0:27 node --max-http-header-size=65000 app.jsThen send SIGTERM to PID 42:
kill SIGTERM 42
And this results in me being booted out of the pod:
/usr/src/app # kill SIGTERM 42
sh: invalid number 'SIGTERM'
/usr/src/app # command terminated with exit code 137
test@node1:~$
And a new pod starts automatically:
my-microservice-XXXX 0/1 Completed 1 19h
my-microservice-XXXX 1/1 Running 2 19hWith the following two steps, you can debug a Node app running inside a Docker container in a kubernetes Pod:
kubectl exec -it <pod-name> bash
node --inspect-brk index.jskubectl port-forward <pod-name> 9229Note: 9229 is the default port number that the debugger listens on, and you don't need to expose this port in your Kubernetes configuration yaml file.
That is it.
Now you can open you Chrome browser with address chrome://inspect, click the remote target, and start debugging.
This is not possible in Kubernetes as a straight forward way, as we do not manage the container (Creation, termination, etc). This is done by Kubernetes and hence the process is ephemeral.
If you don't want to lose your changes on container restart, then you can use volume mount of the directory where you're making the changes. (This completely defeats the purpose of docker containerisation and a not a recommended for production (any) environment to store the code in volume).