← Back to blog

Helm Rollback Strategy: Roll Back Releases Safely

November 2, 2026
Helm Rollback Strategy: Roll Back Releases Safely

A good Helm rollback strategy comes down to four steps. Read the release history, pick the last revision you trust, run helm rollback with --wait, then verify the live cluster instead of trusting the exit code. The rest of this guide covers each step. It also covers what to do when hooks fail or a release gets stuck, and what Helm cannot undo, such as database migrations.

Kubezilla Desktop
Manage Helm Releases in One Place
Kubezilla Desktop brings Helm operations, live logs, and metrics together in a native app for managing Kubernetes clusters.
Visit Kubezilla Desktop

TL;DR

  • Run helm history RELEASE first, then helm rollback RELEASE REVISION --wait --timeout 5m. A rollback creates a new revision. It does not rewind the counter.
  • Check helm status and the workload itself afterward. A recorded revision does not prove the live cluster matches it.
  • Hooks run during rollback. A failing pre-rollback Job fails the whole release, and --no-hooks and --cleanup-on-fail are your escape hatches.
  • Helm cannot reverse a schema migration or a storage change. Plan those separately before you upgrade, not after.
  • If a release is stuck in pending-rollback, find the blocking condition before you touch release state.

Table of Contents

What a Helm rollback actually does

Many engineers assume a rollback rewinds the release to an earlier point. It does not. Helm's own glossary explains that the revision number goes up with every operation. A rollback therefore produces a new revision whose configuration matches the one you targeted (Helm glossary).

Suppose a release sits at revision 7 and you roll back to revision 4. You end up at revision 8, and revision 8 carries the configuration of revision 4. Three things follow from this:

  • History stays honest. Revisions 5, 6 and 7 remain in the record, so you can see what was tried and when.
  • You can roll forward again. If revision 7 turns out to be fine and the real fault lay elsewhere, you can roll back to 7, which creates revision 9.
  • Revision numbers are not versions. Revision 8 is not chart version 8. Always read the chart and app version columns before you choose a target.

Helm records the chart, the values and the rendered manifest for each revision. That is why a rollback does not need you to re-supply parameters by hand. The configuration comes from the stored revision.

Decide your strategy before the incident

Most rollbacks go wrong because of decisions made at 3 a.m. Settle these questions while things are calm.

Which revision counts as known good? Name it in your release process. For many teams it is the last revision whose status was deployed before the current upgrade, and which has run through a full traffic cycle.

Who can roll back, and from where? A rollback is a write operation on production. Decide whether on-call engineers run it directly or whether it goes through a pipeline. If you use GitOps, a manual rollback can be overwritten by the controller on its next sync. Our guide to deploying Helm charts with Argo CD covers how to roll back in that model, which is normally a revert in Git, not a CLI command.

What changed besides the chart? Rollback restores what Helm tracked. List the things it does not track: database schemas, external queues, secrets managed elsewhere, and resources your hooks created. We return to these below.

Can you preview the target state? Before an upgrade, a server-side check catches many problems that would otherwise force a rollback. Our piece on Kubernetes dry runs explains which options validate against admission control and which do not.

Step 1: Read the history and status

Never pass a revision number from memory. Start with the history.

helm history my-app -n production

The Helm documentation says this prints every recorded revision in a table with revision, update time, status, chart, app version and description. By default it shows up to 256 revisions, adjustable with --max, and you can ask for table, JSON or YAML output (helm history).

Read the table the way an investigator would:

ColumnWhat to look for
RevisionThe integer you will pass to helm rollback
UpdatedWhere the trouble began; match it to your alert timeline
Statusdeployed, superseded and failed tell different stories
Chart / App versionConfirms you are going back to the version you intend
DescriptionOften holds the error message for a failed operation

The revision targeted by earlier rollbacks can be confusing, since each one is itself a new row. The Helm cheat sheet documents helm history RELEASE --show-rollback-revision, which adds the revision each rollback pointed at (Helm cheat sheet). Use it in any release that has already been rolled back once.

Check the current state

Next, ask Helm what it thinks is happening:

helm status my-app -n production

Per the official docs, status reports the last deployment time, namespace, release state, current revision, description, release resources, any test-suite details and the chart notes (helm status). The state is one of unknown, deployed, uninstalled, superseded, failed, uninstalling, pending-install, pending-upgrade or pending-rollback. The description can hold either a completion message or an error message, and the error message is often your first real clue.

To inspect a past revision before you commit to it, the cheat sheet gives helm status RELEASE --revision NUMBER.

