How to create a livenessprobe for a node.js container that is not a server?

10/31/2019

I have to create a readyness and liveness probe for a node.js container (docker) in kubernetes. My problem is that the container is NOT a server, so I cannot use an http request to see if it is live.

My container runs a node-cron process that download some csv file every 12 h, parse them and insert the result in elasticsearch.

I know I could add express.js but I woud rather not do that just for a probe.

My question is:

  1. Is there a way to use some kind of liveness command probe? If it is possible, what command can I use?
  2. Inside the container, I have pm2 running the process. Can I use it in any way for my probe and, if so, how?
-- OLIVIER
kubernetes
node.js

2 Answers

10/31/2019

First, you should certainly consider a Kubernetes CronJob for this workload. That said, it may not be appropriate for your job, for example if your job takes the majority of the time between scheduled runs to run, or you need more complex interactions between error handling in your job and scheduling. Finally, you may even want a liveness probe running for the container spawned by the CronJob if you want to check that the job is making progress as it runs -- this uses the same syntax as you would use with a normal job.

I'm less familiar with pm2, though I don't think you should need to use the additional job management inside of Kubernetes, which should already provide most of what you need.

That said, it is certainly possible to use an arbitrary command for your liveness probe, and as you noted it is even explicitly covered in the kubernetes liveness/rediness probe documentation

You just add an exec member to the livenessProbe stanza for the container, like so:

    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

If the command returns 0 (e.g. succeeds), then the kubelet considers the container to be alive and healthy. (e.g. in this trivial example, the container is considered healthy only while /tmp/healthy exists).

In your case, I can think of several possibilities to use. As one example, the job could probably be configured to drop a sentinel file that indicates it is making progress in some way. For example, append the name and timestamp of the last file copied. The liveness command would then be a small script that could read that file and ensure that there has been adequate progress (e.g. in the cron job case, that a file has been copied within the last few minutes).

Readiness probes probably don't make sense in the context of the service you describe, since they're more about not sending the application traffic, but they can also have a similar stanza, just for readinessProbe rather than livenessProbe.

-- robsiemb
Source: StackOverflow

10/31/2019

Liveness command

You can use a Liveness command as you describe. However, I would recommend to design your job/task for Kubernetes.

Design for Kubernetes

My container runs a node-cron process that download some csv file every 12 h, parse them and insert the result in elasticsearch.

Your job is not executing so often, if you deploy it as a service, it will take up resources all the time. And when you write that you want to use pm2 for your process, I would recommend another design. As what I understand, PM2 is a process manager, but Kubernetes is also a process manager in a way.

Kubernetes native CronJob

Instead of handling a process with pm2, implement your process as a container image and schedule your job/task with Kubernetes CronJob where you specify your image in the jobTemplate. With this design, you don't have any livenessProbe but your task will be restarted if it fails, e.g. fail to insert the result to elasticSearch due to a network problem.

-- Jonas
Source: StackOverflow