Helm Releases in Kubernetes: Tracking Every Install, Upgrade, and Rollback
Learn what a Helm release really is, how it is named, stored, versioned, and inspected, how its states change over time, and how to upgrade, roll back, and remove releases safely without losing track of what is running in your cluster.
Think about a car and its service book. The car maker publishes one design, called a model, and thousands of people buy cars of that model. But every individual car has its own registration number, its own owner, its own colour, and its own service book listing every repair and inspection it has ever had. If you want to know what has been done to your car, you do not read the model brochure; you read your car’s service book. In Helm, a chart is the model, and a release is your individual car, together with its service book. Understanding releases is the key to running Helm confidently in real life.
1Why Understanding Releases Matters
Charts get the attention, but releases are what you actually operate.
Most introductions to Helm spend their time on charts, the packages that describe an application. That is natural, because charts are what people write and share. But once an application is running in a cluster, the chart is no longer the thing you work with every day. What you work with is the release: the specific, named installation of that chart, with its own settings, its own history, and its own current state.
Almost every practical question about Helm is really a question about a release. Which version of the application is running in production right now? What values were used the last time we upgraded? Why is the upgrade stuck? How do I go back to yesterday’s version? Can two teams install the same chart without disturbing each other? Every one of these questions is answered by understanding how releases are named, recorded, and changed.
A recipe book describes how to bake a cake. But the cake sitting on your kitchen table is a particular cake, baked on a particular day with the sugar you chose. If someone asks how sweet it is, you check what you did that day, not the general recipe. A release is the particular cake, and its history is your baking diary.
What goes wrong when releases are misunderstood
Teams that do not understand releases often lose track of what is deployed, overwrite each other’s installations by accident, fail to recover from interrupted upgrades, or rely on rollback to protect things it cannot protect. These problems are avoidable. Once the release model is clear, Helm becomes predictable and much less stressful to use.
This guide assumes you have met the idea of a chart and have seen Helm mentioned before, but every term is explained again when it first appears. It focuses on the release side of Helm: what it is, how it changes, and how to keep it healthy.
2What Is a Helm Release?
A named, tracked installation of a chart in one namespace of a cluster.
A Helm release is one instance of a chart that has been installed into a Kubernetes cluster. It is made of three things that always go together: the chart that was installed, the values that were used to customise it, and the set of Kubernetes resources that were created from the result. Helm gives the release a name and keeps a record of it, so it can recognise the installation later and change it in a controlled way.
The same chart can be installed many times. Each installation is a separate release with its own name, its own values, and its own life. Installing a database chart three times, for three different teams, creates three independent releases. They share the same blueprint, but they do not share state or settings. This is what makes charts reusable and releases safe to run side by side.
flowchart TD
C[One chart
the blueprint] --> R1[Release: shop-db
values for the shop team]
C --> R2[Release: blog-db
values for the blog team]
C --> R3[Release: test-db
values for testing]
R1 --> K1[Resources in the shop namespace]
R2 --> K2[Resources in the blog namespace]
R3 --> K3[Resources in the test namespace]
The chart
The package that was installed, including its templates, default values, and version information at the time of installation.
The values
The choices that customised the chart for this particular installation, layered on top of the chart defaults.
The resources
The actual Kubernetes objects created in the cluster, such as workloads, services, and configuration objects.
The history
A numbered list of everything that has happened to the release, from the first install to the latest change.
A release is not the running application itself. It is Helm’s record and management of the resources that make up the application. Kubernetes runs the pods, while Helm remembers how they were created and knows how to change them.
3What Is Inside a Release Record
Every revision stores enough information to describe and repeat what happened.
Each time Helm installs, upgrades, or rolls back a release, it writes a record describing the result. This record is the release’s memory. Everything Helm can tell you about a release, and everything it needs to roll one back, comes from these stored records. Knowing what is inside them explains a lot of Helm’s behaviour and also shows why they deserve protection.
| Stored Item | What It Contains | What It Is Used For |
|---|---|---|
| Release name and namespace | The identity of the release | Finding the release again and keeping names unique |
| Revision number | Which numbered version of the release this record describes | Building history and choosing rollback targets |
| Chart | A copy of the chart as it was installed, including templates and default values | Reproducing the release and rolling back without needing the original chart |
| Supplied values | The values the user provided for this revision | Showing what was customised and reusing settings |
| Rendered manifests | The final resources that were sent to the cluster | Comparing revisions and calculating what an upgrade must change |
| Hooks | The special resources tied to lifecycle moments | Running them at the right time |
| Status information | First deployed time, last deployed time, current state, and a short description | Telling you whether the release is healthy and what happened last |
| Notes | The message the chart showed after installation | Reminding users how to reach or use the application |
Imagine a service book that, for each visit to the garage, lists which parts were fitted, which settings were chosen, the date, and the mechanic’s comments, and even staples a copy of the workshop manual page that was used. With such a book, any mechanic can understand exactly what was done and repeat or reverse it.
Why a copy of the chart is stored
Helm stores the chart itself inside each revision record. This is what makes rollback independent of where the chart came from. Even if the chart repository disappears or the chart is removed from your computer, Helm can still restore an earlier revision, because everything it needs is stored with that revision.
Because the record contains the supplied values and the rendered manifests, any secret you passed through values is stored in it. Whoever can read the record can read those secrets, so access to release records must be protected carefully.
4Release Names and Namespaces
A release is identified by its name together with its namespace.
Every release has a name, chosen by the person who installs it, and it lives in one namespace. The pair of name and namespace identifies the release. Two releases with the same name can exist as long as they live in different namespaces, but within a single namespace each name must be unique. This scoping is a big improvement of the current major version over the first one, where names were global across the whole cluster.
Unique within a namespace
You cannot install two different releases with the same name in the same namespace. Trying to do so reports that the name is already in use.
Reusable across namespaces
The same name can be used in another namespace, which makes it easy to run identical releases for different teams or environments.
Length is limited
Release names are limited to a modest length, because they are used to build the names of many resources, which have their own length limits.
Names cannot be changed
A release cannot be renamed or moved to another namespace. To change either, you install a new release and remove the old one.
Think of apartment numbers in different buildings. Apartment 4B can exist in every building, and nobody is confused, because the building address tells you which one is meant. Within one building, though, only one apartment can be 4B. The namespace is the building, and the release name is the apartment number.
Why names shape your resources
Most charts build the names of their resources from the release name, so that two releases of the same chart never clash. A release called shop-db might create a workload called shop-db and a service called shop-db. Choosing clear release names therefore also makes every resource in the cluster easier to recognise and search.
Choose names that describe the purpose, not the technology, and agree on a convention across teams. A predictable pattern, such as purpose followed by environment, saves time when many releases share a cluster.
By default, Helm expects the namespace to exist already. If it does not, the install fails unless you explicitly ask Helm to create it. Note that a namespace created that way is not managed as part of the release, so removing the release does not remove the namespace.
5Revisions and Release History
Every change adds a numbered entry, and nothing is silently overwritten.
A revision is a numbered version of a release. The first install creates revision one. Every upgrade creates the next number, and so does every rollback. The list of all revisions is the release history, and it is what lets you see exactly what changed and when. Because each revision stores its own chart, values, and manifests, any of them can be inspected or restored.
sequenceDiagram
participant U as User
participant H as Helm
participant S as Release records
U->>H: Install
H->>S: Store revision 1
U->>H: Upgrade with new image
H->>S: Store revision 2
U->>H: Upgrade with new setting
H->>S: Store revision 3
U->>H: Roll back to revision 2
H->>S: Store revision 4 with the content of revision 2
Rollback moves forward in history
A common surprise is that rolling back to revision two does not make the release go back to being revision two. Instead, Helm creates a new revision, number four in the example above, whose content is a copy of revision two. The history therefore stays complete and honest: it shows the release was upgraded twice and then rolled back, rather than pretending the later revisions never happened.
| Revision | Action | Resulting State | Notes |
|---|---|---|---|
| 1 | Install | Superseded later | First version of the release |
| 2 | Upgrade | Superseded later | New application image |
| 3 | Upgrade | Superseded later | Changed setting that caused problems |
| 4 | Rollback to revision 2 | Deployed | Current version, content copied from revision 2 |
A bank statement never erases a mistaken payment; it adds a refund line. The record stays complete, and anyone reading it can see what happened. Helm’s history works the same way: mistakes and corrections both appear as entries.
To stop records from growing forever, upgrades keep only a limited number of past revisions, ten by default, and older ones are removed. If you need a longer audit trail, keep the information in your version control system or raise the limit.
6Release States and What They Mean
A release always has a status, and each status tells you what to do next.
Each revision of a release carries a status that describes its condition. Reading the status is the fastest way to know whether a release is healthy, still being worked on, or in need of repair. There are a small number of statuses, and learning them removes most of the mystery from Helm’s output.
| Status | Meaning | What You Should Do |
|---|---|---|
| deployed | The latest successful revision, currently live | Nothing; this is the healthy state |
| superseded | An older revision replaced by a newer one | Nothing; it stays in history for rollback |
| failed | The operation for this revision did not succeed | Read the error, then fix and retry or roll back |
| uninstalled | The release was removed but its history was kept | Reinstall if needed or remove the history |
| uninstalling | Removal is in progress | Wait; investigate if it never finishes |
| pending-install | An install is in progress | Wait; if stuck, the operation was interrupted |
| pending-upgrade | An upgrade is in progress | Wait; if stuck, the operation was interrupted |
| pending-rollback | A rollback is in progress | Wait; if stuck, the operation was interrupted |
| unknown | Helm cannot determine the state | Inspect the release and the cluster carefully |
stateDiagram-v2
[*] --> pending_install
pending_install --> deployed: success
pending_install --> failed: error
deployed --> pending_upgrade: upgrade starts
pending_upgrade --> deployed: success
pending_upgrade --> failed: error
deployed --> pending_rollback: rollback starts
pending_rollback --> deployed: success
deployed --> uninstalling: uninstall starts
uninstalling --> uninstalled: history kept
uninstalling --> [*]: history removed
Think of a parcel tracking page. A parcel is “in transit,” “delivered,” “failed delivery,” or “returned.” Each status tells you what to expect and what to do. Release statuses do the same for your deployments.
If a Helm command is interrupted, for example by a lost connection or a cancelled pipeline, the release can be left in a pending state. Helm then refuses further changes, believing an operation is still running. Such a release needs inspection and usually a rollback or repair before it can be used again.
7Creating a Release: The Install Lifecycle
From a chart and some values to a recorded, running release.
Installing a release turns a chart and a set of values into resources in a cluster and a first revision in history. Helm does this in a fixed sequence, and knowing the sequence helps you understand where failures can occur and what state a failed install leaves behind.
Validate the request
Helm checks that the chart is valid, that the name is not already used in the namespace, and that the supplied values pass any schema the chart provides.
Render the templates
The templates are filled in with the merged values. If rendering fails, nothing is sent to the cluster and no release is created.
Record a pending revision
Helm stores revision one with a pending-install status, so that an interrupted install can be recognised later.
Run pre-install hooks and create resources
Hooks tied to the moment before installation run first. Then the main resources are created in the cluster.
Optionally wait for readiness
If requested, Helm waits until the resources report that they are ready, up to a chosen time limit.
Run post-install hooks and mark deployed
Post-install hooks run, and the revision’s status is updated to deployed. Helm shows the chart’s notes to the user.
flowchart TD
A[Install requested] --> B{Name free and values valid?}
B -->|No| X[Stop, nothing created]
B -->|Yes| C[Render templates]
C --> D{Render succeeded?}
D -->|No| X
D -->|Yes| E[Record pending revision]
E --> F[Create resources]
F --> G{Resources accepted and ready?}
G -->|Yes| H[Status: deployed]
G -->|No| I[Status: failed]
Before installing, use the dry-run option to render and validate the release without creating anything. It shows exactly what would be created and catches most mistakes cheaply.
If an install fails after the pending revision was recorded, the failed release remains and keeps its name. Retrying with the same name fails until you remove the failed release or use the combined install-or-upgrade action.
8Changing a Release: The Upgrade Lifecycle
An upgrade applies a new chart version or new values and records a new revision.
An upgrade changes an existing release. You may give it a newer version of the chart, different values, or both. Helm renders the new manifests, compares them with what is currently deployed, updates only what changed, and records the result as the next revision. The previous revision becomes superseded but remains in history.
The three-way comparison
To decide what to change, Helm compares three sources of information: the manifests from the last deployed revision, the live state of the resources in the cluster, and the newly rendered manifests. This is called a three-way merge. It lets Helm apply the differences between the old and the new chart while also noticing resources that were changed directly in the cluster, producing a more sensible outcome than simply overwriting everything.
flowchart LR
OLD[Last deployed manifests] --> M[Three-way merge]
LIVE[Live state in the cluster] --> M
NEW[Newly rendered manifests] --> M
M --> P[Patch sent to the cluster]
P --> REV[New revision recorded]
Imagine renovating a room. You have the original plan, the room as it looks today, including anything the tenant changed, and the new plan. A sensible builder looks at all three before deciding what to change, rather than tearing everything down and rebuilding from the new plan alone.
| Situation | How Helm Handles It |
|---|---|
| A resource exists in the new chart but not the old one | Helm creates it |
| A resource exists in the old chart but not the new one | Helm removes it |
| A field changed between old and new manifests | Helm patches the resource with the new value |
| A field was edited by hand in the cluster and not in the chart | Helm usually leaves the manual edit alone unless the chart also changes that field |
| The change touches a field that cannot be modified | The upgrade fails and the object must be recreated deliberately |
Automation usually uses the combined action that installs the release if it does not exist and upgrades it if it does. The same instruction works on the first run and on every later run, which keeps pipelines simple.
Changing live resources by hand makes the cluster differ from the release record. Sometimes Helm preserves the edit, sometimes it overwrites it, and sometimes it fails. The safest habit is to make every change through the chart and its values.
9Going Back: Rolling Back a Release
Return to an earlier revision quickly, as long as you understand its limits.
When an upgrade goes badly, rollback lets you return the release to an earlier revision. You name the revision you want, or leave it out to return to the one before the current one. Helm takes the stored manifests of that revision, reapplies them to the cluster, and records the result as a new revision. Because the chart is stored inside each revision, rollback works even if the original chart is no longer available.
sequenceDiagram
participant U as User
participant H as Helm
participant S as Release records
participant K as Cluster
U->>H: Roll back to revision 2
H->>S: Read manifests of revision 2
H->>S: Store new revision 4 as pending-rollback
H->>K: Apply the older manifests
K-->>H: Resources updated
H->>S: Mark revision 4 deployed
What rollback does well
- Restores the previous manifests quickly and consistently
- Works without the original chart being available
- Keeps history honest by adding a new revision
- Uses the same waiting and timeout options as other operations
What rollback cannot do
- Undo changes made to data or database structure
- Restore resources created by hooks that were never tracked
- Bring back custom definitions that Helm does not manage
- Fix a problem caused outside the release, such as an external service
Rollback is like restoring a previous layout of a document. The pages return to how they looked, but if someone already printed and mailed copies of the newer version, those copies are still out there. Data written by the newer application is like those mailed copies: rolling back the layout does not recall them.
If an upgrade ran a database migration, the older application may not understand the new data structure. Design migrations so the previous version keeps working, and take a backup before any risky upgrade.
10Ending a Release: Uninstalling and Keeping History
Removal deletes the resources, and you decide whether the memory of them stays.
Uninstalling a release removes the resources that the release created. By default, Helm also removes the release’s history, so the name becomes free again. If you ask Helm to keep the history, the resources are still removed, but the records remain with an uninstalled status. You can then still see what was installed, and in some cases roll back to bring the release back to life.
Remove everything
The default. Resources and history disappear, and the release name can be reused straight away. Best for temporary environments.
Keep history
Resources go, but the records stay. Useful for audit, and for the ability to see or restore what was there. The name stays reserved until the history is removed.
Resources that should survive uninstall
Some resources are too valuable to remove automatically, such as storage that holds data. A resource can carry an annotation that tells Helm to keep it when the release is removed. Helm then leaves the resource in place and stops tracking it. This protects data, but the resource becomes an orphan that someone must eventually clean up.
flowchart TD
U[Uninstall requested] --> H1[Run pre-delete hooks]
H1 --> D[Delete tracked resources]
D --> K{Any resource marked to keep?}
K -->|Yes| KEEP[Leave it in the cluster, untracked]
K -->|No| C[Continue]
KEEP --> C
C --> H2[Run post-delete hooks]
H2 --> Q{Keep history?}
Q -->|Yes| S[Status uninstalled, records kept]
Q -->|No| G[Records removed, name free]
Moving out of a rented flat means taking down your furniture. You may ask the landlord to keep a note of what you had, which is like keeping history. And a few items, like a fitted wardrobe, may stay behind on purpose, just as annotated resources stay after the release is gone.
Custom resource definitions installed from a chart’s dedicated folder are not deleted when the release is removed, to avoid destroying every custom object of that type. Plan a separate cleanup step if you truly want them gone.
11Inspecting a Release
Helm can tell you almost everything about a release without touching it.
A large part of running releases well is knowing how to look at them. Helm provides read-only commands that show the list of releases, the status of one release, its history, the values it uses, the manifests it deployed, and the notes it produced. These commands are safe to run at any time and are the first tools to reach for when something looks wrong.
| What You Want to Know | What to Ask Helm For | What You Learn |
|---|---|---|
| Which releases exist | The list of releases, optionally filtered by status or namespace | Names, namespaces, revisions, statuses, chart versions |
| How one release is doing | Its status | Current state, last deployed time, and notes |
| What happened over time | Its history | All revisions with status, chart, and description |
| Which values were supplied | The values of the release | Your customisations, or the full computed set if requested |
| What was deployed | The manifest of the release | The final resources sent to the cluster |
| Which hooks exist | The hooks of the release | Resources tied to lifecycle moments |
| What the chart told the user | The notes of the release | The post-install message |
flowchart TD
A[Something looks wrong] --> B[List releases
is the status deployed?]
B --> C[Read history
what changed last?]
C --> D[Read supplied values
are they what you expect?]
D --> E[Read deployed manifest
is that what you intended?]
E --> F[Inspect cluster resources
events and pod status]
A doctor first reads your chart, then your history, then your medication list, and only then examines you. Reading the release’s records first often reveals the problem before anyone needs to touch the cluster.
By default, asking for a release’s values shows only what you supplied. Asking for all values shows the merged result including chart defaults. Use the second when you want to know what the chart really used.
12Values Across Upgrades: Reuse or Reset
What happens to your earlier choices when you upgrade is a frequent source of surprises.
When you upgrade a release, Helm needs to decide which values to use. By default, it does not carry over the values you supplied last time; it starts again from the chart’s defaults and applies whatever values you provide in this upgrade. This means that if you forget to pass your earlier customisations again, they silently disappear and the release changes back toward defaults.
Reset values
The default behaviour. Start from the chart defaults and apply only the values given now. Predictable, but earlier overrides are lost unless repeated.
Reuse values
Start from the values stored with the last revision and apply new ones on top. Convenient, but it can hide changes to the chart’s own defaults.
Reset then reuse
A newer combination that applies the new chart’s defaults first, then your previously supplied values, then any new overrides. It aims to avoid both problems.
Imagine ordering coffee at a shop that forgets you between visits. If you just say “the usual,” they give you the standard drink. To get oat milk again, you must say so every time, or show them your saved card. Reuse is like having the shop keep your card, but if the shop changes its standard recipe, the card may hide the change.
The safest habit
The most reliable practice is to keep all your values in files under version control and pass the complete set on every upgrade. Then the release always reflects the files, no matter what was stored last time. This removes guesswork, makes upgrades repeatable, and makes it possible to rebuild a release from scratch in another cluster.
A colleague upgrades a release from their laptop with only the one setting they wanted to change. All earlier customisations are dropped, and production quietly returns to defaults. Values in version control, applied by a pipeline, prevent this.
13Ownership: Which Resources Belong to Which Release
Helm marks what it creates, and refuses to take over what belongs to someone else.
Helm needs to know which resources belong to a release so it can update or remove them later. It does this by adding markers to every resource it creates: a label saying the resource is managed by Helm, and annotations recording the name and namespace of the release that owns it. When Helm later works on a release, it looks at these markers to be sure it only touches its own resources.
Managed-by label
A label that says the resource was created and is managed by Helm. It makes Helm-managed resources easy to find.
Release name annotation
Records which release owns the resource. Helm refuses to change a resource owned by a different release.
Release namespace annotation
Records the namespace of the owning release, completing the identity of the owner.
Conflicts and adoption
If a chart tries to create a resource that already exists and is not owned by that release, Helm stops with an error about the resource already existing. This protects you from two releases accidentally fighting over the same object. In some situations, though, you deliberately want a release to take over an existing resource, for example when moving hand-made resources under Helm’s management. This is done by adding the correct ownership markers to the existing resource, after which Helm adopts it.
flowchart TD
A[Chart wants to create a resource] --> B{Resource already exists?}
B -->|No| C[Create it and add ownership markers]
B -->|Yes| D{Owned by this release?}
D -->|Yes| E[Update it normally]
D -->|No| F[Stop with an ownership error]
F --> G[Remove it, rename it, or adopt it deliberately]
Library books carry a stamp saying which library owns them. If you try to return a book stamped by another library, the desk refuses to accept it. To transfer ownership, someone must change the stamp on purpose.
Resources that are not tied to a namespace, such as cluster roles, have one name for the whole cluster. Two releases of the same chart can clash over them even in different namespaces, unless the chart builds their names from the release name.
14Many Releases of One Chart
The power of separating the blueprint from its installations.
Because a release is an independent installation, you can create as many releases of the same chart as you need. This is the foundation of many practical setups: one release per environment, one per team, one per customer, or one per pull request. Each has its own values, its own history, and its own lifecycle, and changing one never affects the others.
One release per environment
The same chart is installed as a development, staging, and production release, each with its own values file. Differences between environments are visible in small files instead of hidden in copied manifests.
One release per team or tenant
A platform team offers a chart, and every tenant installs its own release in its own namespace. Each tenant controls its own values and upgrade timing.
One release per customer
Software vendors that host a separate instance for each customer create a release for each one, and upgrade them in batches, starting with the least critical.
One release per pull request
Pipelines install a temporary release for each proposed change and remove it after merging, giving reviewers a live preview with no leftovers.
flowchart LR
CH[Chart version 2.0] --> D[dev release
values-dev]
CH --> S[staging release
values-staging]
CH --> P[production release
values-prod]
D -->|promote after testing| S
S -->|promote after approval| P
Releases are independent only if the chart names its resources from the release name. Charts that use fixed names for cluster-wide or shared resources make releases collide. Test installing the chart twice before promising it can be reused.
15Where Release Records Live and Their Limits
Records are ordinary cluster objects, with ordinary size limits.
By default, Helm stores each revision as a Secret in the release’s namespace, with a name that includes the release name and the revision number. The content is compressed and encoded to keep it small. Helm can be configured to use configuration maps instead, or a database, but secrets are the default and the most common choice.
Secrets
The default. One secret per revision in the release namespace. Access can be controlled with the same permissions as other secrets.
Configuration maps
An alternative that stores the same records in configuration maps. Easier to read casually, but with different access implications.
Database
A database backend can be used when very large or numerous records make cluster storage unsuitable. It needs its own operation and protection.
The size limit
Kubernetes limits how large a single stored object can be, roughly one megabyte. A release record contains the entire chart, the values, and all the rendered manifests. For a very large chart, or one that embeds big files, the record can exceed the limit, and installs or upgrades fail with a size error. The remedies are to split the chart into smaller releases, remove large files from the chart, and avoid packing big data into values.
Advantages of in-cluster records
- No separate database to run or back up
- Access is controlled by ordinary cluster permissions
- Records live in the same namespace as the release
- Deleting the namespace cleans up the records too
Disadvantages / Trade-offs
- Object size limit constrains very large charts
- Many revisions consume cluster storage
- Losing the namespace loses the history
- Anyone who can read secrets can read the history
Removing release records directly makes Helm forget the release while its resources keep running. It is sometimes done to repair a stuck release, but it should be a last resort, done with care and a backup of what you remove.
16Hooks and Their Relationship to Releases
Hooks run at moments in a release’s life, but they are not fully part of it.
Hooks are special resources, typically short jobs, that Helm runs at defined moments of a release’s lifecycle: before or after install, upgrade, rollback, or deletion. They are recorded as part of the release, and Helm waits for them to complete before moving on. This makes them ideal for tasks such as database migrations before an upgrade, or cleanups after removal.
However, hooks differ from normal resources in one important way. Helm does not manage them as part of the release’s regular set of resources. When the release is upgraded or uninstalled, hook resources are not automatically updated or deleted unless a deletion policy says so. An unmanaged leftover job can block the next run of the same hook because of a name clash, or clutter the namespace.
| Aspect | Regular Resource | Hook Resource |
|---|---|---|
| Created | With the release | At a specific lifecycle moment |
| Tracked for update and removal | Yes | Only through its deletion policy |
| Blocks the release while running | Only if waiting is requested | Yes, Helm waits for it to finish |
| Typical kind | Long-running workloads | Short-lived jobs |
| Failure effect | Depends on waiting options | Fails the release operation |
sequenceDiagram
participant H as Helm
participant J as Pre-upgrade hook job
participant K as Cluster
H->>J: Start hook and wait
J->>K: Run migration
alt Job succeeds
J-->>H: Completed
H->>K: Apply upgrade
else Job fails
J-->>H: Failed
H-->>H: Release revision marked failed
end
Give every hook a deletion policy so that completed hook jobs are cleaned up, and design hook jobs so they can safely run twice, because retries after failures will run them again.
17Releases in CI/CD and GitOps
Automation manages releases best when the desired state lives in version control.
In automated delivery, a release is the unit that pipelines create and update. A pipeline typically builds an image, updates the values or chart version, and runs the install-or-upgrade action against the target namespace, then waits for readiness. The chart and the values files live in version control, so every revision of a release can be traced to a commit.
Pipeline push
A pipeline runs Helm with cluster credentials. It is easy to understand, but the pipeline holds powerful credentials and drift is only corrected when the pipeline runs.
GitOps controller
A controller in the cluster watches a repository and manages releases declared there. It continually compares desired and actual state and can correct drift.
Render only
Some tools render the chart to plain manifests and apply those, without keeping Helm release records at all. Release commands then no longer show that application.
flowchart LR
G[Git repository
chart reference and values] --> C[Controller or pipeline]
C --> R[Release in the cluster]
R --> S[Status and history]
S -->|report back| C
D[Manual change in the cluster] -.drift.-> R
C -.corrects.-> R
If a controller manages a release, changing it manually with Helm creates a fight between the two. Decide who owns each release, and make all changes through that owner.
18Handling Failures: Waiting, Timeouts, Atomic Operations, and Stuck Releases
Operations fail sometimes, and how you configure them decides what state you are left in.
By default, Helm reports success once the cluster has accepted the manifests. That says nothing about whether pods started or became healthy. Three options change this behaviour and make releases safer.
Wait
Helm waits until the resources it created are ready before declaring success, so a stuck rollout is detected by the pipeline instead of by users.
Timeout
The maximum time Helm waits. If resources are not ready by then, the operation is marked as failed.
Atomic
On failure, Helm automatically rolls the release back, or for a failed install, removes it, leaving a clean, known state.
Recovering a stuck release
Confirm nothing is still running
Make sure no pipeline or person is still executing an operation on the release. A stuck pending state is only safe to fix once you know that.
Read the history and status
Find the last revision that was deployed successfully and see what the pending or failed revision tried to do.
Roll back to the last good revision
A rollback to a deployed revision usually clears the stuck state and restores a working release.
Repair records only as a last resort
If rollback is not possible, the stuck record may have to be corrected or removed by hand. Back up the record first and do this with great care.
Fix the cause and retry
Address whatever caused the failure, such as a bad value, an unavailable image, or a quota, and run the upgrade again.
Automatic rollback restores manifests, not data. If a hook or migration already changed data before the failure, rolling back the application may leave it facing data it does not understand.
19Performance and Scale Considerations
Helm itself is light, but the number and size of releases shape how it behaves.
Helm does little work of its own: it renders text, compares manifests, and talks to the API server. The costs that appear at scale come from the records and from the resources being managed. Every operation reads release records, so large records and long histories make commands slower. Releases with hundreds of resources take longer to apply and to wait for. Clusters with thousands of releases produce long lists that are slow to scan without filters.
Advantages
- No server component to scale, since Helm is client-only
- Rendering and comparing manifests is fast
- Records live beside the release and are cleaned up with the namespace
- Independent releases upgrade independently and in parallel
Disadvantages / Trade-offs
- Large releases approach object size limits
- Long histories consume storage and slow commands
- Listing every release in a huge cluster is slow
- Waiting for many resources lengthens pipelines
Keep releases focused
Prefer several small releases with clear owners over one giant release. Each is faster to upgrade and easier to recover.
Set a sensible history limit
Enough revisions for rollback and audit, not so many that records pile up. Keep long-term audit information in version control.
Filter when listing
Ask for one namespace or one status instead of scanning everything, particularly in clusters with many releases.
Keep large data out of charts and values
Store big files elsewhere and reference them, so records stay small and comfortably under size limits.
20Security Considerations
Release records and release operations both deserve careful protection.
Because Helm works with the permissions of the person or pipeline that runs it, the security of a release depends on who is allowed to change it and who is allowed to read its records. A release can create powerful resources, and its records contain everything that was supplied to it, including any secrets passed through values.
Protect who can read release records
Anyone who can read secrets in a release’s namespace can read its history, including values and rendered manifests. Limit that permission to those who truly need it.
Keep secrets out of values
Passwords passed through values are stored in every revision that uses them. Reference secrets managed elsewhere, and keep sensitive values out of version control.
Limit who can change releases
Grant pipelines and people access only to the namespaces they deploy to. A person able to upgrade a release can change what runs in it.
Verify what you install into a release
Use trusted sources, pinned versions, and signature verification for charts. A release is only as trustworthy as the chart behind it.
Remember namespace deletion removes history
Deleting a namespace removes its release records, and with them the ability to roll back. Protect important namespaces and keep history elsewhere if needed.
The history inside the cluster is not a complete audit log, since old revisions are pruned. Record who changed which release and when in your pipeline and version control system.
21Troubleshooting, Monitoring, and Metrics
Most release problems can be understood by reading records and cluster events in the right order.
| Symptom | Likely Cause | What To Do |
|---|---|---|
| Name already in use | A release, possibly failed or with kept history, holds the name | List releases including failed and uninstalled ones, then remove or reuse |
| Another operation is in progress | Release stuck in a pending state after an interruption | Confirm nothing is running, then roll back or repair |
| Resource already exists and is not owned | Object created outside the release or by another release | Remove it, rename it, or adopt it deliberately |
| Earlier settings disappeared after upgrade | Values were reset to defaults | Pass the full set of values from version control |
| Upgrade fails on an unchangeable field | Chart change touched an immutable field | Recreate the object deliberately or revert the change |
| Record too large | Chart or values exceed the object size limit | Split the release and remove large files |
| Release shows deployed but pods are failing | Success was declared before readiness | Enable waiting and inspect pod events |
Read the status and last description
The status and short description of the latest revision often name the failed step directly.
Compare revisions
See what changed between the last good revision and the failing one, in values, chart version, and rendered manifests.
Check the cluster
Look at events, pod status, and quotas for the resources the release created. The reason for many failures is only visible there.
Decide: fix forward or roll back
If the fix is small and known, upgrade again. If not, roll back to the last good revision and investigate calmly.
Releases not in deployed state
Count releases that are failed or pending. Each one needs attention before the next change is made.
Age of the last successful revision
A release that has not been updated in a long time may run outdated or vulnerable software.
Chart and application versions per release
An inventory of what runs where shows drift between environments and finds releases that missed an upgrade.
Operation duration and failure rate
Trends in how long releases take to apply, and how often they fail, warn you about growing charts and flaky pipelines.
22Design Patterns for Managing Releases
Reliable habits that keep many releases understandable.
Pattern: Values in files, files in Git
Keep every environment’s values in version control and pass the complete set on each upgrade. The release always matches the files, and any release can be rebuilt elsewhere.
Pattern: Install-or-upgrade with waiting and atomic behaviour
Use one repeatable command in pipelines that waits for readiness with a sensible timeout and reverts on failure where that is safe.
Pattern: Naming convention
Choose release names that state purpose and environment in a predictable pattern, so anyone can find the owner and the namespace of a release at a glance.
Pattern: Promote the same chart version
Deploy one chart version to development, then staging, then production, changing only the values files. What you tested is what you release.
Pattern: Separate stateful and stateless releases
Give databases and other stores their own releases with slower, more careful upgrades, apart from fast-moving application releases.
Pattern: Backup before risky upgrades
Take a snapshot or backup of data before upgrades that include migrations, since rollback restores manifests but not data.
flowchart TD
G[Values and chart version in Git] --> P[Pipeline]
P --> L[Lint and dry-run render]
L --> B[Backup if stateful]
B --> U[Upgrade with wait and atomic]
U --> V[Verify health]
V -->|failure| R[Automatic rollback and alert]
V -->|success| H[Record revision and notify]
23Anti-patterns to Avoid
Habits that make releases fragile and hard to recover.
Problem
Upgrading with only the single value you want to change.
Why It’s Harmful
Earlier customisations are reset to defaults, and production quietly changes in ways nobody intended.
Correct Approach
Pass the full set of values from version control on every upgrade.
Problem
Editing live resources by hand instead of through the release.
Why It’s Harmful
The cluster drifts from the release record, and the next upgrade may overwrite, preserve, or fail on the edit unpredictably.
Correct Approach
Change the chart or values and upgrade, so the release always describes reality.
Problem
Running upgrades that finish without waiting for readiness.
Why It’s Harmful
Pipelines report success for releases whose pods never become healthy, and users find the failure first.
Correct Approach
Wait for readiness with a timeout, and consider automatic rollback on failure.
Problem
Deleting release records by hand to make errors go away.
Why It’s Harmful
Helm forgets the release while its resources keep running, leaving orphans and making later installs collide.
Correct Approach
Repair with rollback first, and only touch records as a last resort after taking a backup of them.
Problem
Relying on rollback to protect data.
Why It’s Harmful
Rollback restores manifests only. Data changed by migrations stays changed, and the older version may not understand it.
Correct Approach
Back up before risky changes and design migrations to stay compatible with the previous version.
Problem
Letting two tools manage the same release.
Why It’s Harmful
A controller and a person keep overwriting each other, causing constant drift and confusing histories.
Correct Approach
Decide a single owner for each release and make all changes through it.
Problem
Packing an entire platform into one giant release.
Why It’s Harmful
Upgrades are slow and risky, one failure blocks everything, and the record may exceed the size limit.
Correct Approach
Split into focused releases with clear ownership and independent upgrade cycles.
24Best Practices and Common Mistakes
A short checklist for running releases with confidence.
Best Practices
- Name releases clearly and consistently
- Keep values files in version control and pass them fully every time
- Use the combined install-or-upgrade action in pipelines
- Wait for readiness and set a realistic timeout
- Keep a healthy history limit and export long-term audit records
- Back up data before upgrades that change it
- Practise upgrade and rollback on a test release
Common Mistakes
- Confusing a release with the running application
- Expecting rollback to erase the newer revisions from history
- Forgetting that a failed release still holds its name
- Ignoring pending states left by interrupted operations
- Letting secrets slip into values and records
- Using the same fixed resource names across releases
Deliberately break an upgrade in a test environment and practise recovering. Knowing exactly what a failed or pending release looks like turns a stressful incident into a routine repair.
25Real-World Scenarios
How teams handle releases in daily operations.
A retailer that lost its settings
A retailer upgraded a release from a laptop with only one changed value, and the resource limits and address settings returned to defaults, causing slowdowns. The team moved all values into version control, made a pipeline the only way to upgrade, and the problem never returned.
A startup recovering from an interrupted upgrade
A network drop interrupted a pipeline halfway through an upgrade, leaving the release pending. Helm refused further changes. The team confirmed nothing was still running, rolled back to the last deployed revision, fixed the pipeline timeout, and upgraded again.
A platform team offering releases to tenants
A platform team publishes a chart, and each tenant installs its own release in its own namespace. Tenants upgrade on their own schedule, and the platform team can see every release, its chart version, and its status to find tenants running outdated versions.
A vendor hosting one release per customer
A software vendor runs a release for each customer, and upgrades them in waves, beginning with internal and low-risk customers. The release history of each customer shows exactly which version they run and when it changed.
An operations team cleaning up orphans
During a clean-up, a team found storage volumes left behind by uninstalled releases whose resources were marked to be kept. They added a review step to the uninstall process so kept resources are either adopted by a new release or removed on purpose.
26Frequently Asked Questions
A release is one named installation of a chart in a namespace of a cluster, together with the values used, the resources created, and a numbered history of every change.
A chart is the reusable package. A release is one installed instance of it. One chart can produce many releases, each independent and with its own values and history.
Yes, if they are in different namespaces. Within one namespace, each release name must be unique.
By default as secrets in the release’s namespace, one per revision. Each contains the chart, values, manifests, and status, and can be configured to use other storage.
No. Rollback creates a new revision whose content copies the older one. The history keeps all entries, showing both the upgrades and the rollback.
By default, an upgrade starts from the chart’s defaults and applies only the values given now. Pass all your values every time, or use the reuse options carefully.
An operation is recorded as in progress. If it stays pending, the operation was probably interrupted. Confirm nothing is running, then roll back or repair before making further changes.
No. Install a new release with the desired name or namespace and remove the old one, taking care to preserve data.
Tracked resources are removed, which may include storage. Resources marked to be kept stay behind. Back up data before uninstalling anything that holds it.
An object with that name exists and is not owned by this release. Remove it, rename it, or adopt it by adding the correct ownership markers.
Upgrades keep ten past revisions by default and remove older ones. The limit can be changed, and long-term audit records should live in version control.
The controller. Manual changes with Helm would conflict with it, so make every change through the repository that the controller watches.
27Summary and Key Takeaways
A Helm release is the living, named installation of a chart in a cluster, and it is the thing you actually operate. Each release is identified by its name and namespace, remembers everything about its past through numbered revisions, and carries a status that tells you whether it is healthy, changing, or in need of repair. Records of every revision, including the chart, values, and rendered manifests, are stored in the cluster and make upgrades, rollbacks, and inspection possible.
Working well with releases means being deliberate: keep values in version control and pass them completely, wait for readiness, plan for failures and stuck states, protect the records that contain your settings, and remember that rollback restores manifests but not data. Decide who owns each release, keep releases small and focused, and rehearse recovery before you need it. With those habits, releases become predictable, reviewable, and safe to change.
Key Takeaways
- A release is an installed instance of a chart — identified by name and namespace, with its own values, resources, and history, independent of other releases of the same chart.
- Every change is a numbered revision — installs, upgrades, and rollbacks add entries, and a rollback creates a new revision instead of erasing later ones.
- Status tells you what to do — deployed is healthy, failed and pending states need attention, and interrupted operations can leave a release stuck.
- Records contain everything — the chart, supplied values, and manifests are stored per revision, so they enable rollback but must be protected as sensitive.
- Pass complete values on every upgrade — by default earlier customisations are reset, so keep values files in version control.
- Rollback does not undo data — plan backups and compatible migrations, because only manifests are restored.
- Choose one owner per release — whether a pipeline or a GitOps controller, and avoid hand edits so the release always matches reality.