Helm Rollback Troubleshooting

A comprehensive guide to Helm rollback troubleshooting covering failed rollbacks, release history, recovery strategies, and best practices for restoring Helm releases.

Failed Rollbacks Release History Recovery Strategies
Understanding Rollback in Helm

Helm rollback is the process of reverting a release to a previous revision. It's a critical recovery mechanism when a deployment fails or introduces issues. However, rollbacks can also fail, and understanding how to troubleshoot them is essential.

This guide covers:

  • Failed Rollbacks: Why rollbacks fail and how to fix them
  • Release History: Understanding revisions and history
  • Recovery Strategies: Options for restoring releases
  • Prevention: Avoiding rollback failures
Key Concept: Helm stores release history as Kubernetes Secrets. Each upgrade creates a new revision. Rollback reverts to a previous revision by applying its stored manifest.
Rollback Basics
# Basic rollback to previous revision helm rollback my-release # Rollback to specific revision helm rollback my-release 2 # Rollback with wait helm rollback my-release 2 --wait # Rollback with timeout helm rollback my-release 2 --timeout 10m # Rollback with dry-run helm rollback my-release 2 --dry-run # Rollback with force helm rollback my-release 2 --force # Rollback with cleanup on fail helm rollback my-release 2 --cleanup-on-fail # Rollback with no hooks helm rollback my-release 2 --no-hooks # Check rollback status helm status my-release # Verify rollback helm history my-release

Rollback

Revert to the previous revision. The simplest rollback command.

Rollback to Revision

Rollback to a specific revision number.

Rollback with Wait

Wait for resources to be ready after rollback.

Cleanup on Fail

Clean up resources if rollback fails.
Common Rollback Failures
Error: "rollback failed: failed to update release: another operation (install/upgrade/rollback) is in progress"

Cause: Another Helm operation is in progress or failed and left a lock.

# Check release status helm status my-release helm history my-release # Check for pending operations helm list --pending # Fix 1: Wait for operation to complete # Check if operation is still running # Fix 2: Force unlock by deleting release secret kubectl delete secret sh.helm.release.v1.my-release.v1 -n default # Fix 3: Rollback with --force helm rollback my-release 1 --force # Fix 4: Use --cleanup-on-fail helm rollback my-release 1 --cleanup-on-fail # Fix 5: Uninstall and reinstall (last resort) helm uninstall my-release --keep-history helm install my-release ./my-chart
Error: "rollback failed: unable to find release revision"

Cause: The revision number doesn't exist or history was cleaned.

# Check release history helm history my-release # Fix 1: Use a valid revision number helm history my-release helm rollback my-release 2 # Use valid revision # Fix 2: Check history limit helm get metadata my-release | grep history-max # Fix 3: Increase history limit during install/upgrade helm upgrade my-release ./my-chart --history-max 20 # Fix 4: Reinstall if history is lost helm uninstall my-release helm install my-release ./my-chart
Error: "rollback failed: no deployed releases"

Cause: No successful deployments in history to rollback to.

# Check release history helm history my-release # Fix 1: Check for failed releases helm list --all helm list --failed # Fix 2: Force delete and reinstall helm uninstall my-release --keep-history helm install my-release ./my-chart # Fix 3: Use a different release name helm install my-release-2 ./my-chart # Fix 4: Restore from backup # Restore release secret from backup kubectl apply -f backup-release-secret.yaml
Error: "rollback failed: cannot patch "my-app" with kind Deployment: Deployment.apps "my-app" is invalid"

Cause: Immutable fields changed between revisions.

# Fix 1: Use --force to recreate resources helm rollback my-release 1 --force # Fix 2: Delete conflicting resources kubectl delete deployment my-app --ignore-not-found helm rollback my-release 1 # Fix 3: Use --cleanup-on-fail helm rollback my-release 1 --cleanup-on-fail # Fix 4: Manually rollback resources kubectl apply -f revision-1-manifests.yaml
Rollback Failure Solutions:
  • Use --force for immutable field issues
  • Check release history for valid revisions
  • Clear pending operations
  • Use --cleanup-on-fail for cleanup
  • Reinstall as last resort
  • Restore from backup if available
Understanding Release History
# View release history helm history my-release # View with more details helm history my-release --max 10 # View history in YAML helm history my-release --output yaml # View history in JSON helm history my-release --output json # View specific revision helm get all my-release --revision 2 # View release status helm status my-release # View release values helm get values my-release --revision 2 # View release manifest helm get manifest my-release --revision 2 # Check history limit helm get metadata my-release | grep history-max # Increase history limit helm upgrade my-release ./my-chart --history-max 20
Revision Status Chart App Version Description
1 superseded my-app-1.0.0 1.0.0 Initial install
2 superseded my-app-1.1.0 1.1.0 Added new feature
3 superseded my-app-1.2.0 1.2.0 Bug fix release
4 failed my-app-2.0.0 2.0.0 Failed upgrade
5 deployed my-app-1.2.0 1.2.0 Rollback to revision 3
History Status Meanings:
  • deployed: Currently deployed revision
  • superseded: Replaced by a newer revision
  • failed: Revision that failed to deploy
  • pending-install: Installation in progress
  • pending-upgrade: Upgrade in progress
  • pending-rollback: Rollback in progress
