New to Kestra?
Use blueprints to kickstart your first workflows.
A Kestra blueprint that watches Kubernetes pods, detects crash loops and excessive restarts, and alerts on Slack without spamming.
list_pods (io.kestra.plugin.scripts.shell.Commands) runs kubectl get pods in the target namespace and saves the full pod 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 pod list and the remembered state from the KV store, then checks every pod. Crashlooping: any container stuck waiting with reason CrashLoopBackOff. Flapping: any container whose restart count reached the restart_threshold input. Pods that finished successfully are skipped because a completed Job is not a problem. 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 troubled pods to Slack with the reason plus kubectl describe and kubectl logs commands to inspect each one.save_state (io.kestra.plugin.core.kv.Set) writes back the new list of troubled pod names as one JSON value. Recovered pods drop out on their own, so a future crash alerts again.Anyone running workloads on Kubernetes who wants to know about crash-looping pods without watching kubectl get pods all day. Works on any cluster you can reach with a client certificate: minikube, kind, managed clusters.
A shell script on a cron server can list pods, 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.ImagePullBackOff.cron trigger.namespace input.| Input | Type | Default | What it does |
|---|---|---|---|
namespace |
STRING | default |
the namespace whose pods to watch |
restart_threshold |
INT | 5 |
a pod with at least this many container restarts counts as troubled |
slack_webhook |
STRING | (required) | Incoming webhook URL of the Slack channel for the alerts |
restart_threshold counts cumulative restarts since the pod started, not restarts per hour. A long-lived pod that restarted 5 times over a month will flag once, then stay quiet thanks to the dedup.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.