Helm Releases in Kubernetes: Tracking Every Install, Upgrade, and Rollback

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.

Simple Analogy

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.

1
Release per installed instance of a chart
N
Numbered revisions in every release history
10
Default revisions kept during upgrades
i
Good to know

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]
FIG 1 — One chart can produce many independent releases, each with its own values and resources
Part 1

The chart

The package that was installed, including its templates, default values, and version information at the time of installation.

Part 2

The values

The choices that customised the chart for this particular installation, layered on top of the chart defaults.

Part 3

The resources

The actual Kubernetes objects created in the cluster, such as workloads, services, and configuration objects.

Part 4

The history

A numbered list of everything that has happened to the release, from the first install to the latest change.

!
Common Misconception

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 ItemWhat It ContainsWhat It Is Used For
Release name and namespaceThe identity of the releaseFinding the release again and keeping names unique
Revision numberWhich numbered version of the release this record describesBuilding history and choosing rollback targets
ChartA copy of the chart as it was installed, including templates and default valuesReproducing the release and rolling back without needing the original chart
Supplied valuesThe values the user provided for this revisionShowing what was customised and reusing settings
Rendered manifestsThe final resources that were sent to the clusterComparing revisions and calculating what an upgrade must change
HooksThe special resources tied to lifecycle momentsRunning them at the right time
Status informationFirst deployed time, last deployed time, current state, and a short descriptionTelling you whether the release is healthy and what happened last
NotesThe message the chart showed after installationReminding users how to reach or use the application
Simple Analogy

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.

!
Sensitive Content

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.

Rule 1

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.

Rule 2

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.

Rule 3

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.

Rule 4

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.

Simple Analogy

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.

i
Naming Advice

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.

!
Namespace Creation

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
        
FIG 2 — A rollback does not delete history; it adds a new revision

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.

RevisionActionResulting StateNotes
1InstallSuperseded laterFirst version of the release
2UpgradeSuperseded laterNew application image
3UpgradeSuperseded laterChanged setting that caused problems
4Rollback to revision 2DeployedCurrent version, content copied from revision 2
Simple Analogy

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.

i
History Limit

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.

StatusMeaningWhat You Should Do
deployedThe latest successful revision, currently liveNothing; this is the healthy state
supersededAn older revision replaced by a newer oneNothing; it stays in history for rollback
failedThe operation for this revision did not succeedRead the error, then fix and retry or roll back
uninstalledThe release was removed but its history was keptReinstall if needed or remove the history
uninstallingRemoval is in progressWait; investigate if it never finishes
pending-installAn install is in progressWait; if stuck, the operation was interrupted
pending-upgradeAn upgrade is in progressWait; if stuck, the operation was interrupted
pending-rollbackA rollback is in progressWait; if stuck, the operation was interrupted
unknownHelm cannot determine the stateInspect 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
        
FIG 3 — The main states a release moves through during its life
Simple Analogy

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.

!
The Pending Trap

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.

1

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.

2

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.

3

Record a pending revision

Helm stores revision one with a pending-install status, so that an interrupted install can be recognised later.

4

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.

5

Optionally wait for readiness

If requested, Helm waits until the resources report that they are ready, up to a chosen time limit.

6

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]
        
FIG 4 — Failures before recording leave nothing behind; later failures leave a failed release
i
Practical Tip

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.

!
A Failed Install Still Reserves the Name

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]
        
FIG 5 — An upgrade compares old, live, and new state before applying a patch
Simple Analogy

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.

SituationHow Helm Handles It
A resource exists in the new chart but not the old oneHelm creates it
A resource exists in the old chart but not the new oneHelm removes it
A field changed between old and new manifestsHelm patches the resource with the new value
A field was edited by hand in the cluster and not in the chartHelm usually leaves the manual edit alone unless the chart also changes that field
The change touches a field that cannot be modifiedThe upgrade fails and the object must be recreated deliberately
i
Install or Upgrade in One Step

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.

!
Hand Edits Create Surprises

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
        
FIG 6 — Rollback reapplies stored manifests and records a new revision

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
Simple Analogy

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.

!
Think About Data First

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.

Choice 1

Remove everything

The default. Resources and history disappear, and the release name can be reused straight away. Best for temporary environments.

Choice 2

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]
        
FIG 7 — Uninstalling removes tracked resources and either keeps or removes the records
Simple Analogy

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.

!
Definitions Are Not Removed

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 KnowWhat to Ask Helm ForWhat You Learn
Which releases existThe list of releases, optionally filtered by status or namespaceNames, namespaces, revisions, statuses, chart versions
How one release is doingIts statusCurrent state, last deployed time, and notes
What happened over timeIts historyAll revisions with status, chart, and description
Which values were suppliedThe values of the releaseYour customisations, or the full computed set if requested
What was deployedThe manifest of the releaseThe final resources sent to the cluster
Which hooks existThe hooks of the releaseResources tied to lifecycle moments
What the chart told the userThe notes of the releaseThe 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]
FIG 8 — A simple route from a symptom to its cause using read-only commands
Simple Analogy

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.

i
Supplied Versus Computed Values

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.

Mode 1

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.

