Simple NodeJS application to explain basic parts of Kubernetes.
The /app-id
route returns random string generated on application start, so that user can see if he is connecting to different pods (containers).
{"appId":"1.13.647"}
Another request should return a different number in the end.
{"appId":"1.13.539"}
The /evn/:name
route returns environment variable as a proof that the application has access to values passed from Kubernetes Secret. For example you can try /env/secretParameter
.
{"secretParameter":"DatabaseCredentials"}
If starting of a pod can take some time, you can define a readinessProbe
. This is also usable if the pod has some unfinished work and is not available to receive any other requests. The check in this case is set to http get, so if it returns http status code 200
kubernetes will include the pod and if it returns status code 500
it will exclude the pod.
You can test it by refreshing the page and checking the appId
and then visit http://<IP address>/ready/toggle, which will toggle the readiness for 10 seconds. During this time one of the app ids should not occure again.
If some fatal error occured or something else that actually blocked the whole process and the app is basically dead, the livenessProbe
check detects it and restarts the pod. To see this in action, you need to check pods:
kubectl get pods
This will return:
NAME READY STATUS RESTARTS AGE
node-docker-kubernetes-deployment-78f7d56b4b-2sg69 1/1 Running 0 5m37s
node-docker-kubernetes-deployment-78f7d56b4b-d8n9h 1/1 Running 0 5m26s
If you visit http://<IP address>/alive/toggle and refresh the app a few times, one of the ids should not occure for a while. And if you check the pods again, the restarts
info in one of the pods should show you 1
:
NAME READY STATUS RESTARTS AGE
node-docker-kubernetes-deployment-78f7d56b4b-2sg69 1/1 Running 1 5m37s
node-docker-kubernetes-deployment-78f7d56b4b-d8n9h 1/1 Running 0 5m26s
let number = 0;
const load = async () => {
return fetch('https://node-test.kontentinoservices.dev/app-id')
.then(response => response.json())
.then((data) => {
console.log(`${number} App ID: ${data.appId}`);
});
}
const sleep = async (ms) => {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
while (true) {
number++;
await load();
await sleep(1000);
}