New to Kestra?
Use blueprints to kickstart your first workflows.
A Kestra blueprint that watches Kubernetes Jobs, detects failures, and alerts on Slack without spamming.
list_jobs (io.kestra.plugin.scripts.shell.Commands) runs kubectl get jobs in the target namespace and saves the full job list as JSON. It authenticates with a client certificate and key passed as Kestra secrets, the same pattern the Kubernetes gallery blueprints use.find_trouble (io.kestra.plugin.scripts.python.Script) reads the remembered state from the KV store, then checks every job's status. Trouble is any failed pods, or a Failed condition being True. Anything already alerted on is dropped.maybe_alert (io.kestra.plugin.core.flow.If) runs only when there is something new to report, and send_alert posts the failed jobs to Slack with the reasons and a kubectl command to inspect each one.save_state (io.kestra.plugin.core.kv.Set) writes back the new list of troubled job names as one JSON value. Deleted jobs drop out on their own, so a future failure alerts again.Anyone running batch work on Kubernetes: migrations, backups, report generators, data loads. A failed job that nobody notices is a silent outage. Works on any cluster you can reach with a client certificate: minikube, kind, managed clusters.
A shell script on a cron server can list jobs, but then you need somewhere to keep the "already alerted" state, somewhere to hold the secrets, and a place to see the run history when an alert looks wrong. Kestra gives you all three: the KV store is the memory, secrets stay out of the YAML, and every run keeps its logs and outputs where you can inspect them.
| Secret | What it is |
|---|---|
CLIENT_CRT |
base64-encoded client certificate for the cluster |
CLIENT_KEY |
base64-encoded client key for the cluster |
MASTERURL |
base64-encoded Kubernetes API server URL, reachable from inside the Kestra container |
SLACK_WEBHOOK |
base64-encoded Slack Incoming Webhook URL |
In Kestra OSS, secrets come from environment variables prefixed with SECRET_ and must be base64-encoded.
SECRET_ environment variables.namespace you want to watch.kubectl create job jw-fail --image=busybox -- sh -c 'exit 1') and run again: the Slack alert lists the job and the failure.cron trigger.namespace input.| Input | Type | Default | What it does |
|---|---|---|---|
namespace |
STRING | default |
the namespace whose jobs to watch |
slack_webhook |
STRING | (required) | Incoming webhook URL of the Slack channel for the alerts |
failed set yet. The Failed condition with reason BackoffLimitExceeded catches the terminal state.MASTERURL is reachable from inside the Kestra container. localhost inside the container is not your host: use host.docker.internal when Kestra runs in Docker on the same machine as the cluster.