If you manage many releases, helm list can narrow things down. It filters by status with flags such as --failed, --pending and --superseded. -A covers all namespaces, and -d sorts by release date (helm list). helm list -A --failed is a fast way to find every broken release after a bad rollout.

Step 2: Roll back to a specific revision

The syntax is simple. The first argument is the release name and the second is the revision. Per the Helm documentation, the revision is the integer index from the history list (helm rollback). Omit it, or pass 0, and Helm goes back to the previous revision.

Steps for safely rolling back a Helm release

helm rollback my-app 4 -n production --wait --timeout 5m

Oracle's administration documentation for Helm shows the same pattern: take the revision number from helm history RELEASE_NAME --namespace NAMESPACE and pass it to helm rollback RELEASE_NAME REVISION_NUMBER --namespace NAMESPACE (Oracle Helm release guide). Always include the namespace. A rollback against the wrong namespace context is an avoidable mistake.

Why --wait matters

Without --wait, Helm reports success once it has submitted the manifests. With it, Helm waits until Pods, PVCs and Services are ready, along with the minimum required Pods of Deployments, StatefulSets and ReplicaSets, up to the --timeout you set (helm rollback). That turns "the command returned" into "the workload came up." In an incident, the difference matters a lot.

Pick a timeout that matches your slowest workload's readiness behavior. Too short and Helm marks a healthy rollback as failed. Too long and your pipeline hangs.

Rolling back one release among many

If several releases share a namespace, roll back one at a time and verify between each. A bulk loop feels fast, but it multiplies the blast radius of picking the wrong revision. We make the same argument for restarts in our guide on avoiding bulk mistakes when restarting a Deployment.

Step 3: Verify the result

A successful exit code is not a finished rollback. Check three things.

  1. Helm's view. Run helm history my-app -n production again. You should see a new top revision with the description of a rollback, and helm status should show deployed.
  2. The cluster's view. Look at the workloads directly: Pod readiness, restart counts, the image tag actually running. One engineering write-up on diagnosing existing releases makes the point that the captured manifest records the current Helm revision but does not prove that the live objects match it (ConfigHub diagnostic guide). Someone may have patched an object by hand, or another controller may be changing it.
  3. The application's view. Check error rates, latency and a real request. If you need a shell inside a Pod to confirm configuration or connectivity, our Kubernetes pod shell guide has the commands.

If the rollback changed a ConfigMap, remember that running Pods may not pick it up automatically. See how to edit Kubernetes ConfigMaps safely and how to restart Pods for the safe ways to apply it.

A useful side effect: rolling back may mean the cluster pulls an older image again. If the node no longer has it cached, startup takes longer, and --wait needs a timeout that allows for the pull.

Hooks during a rollback

Hooks are where tidy rollbacks turn messy. Helm's chart hooks documentation describes pre-rollback and post-rollback hooks that run at defined points in the lifecycle. For Job and Pod hooks, Helm waits for successful completion, and if a hook fails, the release fails (chart hooks).

This has practical consequences:

  • A pre-rollback Job that expects the newer schema may fail when the rollback runs, and the rollback never starts.
  • A hook that is not safe to run twice can leave data in a half-changed state if it runs on every operation.
  • Resources created by hooks are not tracked as part of the release, so helm uninstall cannot be relied on to remove them (Helm 3.1 hooks docs).

Two flags on helm rollback help here. --no-hooks prevents hooks from running at all, and --cleanup-on-fail deletes new resources created during a failed rollback (helm rollback). Reach for --no-hooks only when you know what the skipped hook would have done. If the hook performs a required migration step, skipping it moves the problem to the application.

The lasting fix is in chart design. Make hook logic idempotent, and set activeDeadlineSeconds on hook Jobs so a stuck Job cannot block the release lifecycle forever.

When a rollback fails or hangs

