What do Helm's pending-install, pending-upgrade and pending-rollback release statuses mean?
answer
- One value per mutating operation
- Written before anything reaches the cluster
- The same client is meant to clear it
- Not the same thing as failed
- helm list narrows by status
basics
~20 sThey are the in-flight statuses Helm writes on a revision before it touches the cluster, one per operation: a first install, an upgrade, a rollback. Seeing one after the operation ended means the revision was never finished.
solid answer
~40 sA Helm release revision carries a status. `deployed`, `failed`, `superseded`, `uninstalled` and `uninstalling` describe finished or finishing work; the three pending values describe work in flight. Helm stamps `pending-install` on revision 1 of an install, `pending-upgrade` on the new revision an upgrade creates, and `pending-rollback` on the new revision a rollback creates — always *before* it sends anything to the API server. When the operation completes, the same client rewrites that revision as `deployed` or `failed`. So a pending status you find later is a fossil of an interrupted run, not a report that Helm is busy. To see one, run `helm status <release> -n <ns>`, or `helm list --pending -n <ns>` to narrow a listing to just those releases.
code
bash · 5 lines# Helm 4: plain list already shows every status; --pending narrows it
helm list --pending -n billing
# One release, with the status of every revision
helm history billing-cron -n billinggo deeper
Know the three names, which command produces each, and that they are written before the cluster is touched. Be able to find one with helm status or a helm list narrowed by status.
Explain the write-then-apply-then-rewrite sequence and why the status is only truthful while the client lives. Draw the line between pending and failed, including why a timeout produces failed.
Read a helm history table out loud: which revision is live, which is abandoned, and what that implies about objects already pushed to the cluster. Know that Helm 4 dropped helm list -a.
Decide how these states are surfaced fleet-wide — a periodic sweep for releases parked in a pending status is cheap, and it is the difference between finding them yourself and finding them during the next incident.
## Every revision carries a status A Helm release is a numbered sequence of revisions, and each revision stores a status. The statuses split into two groups. The terminal ones describe an outcome: `deployed` (this revision is the live one), `failed` (this revision's operation reached a verdict and it was bad), `superseded` (this revision was the live one until a newer revision took over), `uninstalled` (the release was removed but its history was kept). Two more describe motion: `uninstalling`, on the delete path, and the three pending values, on the write path. The pending values are one per mutating operation: - **`pending-install`** — written on revision 1 when `helm install` begins. It is the only pending status that can appear on a release with no earlier revision, and that matters later, because there is nothing behind it to go back to. - **`pending-upgrade`** — written on the new revision that `helm upgrade` creates. The previous revision is still sitting there as `deployed` while this one is in flight. - **`pending-rollback`** — written on the new revision that `helm rollback` creates. A rollback does not rewind history; it appends a revision whose content is copied from an older one, and that new revision goes through the same pending-then-terminal cycle. ## Why the pending write exists at all Helm records its intent before it acts. The sequence for an upgrade is: create the new revision as `pending-upgrade`, send the rendered resources to the API server, wait according to the wait strategy in force, then rewrite that same revision as `deployed` on success or `failed` on error. Writing the record first is what makes the state recoverable at all — if Helm applied first and recorded afterwards, an interrupted run would leave objects in the cluster that no release knows about. The consequence is the thing interviewers are really testing: because the status is written by the client and cleared by the same client, a pending status is only accurate while that client lives. Any pending status you find at rest means the process died mid-operation — a cancelled pipeline, an evicted runner, a closed laptop — and nothing will ever come back to finish the write. Helm's next mutating command reads that status and refuses with `another operation (install/upgrade/rollback) is in progress`. Note what a pending status is *not*. It is not the same as `failed`. A run that errored, or whose wait exceeded `--timeout`, still had a live client to write the verdict, so it lands in `failed` — and `failed` is an ordinary state you can upgrade or roll back straight out of. Pending means no verdict was ever recorded, which is why it blocks. ## Seeing them ``` helm status billing-cron -n billing helm list --pending -n billing helm history billing-cron -n billing ``` `helm status` reports one named release and prints its current status. `helm list` shows the releases in a namespace, one row each, with a STATUS column; the status flags such as `--pending`, `--failed` and `--deployed` narrow that listing. `helm history` is the per-release view: one row per revision, so you can see a `pending-upgrade` row 31 sitting on top of a `deployed` row 30 and know exactly which revision is stuck and which one is still live. There is a version trap here worth knowing. In Helm 3, `helm list` showed only a default subset of statuses and the idiomatic way to see everything, pending releases included, was `helm list -a` (or `--all`). **Helm 4 removed `-a`/`--all` entirely**: `helm list` now shows every status by default and the status flags only narrow the result. The unrelated `-A`/`--all-namespaces` flag is still there and still means something completely different — search every namespace rather than every status. A candidate who reaches for `helm list -a` on a Helm 4 CLI gets an unknown flag error, so it is worth having both behaviours in your head while both major versions are in the field. ## Reading the pair of rows The most useful skill is reading `helm history` as a two-line story. Revision 30 `deployed`, revision 31 `pending-upgrade` means: 30 is still the last revision Helm considers good, 31 was started and abandoned, and whatever 31 managed to push into the cluster before it died is now live but unrecorded as such. Revision 1 `pending-install` alone means: the install never completed, there is no good revision at all, and rolling back is not an option because there is nothing behind it. Those two shapes call for different recoveries, and identifying which one you have is the whole first step.
- How is a revision in pending-upgrade different from one in failed?Failed means the operation reached a verdict: the apply or the wait went wrong and the client recorded it. Pending means no verdict was ever recorded, because the client vanished between writing its intent and writing its result. Practically, you can run a normal upgrade or rollback straight out of failed, whereas pending blocks every mutating command until it is cleared.
- Which pending status can appear on a release that has no earlier revision?`pending-install`, on revision 1. That is the shape with no rollback target: there is no earlier revision to return to, so the recovery is to uninstall the half-created release and install again rather than to roll back. `pending-upgrade` and `pending-rollback` always sit above at least one older revision.
saying these in an interview costs you the question
- Saying pending means Helm is currently working
- Treating pending-upgrade and failed as the same state
- Thinking rollback rewrites history instead of appending
- Using helm list -a on a Helm 4 CLI
- Confusing --all-namespaces with showing all statuses