Pod Health With Liveness Probes

2 minute read

Kubernetes relies on Probes to determine the health of a Pod container. A probe can be understood simply as a periodical diagnostic performed by the kubelet on the container.

In this short article, I’m going to show you a liveness probe in action. Liveness probes are used to check if a Pod is healthy (running as expected) or not. It simply acts as a check for Kubernetes to know when it should restart the container.

Without Liveness Probe

Let us create a simple nginx pod and see what happens when we mess with it without using a Liveness probe. Use the following configuration to create your pod:

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
spec:
  containers:
    - name: my-nginx-container
      image: nginx:alpine

If we port-forward this container we will notice that it is serving the nginx starter page. Ideally, for this case, we would want Kubernetes to restart this pod if we are not able to reach this page. Let us see if that is the case currently or not.

Launch a shell inside the container using kubectl exec:

kubectl exec my-nginx -it sh

Then navigate to the directory which has the HTML file responsible for the nginx starter page:

cd /usr/share/nginx/html

Do a ls here and you’ll see the following output:

50x.html    index.html

Now let us delete this index.html file:

rm -rf index.html

Return to your original shell by typing exit in the current one.

Now do kubectl get pods. You will see that even though our pod is now not functioning as expected (because we deleted the index.html file), Kubernetes has still not restarted the pod. And to be honest that shouldn’t be a surprise. Why would Kubernetes know that we care about that particular index.html file unless we explicitly tell it?

Enter the Liveness Probe

This is where the Liveness Probe comes to the rescue. Update your pod configuration with this:

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
spec:
  containers:
    - name: my-nginx-container
      image: nginx:alpine
      livenessProbe:
        httpGet:
            path: /index.html
            port: 80

You’ll need to delete your previous pod before creating a new one using this config.

Now repeat the same steps and delete the index.html file again. This time after deleting the index.html file don’t immediately type exit to leave the shell, instead, wait about 10 secs (which is the default time gap for regular checks) and you automatically exit the terminal. This is because the container inside which we had opened our terminal got restarted.

You can verify this by running kubectl get pods and you should see something like:

NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   1          4m24s

The 1 in the restarts column confirms that the container in our pod got restarted.

So what exactly did the liveness probe do here? The httpGet action sent a GET request to the container. We told the liveness probe to check for index.html on port 80 and if we don’t get a valid status code for our request then restart the pod.

This is useful for checking containers running an API or something like nginx serving static files.

This was it for this article. Hope you liked it and thanks for reading :)