Helm Rollback: Version Management and Safe Deployments
Helm Rollback: Version Management and Safe Deployments
Manage Helm releases with rollback, upgrade history, and safe deployment patterns to recover from failed releases.
Table of Contents
- Release History
- Rollback Basics
- Upgrade Patterns
- Failed Release Recovery
- Atomic Upgrades
- Best Practices
Release History
Every Helm operation creates a revision — tracked in secrets (or ConfigMaps) in the namespace.
# See release history
helm history my-release
# REVISION UPDATED STATUS CHART DESCRIPTION
# 1 Mon Oct 6 10:00:00 2026 deployed myapp-1.0.0 Install complete
# 2 Mon Oct 6 11:30:00 2026 deployed myapp-1.1.0 Upgrade complete
# 3 Mon Oct 7 09:00:00 2026 failed myapp-1.2.0 Upgrade "myapp-1.2.0" failed
# See detailed info about a specific revision
helm get all my-release --revision 2
helm get manifest my-release --revision 2
helm get values my-release --revision 2
Rollback Basics
Roll Back to Previous Version
helm rollback my-release
Rolls back to the previous successful revision — skips failed ones.
Roll Back to Specific Revision
helm rollback my-release 1
Check What Changed
# Diff between revisions
helm diff revision my-release 1 3
# (requires helm-diff plugin: helm plugin install https://github.com/databus23/helm-diff)
Upgrade Patterns
Safe Upgrade with Rollback Ready
# Always use --wait and --timeout for production
helm upgrade my-release ./myapp \
--wait \
--timeout 5m \
--atomic # auto-rollback on failure
Upgrade with Specific Values
helm upgrade my-release ./myapp \
--set image.tag=1.2.0 \
--set replicaCount=3 \
--reuse-values # keep existing values, override specific ones
Dry Run Before Upgrading
helm upgrade my-release ./myapp \
--set image.tag=1.2.0 \
--dry-run --debug # see what would change without applying
Failed Release Recovery
Stuck in "pending-upgrade" or "failed"
# Option 1: Rollback to last good version
helm rollback my-release
# Option 2: Uninstall and reinstall (destructive)
helm uninstall my-release
helm install my-release ./myapp
# Option 3: Force complete the release (risky)
helm upgrade my-release ./myapp --force
Release Stuck in "pending-install"
helm status my-release
# STATUS: pending-install — helm is waiting for something
# Force the release
helm upgrade my-release ./myapp --force
Atomic Upgrades
--atomic = auto-rollback if the upgrade fails:
helm upgrade my-release ./myapp \
--atomic \
--wait \
--timeout 5m
Equivalent to:
helm upgrade my-release ./myapp --wait --timeout 5m || helm rollback my-release
In CI/CD Pipelines
#!/bin/bash
set -e
echo "Deploying..."
if helm upgrade --install my-release ./myapp \
--namespace production \
--wait \
--timeout 5m \
--atomic; then
echo "Deploy successful"
else
echo "Deploy failed, rolled back"
exit 1
fi
Helmfile Alternative
For managing multiple releases:
# helmfile.yaml
releases:
- name: myapp
namespace: production
chart: ./myapp
values:
- values-prod.yaml
helmfile -e production diff # preview changes
helmfile -e production apply # apply with rollback tracking
Best Practices
1. Always Use --wait --atomic in Production
helm upgrade myapp ./chart --wait --atomic --timeout 5m
Without --wait, Helm marks the release "deployed" even if pods crash.
2. Keep History Manageable
# Limit history (default keeps all revisions)
helm upgrade myapp ./chart --history-max 10
3. Backup Critical Data Before Upgrades
# If the chart has database migrations, snapshot first
kubectl create job db-backup --image=postgres:16 -- pg_dump -h db -U postgres mydb > backup.sql
helm upgrade myapp ./chart --wait --atomic
4. Use --cleanup-on-fail
helm upgrade myapp ./chart \
--atomic \
--cleanup-on-fail # removes resources created during failed upgrade
5. Test Rollback Path
# Before deploying to production, test rollback on staging
helm upgrade myapp ./chart --namespace staging --wait
# Verify it works
helm rollback myapp --namespace staging
# Verify rollback restores previous version
Common Issues
"cannot rollback to release ... already exists"
The release has resources that conflict with the rollback. Usually means the failed upgrade partially created resources that now block rollback.
# Check what's there
kubectl get all -n <namespace>
# Manually delete conflicting resources, then rollback
kubectl delete deployment bad-deploy -n <namespace>
helm rollback my-release
Rollback Deploys Old Image
Helm rolls back to the chart version, which may have the old image tag:
# If you upgraded with --set image.tag=v2, rollback goes to v1
# To rollback to a specific image, do a new upgrade:
helm upgrade myapp ./chart --set image.tag=v1 --wait --atomic
Secrets/Certs Not Rolled Back
Resources created outside Helm (hooks, init jobs, manually applied) aren't tracked and won't roll back. Keep all resources in templates.
Quick Reference
# List releases
helm list -n <namespace>
# Release status
helm status my-release -n <namespace>
# History
helm history my-release -n <namespace>
# Rollback
helm rollback my-release [revision] -n <namespace>
# Safe upgrade
helm upgrade my-release ./chart --wait --atomic --timeout 5m
# Preview changes
helm template my-release ./chart --set image.tag=new
# Uninstall
helm uninstall my-release -n <namespace>
Related Articles
Last Updated: October 2026
Author: CloudOpsGuide Team
Difficulty: Beginner
Estimated Reading Time: 10 minutes