Mode 2

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.

Mode 3

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.

Simple Analogy

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.

!
Common Mistake

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.

Marker 1

Managed-by label

A label that says the resource was created and is managed by Helm. It makes Helm-managed resources easy to find.

Marker 2

Release name annotation

Records which release owns the resource. Helm refuses to change a resource owned by a different release.

Marker 3

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]
        
FIG 9 — Ownership markers prevent releases from overwriting each other’s resources
Simple Analogy

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.

i
Cluster-Wide Resources

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
FIG 10 — One chart version promoted through several environment releases
!
Watch for Shared Resources

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.

Backend 1

Secrets

The default. One secret per revision in the release namespace. Access can be controlled with the same permissions as other secrets.

Backend 2

Configuration maps

An alternative that stores the same records in configuration maps. Easier to read casually, but with different access implications.

Backend 3

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
!
Do Not Delete Records by Hand Lightly

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.

AspectRegular ResourceHook Resource
CreatedWith the releaseAt a specific lifecycle moment
Tracked for update and removalYesOnly through its deletion policy
Blocks the release while runningOnly if waiting is requestedYes, Helm waits for it to finish
Typical kindLong-running workloadsShort-lived jobs
Failure effectDepends on waiting optionsFails 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
        
FIG 11 — A failing hook stops the release operation before the main upgrade is applied
i
Practical Tip

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.

Model 1

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.

Model 2

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.

Model 3

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
FIG 12 — Desired state in Git is applied as a release, and drift is corrected by the controller
!
Know Which Tool Owns the Release

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.

Option 1

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.

Option 2

Timeout

The maximum time Helm waits. If resources are not ready by then, the operation is marked as failed.

Option 3

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

1

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.

2

Read the history and status

Find the last revision that was deployed successfully and see what the pending or failed revision tried to do.

3

Roll back to the last good revision

A rollback to a deployed revision usually clears the stuck state and restores a working release.

4

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.

5

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.

!
Atomic Is Not a Cure-All

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.

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
Tip 1

Keep releases focused

Prefer several small releases with clear owners over one giant release. Each is faster to upgrade and easier to recover.

Tip 2

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.

Tip 3

Filter when listing

Ask for one namespace or one status instead of scanning everything, particularly in clusters with many releases.

Tip 4

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.

!
Audit Trail

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.

SymptomLikely CauseWhat To Do
Name already in useA release, possibly failed or with kept history, holds the nameList releases including failed and uninstalled ones, then remove or reuse
Another operation is in progressRelease stuck in a pending state after an interruptionConfirm nothing is running, then roll back or repair
Resource already exists and is not ownedObject created outside the release or by another releaseRemove it, rename it, or adopt it deliberately
Earlier settings disappeared after upgradeValues were reset to defaultsPass the full set of values from version control
Upgrade fails on an unchangeable fieldChart change touched an immutable fieldRecreate the object deliberately or revert the change
Record too largeChart or values exceed the object size limitSplit the release and remove large files
Release shows deployed but pods are failingSuccess was declared before readinessEnable waiting and inspect pod events
1

Read the status and last description

The status and short description of the latest revision often name the failed step directly.

2

Compare revisions

See what changed between the last good revision and the failing one, in values, chart version, and rendered manifests.

3

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.

4

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.

Signal 1

Releases not in deployed state

Count releases that are failed or pending. Each one needs attention before the next change is made.

Signal 2

Age of the last successful revision

A release that has not been updated in a long time may run outdated or vulnerable software.

Signal 3

Chart and application versions per release

An inventory of what runs where shows drift between environments and finds releases that missed an upgrade.

Signal 4

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]
        
FIG 13 — A dependable release routine from Git to verified deployment

23Anti-patterns to Avoid

Habits that make releases fragile and hard to recover.

ANTI-PATTERN-01 Avoid
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.

ANTI-PATTERN-02 Avoid
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.

ANTI-PATTERN-03 Avoid
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.

ANTI-PATTERN-04 Avoid
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.

ANTI-PATTERN-05 Avoid
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.

ANTI-PATTERN-06 Avoid
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.

ANTI-PATTERN-07 Avoid
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
!
Rehearse the Bad Day

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

Q1What is a Helm release?

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.

Q2What is the difference between a chart and a release?

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.

Q3Can two releases have the same name?

Yes, if they are in different namespaces. Within one namespace, each release name must be unique.

Q4Where does Helm keep release information?

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.

Q5Does rollback delete newer revisions?

No. Rollback creates a new revision whose content copies the older one. The history keeps all entries, showing both the upgrades and the rollback.

Q6Why did my settings disappear after an upgrade?

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.

Q7What does a pending state mean?

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.

Q8Can I rename a release or move it to another namespace?

No. Install a new release with the desired name or namespace and remove the old one, taking care to preserve data.

Q9What happens to my data when I uninstall a release?

Tracked resources are removed, which may include storage. Resources marked to be kept stay behind. Back up data before uninstalling anything that holds it.

Q10Why does an install say a resource already exists?

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.

Q11How many revisions does Helm keep?

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.

Q12Who should own a release when a GitOps controller is used?

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.