Failed or stuck rollbacks usually have one of three causes: Kubernetes resources that never become ready, misbehaving hooks, or inconsistent release-state data (Netdata's Helm rollback guide). The same source explains that pending-rollback means Helm started a rollback and is waiting on a condition. If that condition never arrives, the release stays stuck.

Work through it in this order:

  1. Read the description. helm history and helm status often carry the error text.
  2. Look at the Pods. Check for ImagePullBackOff, failing probes, unschedulable Pods or exhausted quota. Our layer-by-layer connectivity guide helps when readiness fails because the Pod cannot reach a dependency.
  3. Look at the hook Jobs. A hook Job that is still running, or keeps failing, is a frequent culprit. Read its logs, then fix or delete it.
  4. Remember that the timeout is client-side. When the Helm client gives up, the cluster may keep working. A hook Job can still be running after Helm reports a timeout. Compare what Helm says with what the cluster is doing before you retry.
  5. Retry the rollback. Once the blocker is gone, run helm rollback again with a sensible --timeout.

Only consider editing release state, which Helm stores as Secrets in the release's namespace, as a last resort. If you must, change only the record of the stuck pending revision and never the Secret of the last good deployed revision. Back up the Secrets first, and try a normal helm rollback before anything else. Treat any manual fix of this kind as an emergency step, and write down what you did.

A ready-made tool for prevention is a team runbook that lists, per release, which hooks exist and what each does on rollback.

What a rollback cannot undo

Helm restores Kubernetes objects it tracked. It does not restore the world around them. The same release-diagnostics guide notes that the captured release files do not prove a rollback can reverse a database or storage migration, and that hooks sit apart from the ordinary object set Helm recorded (ConfigHub diagnostic guide).

That leads to a few rules for your strategy:

  • Use expand and contract migrations. Add columns or tables first, deploy code that works with both shapes, and remove old structures only in a later release. Then an older chart still works against the newer schema.
  • Snapshot before risky upgrades. If the release owns persistent volumes, take a snapshot or backup first. A rollback does not bring data back.
  • Keep external config in sync. If the new version expects a changed secret, queue or feature flag, the rollback needs a matching change there.
  • Know your point of no return. Some upgrades are one-way. Mark them in the release notes so the on-call engineer knows rollback is not an option.

If you need to look inside a volume to confirm what an older version will find, a tool that browses PVC files saves a lot of kubectl exec juggling.

Quick decision table

SituationFirst move
New release is failing readiness, chart-only changehelm rollback RELEASE REVISION --wait
Unsure which revision was goodhelm history RELEASE and helm status RELEASE --revision N
Rollback blocked by a pre-rollback hookRead the Job logs, fix it, retry. Use --no-hooks only if you know the hook is not needed
Release stuck in pending-rollbackFind the blocking condition in Pods and hook Jobs before touching release state
Upgrade ran a schema migrationPlan a forward fix or a restore, not just a rollback
Managed by Argo CDRevert in Git so the controller does not undo your rollback

Perspective: what we see when releases go wrong

Most rollback trouble is not about Helm syntax. It is about context. Which cluster am I in? Which namespace? Which revision was actually good? The engineer under pressure is switching between a terminal, a dashboard, a log viewer and a notes page, and that switching is where the wrong-namespace and wrong-revision mistakes happen.

This is why we built Kubezilla Desktop as a single native app. Your clusters, their Helm releases, live logs, metrics and pod terminals sit in one place. You can see a release's history, watch the logs while a rollback runs, and check that Pods came up, without hopping across tabs and tools.

We also built it local-first. Your kubeconfigs are stored securely on your machine, and there is no cloud sync or telemetry. For remote clusters, SSH tunneling is built in, so you do not need a VPN or a bastion host workflow just to reach a cluster during an incident. And because the app is written in Rust, it starts fast and stays light on RAM, which matters when you are already fighting a production problem.

Our advice is the same whatever tool you use: write the strategy down, practice it on a non-production cluster, and verify the live state every time.

Margus

Run your rollbacks from one place

When a release breaks, you want history, logs, metrics and a terminal side by side. Kubezilla Desktop gives you a unified interface for multi-cluster access, Helm and Argo CD operations, live log streaming, YAML editing and workload scaling on Linux, macOS and Windows. It costs €5 per month.

Kubezilla Desktop

If you are still choosing a tool, see our overview of the Kubernetes desktop app and how it fits your workflow.

FAQ

How do I roll back a Helm release to a specific revision?

Run helm history RELEASE -n NAMESPACE to find the revision number. Then run helm rollback RELEASE REVISION -n NAMESPACE --wait --timeout 5m. Helm creates a new revision with the configuration of the one you chose, so the history keeps growing.

Does a Helm rollback restore my database?

No. Helm restores the Kubernetes objects it tracked for the release. Schema migrations, data in volumes and external systems are outside that scope. Use backward-compatible migrations and take snapshots before risky upgrades.

What happens if I run helm rollback without a revision number?

Helm rolls back to the previous revision. That is convenient, but check helm history first. If the previous revision was also a failed attempt, you will land on another bad state.

Why is my release stuck in pending-rollback?

Helm started the rollback and is waiting for a condition that has not been met. Common causes are Pods that never become ready or a hook Job that is still running or failing. Fix the blocker first, then retry the rollback before you consider editing release state.

Sources