Recovery Strategies
# Strategy 1: Standard Rollback # Revert to a previous revision helm history my-release helm rollback my-release 2 # Strategy 2: Force Rollback # Use when immutable fields are an issue helm rollback my-release 2 --force # Strategy 3: Cleanup and Rollback # Clean up failed resources before rollback helm rollback my-release 2 --cleanup-on-fail # Strategy 4: Manual Resource Recovery # Reapply manifests from a specific revision helm get manifest my-release --revision 2 > revision-2.yaml kubectl apply -f revision-2.yaml # Strategy 5: Restore from Backup # Restore release secret from backup kubectl apply -f backup-release-secret.yaml # Strategy 6: Uninstall and Reinstall # Last resort: clean install helm uninstall my-release --keep-history helm install my-release ./my-chart # Strategy 7: Use --atomic for Future Upgrades # Prevent needing rollback in the first place helm upgrade my-release ./my-chart --atomic # Strategy 8: Use ArgoCD for GitOps Rollback # Rollback via Git revert git revert HEAD git push # Strategy 9: Manual Rollback with kubectl # Apply previous manifests manually kubectl apply -f previous-deployment.yaml kubectl rollout status deployment/my-app # Strategy 10: Blue-Green Recovery # Switch traffic back to previous version kubectl patch service my-app -p '{"spec":{"selector":{"version":"blue"}}}'

Standard Rollback

Use helm rollback to revert to a previous revision.

Force Rollback

Use --force when immutable fields block rollback.

Cleanup Rollback

Use --cleanup-on-fail to clean up before rollback.

Manual Recovery

Apply manifests from a specific revision manually.

Restore from Backup

Restore release secrets from a backup.

Uninstall/Reinstall

Clean install as a last resort.
Recovery Best Practices:
  • Always have a rollback plan
  • Test rollback procedures in staging
  • Use --atomic for automatic rollback
  • Keep backups of release secrets
  • Document recovery procedures
  • Use GitOps for easier rollbacks
Preventing Rollback Failures
# Prevention 1: Use --atomic for automatic rollback helm upgrade my-release ./my-chart --atomic # Prevention 2: Use --wait for resource readiness helm upgrade my-release ./my-chart --wait # Prevention 3: Use --timeout for sufficient time helm upgrade my-release ./my-chart --timeout 15m # Prevention 4: Test upgrades in staging first helm upgrade my-release ./my-chart --dry-run --debug # Prevention 5: Use --history-max for history retention helm upgrade my-release ./my-chart --history-max 20 # Prevention 6: Backup release secrets kubectl get secret sh.helm.release.v1.my-release.v1 -o yaml > backup.yaml # Prevention 7: Use GitOps for deployments # Rollback is just a Git revert # Prevention 8: Use canary deployments helm upgrade my-release ./my-chart --set canary.enabled=true # Prevention 9: Use blue-green deployments # Two environments for instant switching # Prevention 10: Monitor deployments kubectl rollout status deployment/my-app kubectl get pods -l app=my-app # Prevention 11: Use proper health checks # readinessProbe, livenessProbe # Prevention 12: Use resource limits # Prevent resource exhaustion # Prevention 13: Validate values before upgrade helm lint ./my-chart --strict # Prevention 14: Use values schema validation # values.schema.json # Prevention 15: Test with different value combinations helm template my-release ./my-chart -f values-prod.yaml
Prevention Checklist:
  • Always use --atomic for production upgrades
  • Test upgrades in staging first
  • Use proper health checks
  • Set appropriate resource limits
  • Validate values before upgrade
  • Keep release history manageable
  • Back up release secrets
  • Monitor deployments after upgrade
Frequently Asked Questions
How do I rollback a failed Helm release?
Use helm rollback <release> <revision> to revert to a previous revision. If the release is in a failed state, use --force to force the rollback.
What if rollback fails with "another operation in progress"?
Check for pending operations with helm list --pending. Delete the release secret to clear the lock, or wait for the operation to complete. Use --force to force rollback.
How do I view release history?
Use helm history <release> to view all revisions. Each revision shows status, chart version, and description.
What is the default history limit?
Helm keeps the last 10 revisions by default. You can change this with --history-max during installation or upgrade.
Can I rollback to a specific revision?
Yes, use helm rollback <release> <revision-number> to rollback to a specific revision. Check the revision number with helm history.
How do I prevent rollback failures?
Use --atomic for automatic rollback, test in staging first, use proper health checks, validate values, and back up release secrets.
What happens to release history after rollback?
Rollback creates a new revision in history. The previous revisions remain in history, allowing further rollbacks if needed.
How do I recover a release with no history?
If history is lost, you need to reinstall the release. Use helm uninstall (keep history) and helm install. Or restore from backup of release secrets.
Previous: Common Helm Issues Next: Helm Interview Questions

Rollback troubleshooting is a critical skill for Helm operators. Understand the common failure modes, know the recovery strategies, and always test rollback procedures before production deployment.