New to Kestra?
Use blueprints to kickstart your first workflows.
A Kestra blueprint that watches Kubernetes Deployments, detects stuck rollouts, and alerts on Slack without spamming.
list_deployments (io.kestra.plugin.scripts.shell.Commands) runs kubectl get deployments in the target namespace and saves the full deployment 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 deployment's status. Trouble is any unavailable replicas, or a Progressing condition with reason ProgressDeadlineExceeded. 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 stuck deployments to Slack with the reasons and a kubectl rollout status command to inspect each one.save_state (io.kestra.plugin.core.kv.Set) writes back the new list of troubled deployment names as one JSON value. Recovered deployments drop out on their own, so a future stuck rollout alerts again.Anyone shipping to Kubernetes who has watched a bad image sit in a rollout for hours because nobody noticed. Works on any cluster you can reach with a client certificate: minikube, kind, managed clusters.
A shell script on a cron server can list deployments, 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 deployment dw-bad --image=nginx:nonexistent) and run again: the Slack alert lists the deployment and the unavailable replicas.cron trigger.namespace input.| Input | Type | Default | What it does |
|---|---|---|---|
namespace |
STRING | default |
the namespace whose deployments to watch |
slack_webhook |
STRING | (required) | Incoming webhook URL of the Slack channel for the alerts |
ProgressDeadlineExceeded reason only appears after the progress deadline (default 10 minutes), so the unavailable-replicas check is the faster signal.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.