What Is Helm in Kubernetes: The Package Manager for Your Cluster
Understand what Helm is, why teams use it, how charts, releases, and values fit together, and how to install, upgrade, and roll back complete applications on Kubernetes with confidence instead of juggling dozens of separate files.
Imagine moving into a new house. You could buy every screw, plank, and pipe separately and follow a long list of instructions to build your furniture. Or you could buy a flat-pack wardrobe that arrives in one box, with all the parts labelled, a clear instruction sheet, and a few options such as colour and size. If you later want a different colour, you do not rebuild everything from scratch; you just choose again. Helm is the flat-pack box for Kubernetes applications. It bundles all the pieces of an application into one package, lets you choose options when you install it, and remembers exactly what you installed so you can upgrade or undo it later.
1The Problem Helm Was Built to Solve
Running a real application on Kubernetes takes far more than a single file.
Kubernetes describes everything you want to run through text files called manifests. A manifest says, for example, “run three copies of this program,” or “expose this program on this port.” A small demo may need only one or two manifests. A real application needs many: one for the program itself, one for its network address, one for its settings, one for its secret passwords, one for its storage, one for permissions, and often more. A typical production application can easily need twenty or thirty files.
Managing that pile of files by hand creates several painful problems. You must apply them in the right order. You must edit the same values in many places, such as the name of the application or the version of the software. If you want to run the same application in a test environment and a production environment, you must copy all the files and change a few details in each copy. Over time, the copies drift apart, and nobody is sure which version is running where.
Think of a restaurant that writes every recipe on a separate loose page, one page for the sauce, one for the dough, one for the toppings, and one for the oven settings. To make a pizza for a different customer with less salt, someone must find the right pages and edit each one. A cookbook that keeps all pages together and lets you change a single “salt level” setting is far easier to manage. Helm is that cookbook.
The questions teams kept asking
Teams found themselves asking the same questions again and again. How do I install this whole application with one command? How do I change one setting without editing ten files? How do I upgrade safely, and go back if the upgrade goes wrong? How do I share my application with other teams, or use one built by someone else? Helm was created to answer these questions in a standard way.
This guide assumes you have heard of pods and Deployments, but every new term is explained when it first appears. You do not need to write any templates to follow along; the goal is to understand the ideas so the tool feels natural when you use it.
2So, What Exactly Is Helm?
A package manager and templating tool that installs and tracks whole applications on Kubernetes.
Helm is an open-source tool that acts as the package manager for Kubernetes. If you have used a package manager on a computer, such as the software store on a phone or the tool that installs programs on a server, the idea is the same. Instead of downloading and configuring every piece of a program yourself, you ask the package manager to install it by name. It finds the package, applies your choices, installs everything in the right order, and keeps a record of what it did.
Helm packages are called charts. A chart is a collection of files that together describe a Kubernetes application, including templates for the manifests and a set of default settings. When you install a chart, Helm combines the templates with your settings, produces the final manifests, and sends them to the cluster. The resulting installed application is called a release, and Helm tracks each release so that it can upgrade, roll back, or remove it later.
A chart is like a blueprint together with a checklist of adjustable options. A release is a specific house built from that blueprint with your chosen options. You can build many houses from the same blueprint, each with different options, and the builder keeps a logbook for every house.
A brief history
Helm began as a project to make Kubernetes applications easier to share and install, and it became one of the most widely adopted tools in the ecosystem. It is maintained under the Cloud Native Computing Foundation, the same organisation that hosts Kubernetes. The first major version relied on a server-side component inside the cluster called Tiller, which caused security concerns because it held broad permissions. The third major version removed Tiller entirely, and Helm now works as a simple client that talks directly to the cluster using the permissions of the person running it.
Helm is not a replacement for Kubernetes and does not run your application. It only prepares and sends manifests to the cluster and keeps records. Kubernetes itself still starts the pods, restarts them when they fail, and handles networking.
3Core Vocabulary: Chart, Release, Repository, Values
Five words explain almost everything Helm does.
Chart
A package that describes a Kubernetes application. It contains templates, default settings, and information about itself such as its name and version.
Release
One installed instance of a chart in a cluster. The same chart can be installed many times, each with its own release name and settings.
Repository
A place where charts are stored and shared, so that you can search for and download them, much like an app store.
Values
The adjustable settings of a chart, such as the number of copies, the image version, or the domain name. You override defaults with your own values.
Template
A manifest with blanks in it. Helm fills the blanks with values to produce the final manifest that is sent to the cluster.
Revision
A numbered version of a release. Every install, upgrade, or rollback creates a new revision, which is what makes history and rollback possible.
flowchart LR
R[Repository
stores charts] --> C[Chart
templates and defaults]
V[Your values
your choices] --> H[Helm renders]
C --> H
H --> M[Final manifests]
M --> K[Kubernetes cluster]
K --> REL[Release
tracked by Helm]
Consider a cake. The chart is the recipe book. The values are your choices, such as chocolate or vanilla and small or large. The release is the actual cake you baked. The repository is the library where you found the recipe book, and each new attempt at the cake is a new revision in your baking diary.
A chart carries two version numbers that people often mix up. The chart version says how the package itself has changed. The app version says which version of the packaged software the chart deploys by default. They can move independently.
4Anatomy of a Chart
A chart is just a folder with a predictable layout.
A chart is a directory of files arranged in a standard way. Because the layout is standard, every chart in the world can be understood by the same tool and read by anyone familiar with Helm. Knowing what each part is for makes charts far less mysterious.
| Part | What It Is | Why It Matters |
|---|---|---|
| Chart metadata file | Describes the chart: name, description, chart version, app version, dependencies, and compatibility | Identifies the package and tells Helm how to treat it |
| Default values file | The full set of adjustable settings with their default choices | Documents every option and gives sensible defaults |
| Templates folder | The manifests with blanks that are filled from values | Contains the real content of the application |
| Helper templates | Reusable snippets, such as standard names and labels | Keeps templates short and consistent |
| Notes file | A message shown to the person after installing | Explains how to reach or use the application |
| Charts folder | Other charts this chart depends on, called subcharts | Lets a chart include a database or cache as a part |
| CRDs folder | Custom resource definitions installed before the rest | Prepares the cluster for custom object types |
| Values schema file | An optional description of which values are allowed | Rejects mistakes before anything is installed |
flowchart TD
CH[Chart folder] --> META[Metadata
name and versions]
CH --> VAL[Default values]
CH --> TPL[Templates folder]
CH --> SUB[Subcharts folder]
CH --> CRD[CRDs folder]
TPL --> D[Deployment template]
TPL --> S[Service template]
TPL --> CM[ConfigMap template]
TPL --> H[Helper snippets]
A chart folder is like a flat-pack box. The label on the outside is the metadata. The list of adjustable options is the values file. The parts inside are the templates. Some boxes even contain smaller boxes, which are the subcharts, and the sheet of tips at the top is the notes file.
Helm installs files from the CRDs folder before anything else, but it does not upgrade or delete them later. This is deliberate, because removing a definition can destroy all custom objects of that kind. Plan a separate process for evolving them.
5How Helm Works Behind the Scenes
A small client program that renders manifests and talks to the cluster.
Helm is a command-line program that runs on your computer or in an automation pipeline. When you ask it to install a chart, it reads the chart, combines the templates with your values to create the final manifests, and then sends those manifests to the Kubernetes API server, which is the front door of the cluster. Helm then stores a record of what it did inside the cluster, so it can recognise the release later.
sequenceDiagram
participant U as You
participant H as Helm client
participant R as Chart source
participant API as Kubernetes API Server
participant C as Cluster
U->>H: Install chart with my values
H->>R: Fetch the chart if not local
R-->>H: Chart files
H->>H: Merge values and render templates
H->>API: Send final manifests
API->>C: Create the resources
H->>API: Store the release record
H-->>U: Report success and notes
No server component in the cluster
In the current major version, Helm has no server part running in your cluster. Everything it does happens with your own credentials, exactly as if you had sent the manifests yourself. This is a security improvement, because the permissions Helm uses are the same as the person or pipeline that runs it, and no extra powerful component sits in the cluster waiting to be attacked.
Load the chart
Helm reads the chart from a folder, an archive, or a repository, and checks that it is valid.
Merge the values
The chart’s defaults are combined with the values you provide. Your choices override the defaults.
Render the templates
Every template is filled in with the merged values, producing plain manifests that Kubernetes understands.
Send to the cluster
The manifests are submitted to the API server, which creates or updates the resources.
Record the release
Helm saves the release information, including the rendered manifests and values, as a new revision.
If you read older articles that mention Tiller, they describe the first major version. Advice about installing or securing Tiller no longer applies to the current version.
6Templates and the Rendering Process
Templates are manifests with blanks that Helm fills in.
A plain manifest contains fixed text, such as the exact name of the application and the exact number of copies. A template is the same manifest but with placeholders where you want flexibility. A placeholder might say “put the image version here,” or “put the number of replicas here.” When Helm renders the template, it replaces each placeholder with the corresponding value and produces an ordinary manifest.
Helm’s templates use a text-templating language with a rich set of built-in functions. These functions can supply a default when a value is missing, insist that a required value is present, convert data structures into the right format, and add indentation. Templates can also contain conditions, such as “only create this resource if ingress is turned on,” and loops, such as “create one entry for each item in this list.”
Placeholders
Fill in names, versions, sizes, and addresses from values, so the same template serves many environments.
Conditions
Include or skip whole resources depending on a value, such as creating storage only when persistence is enabled.
Loops
Repeat a block for every item in a list, such as multiple ports, hosts, or environment variables.
Named helpers
Define a reusable snippet once, such as a standard label block, and include it wherever needed.
Built-in objects
Templates can read information about the release, such as its name and namespace, and about the chart itself.
A template is like a form letter that says “Dear [name], your order [number] will arrive on [date].” Mail merge fills in the blanks for each customer and produces a personal letter. Helm does the same with manifests, filling in the blanks for each release.
The manifests Helm produces are written in a format where spaces and line breaks carry meaning. A template that inserts text with the wrong indentation creates a broken manifest. Rendering a chart locally and reading the result is the best way to catch these mistakes early.
7Values and How Overrides Work
One chart, many environments, thanks to layered settings.
Every chart ships with a file of default values. These defaults describe a working installation with sensible choices. You rarely want to edit the chart itself. Instead, you supply your own values, either in a file of your own or as small overrides on the command line. Helm combines all of them, and the more specific ones win over the general ones.
Chart defaults
The lowest priority. They are used whenever nothing else says otherwise.
Parent chart values
If the chart is used as a subchart, its parent can override its defaults.
Your values files
Files you supply override the defaults. When several files are given, later files override earlier ones.
Command-line overrides
The highest priority. Individual settings given directly on the command line override everything else.
| Environment | Typical Values File Content | Result |
|---|---|---|
| Development | One copy, small resources, debug logging, no public address | Cheap, quick environment for developers |
| Staging | Two copies, production-like settings, test domain | Realistic rehearsal before release |
| Production | Many copies, larger resources, real domain, strict limits | Reliable, scalable service |
Think of a coffee order. The shop has a standard drink, which is the default. You can hand over a card with your usual changes, such as oat milk and no sugar, which is your values file. Then, when ordering, you can say “extra hot today,” a last-minute override that beats everything else.
Keeping values safe and correct
A chart can include a schema that describes which values are allowed and what type each must be. When a schema is present, Helm checks your values against it before doing anything, and rejects mistakes such as a text where a number is expected. This turns confusing failures deep inside the cluster into clear messages at the start.
Keep one values file per environment in version control, and keep them small. Only list what differs from the chart defaults. A short file is easy to review and hard to get wrong.
8The Release Lifecycle: Install, Upgrade, Rollback, Uninstall
Four actions cover the whole life of an application.
Install
Creates a new release from a chart and your values. Helm renders the manifests, sends them, and records revision one.
Upgrade
Applies a new chart version or new values to an existing release. Helm computes what changed and updates only that, creating a new revision.
Rollback
Returns a release to an earlier revision. Helm reapplies the older manifests and records the rollback as a new revision.
Uninstall
Removes the resources that the release created. By default, the history is removed too, unless you ask to keep it.
flowchart LR
I[Install
revision 1] --> U1[Upgrade
revision 2]
U1 --> U2[Upgrade
revision 3]
U2 --> RB[Rollback to 2
revision 4]
RB --> U3[Upgrade
revision 5]
U3 --> X[Uninstall]
How an upgrade decides what to change
When you upgrade a release, Helm does more than blindly resend everything. It compares three things: the manifest from the previous revision, the current live state of the resources in the cluster, and the newly rendered manifest. This three-way comparison lets Helm notice changes made by the chart and also respect certain manual changes made directly in the cluster, producing a more sensible update than a simple overwrite.
Editing a shared document with tracked changes works the same way. The editor looks at the original version, the current version, and your proposed version, and merges them sensibly instead of throwing away everything that changed in between.
Automation often uses a combined action that installs the release if it does not exist and upgrades it if it does. This makes pipelines simple and repeatable, because the same command works on the first run and every run after.
Rollback restores the earlier manifests, not the earlier data. If an upgrade changed a database structure or wrote new data, rolling back the application does not undo those changes. Always think about data before relying on rollback.
9Where Helm Remembers Releases: Storage and History
Helm keeps its records inside the cluster, next to the application.
For Helm to upgrade or roll back a release, it must remember what it installed. In the current version, each revision of a release is stored as an object inside the cluster, by default as a Secret in the same namespace as the release. The record includes the chart, the values that were used, and the manifests that were rendered. Because the records live in the cluster, any person or pipeline with access to the namespace can see and manage the release, and no separate database is needed.
One record per revision
Each install, upgrade, or rollback stores a new record, so the full history of a release can be inspected and any older revision can be restored.
Namespace scoped
Release names are unique within a namespace. The same name can be reused in different namespaces without conflict.
History is limited
To avoid endless growth, upgrades keep only a limited number of past revisions, ten by default. Older ones are pruned automatically.
Alternative storage
Helm can be configured to store records in configuration maps or a database instead of secrets, although secrets are the default.
Imagine a mechanic who staples a service note to the car every time it is repaired. Anyone who opens the glove box can read the history and know exactly what was done and when. The notes travel with the car, and no separate filing cabinet is needed.
Why the records deserve protection
The stored record includes the values you supplied and the final manifests. If those contained passwords or keys, the record contains them as well. Treat access to the release records as access to those secrets, and restrict who can read secrets in the release namespace accordingly.
Kubernetes limits the size of a single stored object. A very large chart with many resources and big values can produce a release record that exceeds the limit, and upgrades fail with a size error. Splitting the application into several smaller charts avoids the problem.
10Repositories, Registries, and Finding Charts
Charts are shared the same way software packages are.
A large part of Helm’s popularity comes from the huge number of charts already written by others. Popular software such as databases, message brokers, monitoring stacks, and ingress controllers is available as ready-made charts. You add a repository, search it, and install a chart by name, instead of writing manifests yourself.
Chart repositories
A simple web server that hosts packaged charts and an index describing them. You add its address and then search or install from it.
OCI registries
Charts can also be stored in the same kind of registry that holds container images. This lets teams reuse their existing registry, login, and access control.
Public discovery hub
A public catalogue lists charts from many publishers, with descriptions and versions, making it easy to find what you need and compare choices.
Local folders and archives
Helm can install from a folder on your computer or from a packaged file, which is ideal for developing your own charts and for testing.
flowchart TD
A[Publisher writes a chart] --> B[Package and sign the chart]
B --> C[Publish to a repository or registry]
C --> D[User searches or names the chart]
D --> E[Helm downloads the chart]
E --> F[Values applied and release installed]
Repositories are like bookshops and libraries for recipe books. A public catalogue is the search engine that tells you which shop stocks the book you want, and OCI registries are libraries that you already belong to, where the books sit beside your other borrowed items.
Always pin the chart version you install, especially in production. Leaving the version open means a future install may fetch a newer chart with different behaviour and surprise you.
11Dependencies and Subcharts
Charts can be built from other charts, like boxes inside boxes.
Many applications need supporting software, such as a database or a cache. Instead of copying those manifests into your chart, you can declare the other chart as a dependency. Helm downloads the dependency, places it in the charts folder as a subchart, and installs it together with your chart as one release. You can also pass values down to the subchart, and you can switch a dependency on or off with a simple condition.
flowchart TD
P[Parent chart
my application] --> S1[Subchart
database]
P --> S2[Subchart
cache]
P --> T[Own templates
web service and settings]
V[Your values] --> P
V -->|values under the subchart name| S1
V -->|values under the subchart name| S2
Umbrella charts
An umbrella chart is a chart with little or no templates of its own that exists only to bundle several other charts into one installable unit. It is a common way to deploy a whole platform made of many services with a single release, and to control all of their versions in one place.
Advantages of subcharts
- Reuse well-tested charts instead of writing your own
- Install a whole stack as one unit
- Turn optional parts on or off with a switch
- Share common settings through global values
Disadvantages / Trade-offs
- The release becomes larger and slower to upgrade
- Upgrading a dependency can change behaviour unexpectedly
- Parent and subchart values can become confusing to trace
- A failure in one part can block the whole release
Bundle a database as a subchart for development and testing convenience, but for production, many teams prefer a managed database service or a separately managed release, so that application upgrades never risk the data store.
12Hooks and Tests
Running special tasks at specific moments in a release.
Some applications need extra steps at particular times: a database migration before an upgrade, a cleanup job before deletion, or a smoke test after installation. Helm supports this through hooks, which are ordinary Kubernetes resources marked to run at a certain point of the release lifecycle. Because they are resources like any other, a hook is often a short-lived job.
| Hook Moment | When It Runs | Typical Use |
|---|---|---|
| Before install | After templates render, before any resource is created | Prepare prerequisites |
| After install | After all resources are created | Seed data, send a notification |
| Before upgrade | Before changes are applied | Run database migrations, take a backup |
| After upgrade | After changes are applied | Warm caches, verify health |
| Before delete | Before resources are removed | Export data, deregister from external systems |
| After delete | After resources are removed | Clean up external resources |
| Before or after rollback | Around a rollback | Undo migrations or notify teams |
| Test | Only when tests are explicitly run | Check that the release works |
sequenceDiagram
participant H as Helm
participant M as Pre-upgrade hook job
participant K as Cluster
H->>M: Run migration job
M->>K: Update the database structure
M-->>H: Job completed
H->>K: Apply upgraded application resources
K-->>H: Resources ready
H->>K: Run post-upgrade hook if defined
Hooks are like the safety checks before and after a flight. Before take-off, the crew runs a checklist. After landing, they run another. The flight is the release, and the checklists are the hooks that must complete at the right moment.
Resources created by hooks are not tracked as part of the release in the usual way, so they are not removed automatically with the release unless you give them a cleanup policy. Old hook jobs left behind can clutter the cluster or block the next run with a name clash.
13Helm Compared with kubectl and Kustomize
Three ways to deploy, each with a different philosophy.
Helm is not the only way to deploy to Kubernetes. Applying manifests directly with the standard command-line tool is the simplest approach. Kustomize is another popular tool that customises plain manifests using overlays and patches rather than templates. Each has strengths, and many teams use more than one.
| Aspect | Plain kubectl apply | Kustomize | Helm |
|---|---|---|---|
| Approach | Send manifests as they are | Patch and overlay plain manifests | Fill templates with values |
| Packaging and sharing | None built in | Limited, folders and bases | Charts, repositories, and registries |
| Release tracking and rollback | No release concept | No release concept | Numbered revisions with rollback |
| Per-environment differences | Copy and edit files | Overlays for each environment | Values files for each environment |
| Learning curve | Lowest | Moderate | Moderate to high because of templating |
| Readability of the source | Very clear, plain manifests | Clear, plain manifests plus patches | Templates can become hard to read |
| Best for | Small, simple setups | Your own manifests with light variation | Packaged, reusable, and third-party software |
Plain manifests are like ordering every dish separately from the menu. Kustomize is like taking a standard meal and asking the chef to change a few things. Helm is like a meal kit with a recipe card and adjustable portions, delivered with a record of what you ordered.
Helm and Kustomize work together. You can render a Helm chart and then apply extra patches to the output before it reaches the cluster. This is useful when you need to adjust a third-party chart in a way its values do not allow.
flowchart TD
Q1{Need to package and share the application?} -->|Yes| H[Use Helm]
Q1 -->|No| Q2{Need light changes per environment?}
Q2 -->|Yes| K[Use Kustomize]
Q2 -->|No| P[Plain manifests are enough]
Q3{Installing third-party software?} -->|Yes| H
14When to Use Helm
Situations where a package manager pays for itself.
Installing third-party software
Databases, monitoring tools, ingress controllers, and certificate managers are available as maintained charts. Installing them through Helm saves days of writing and testing manifests and gives you a standard path for upgrades.
Deploying the same application to many environments
One chart with a values file for each environment guarantees that development, staging, and production differ only in the ways you intended.
Distributing your product to customers
Software vendors ship charts so that customers can install a complex product on their own clusters with a few choices and a single command.
Managing many similar services
Organisations with dozens of microservices often create a shared chart that encodes company standards, and each service supplies only a small values file.
Needing controlled upgrades and rollbacks
Because every change is a numbered revision, teams can see what changed, roll back quickly, and audit the history of a release.
Short-lived preview environments
Pipelines install a release for each pull request and uninstall it afterwards, with one command in each direction and no leftover resources.
For a tiny application with a couple of manifests that never vary, Helm adds complexity without much benefit. Plain manifests or a light overlay may be easier for everyone to read and maintain.
15Helm in CI/CD and GitOps
Automating releases so that people do not type commands at midnight.
Helm fits naturally into automated delivery. A pipeline builds a container image, updates the chart version or values, and runs a single install-or-upgrade action against the cluster. The chart and the values live in version control, so every release can be traced back to a commit, reviewed by teammates, and reproduced later.
flowchart LR
C[Developer commits code] --> B[Pipeline builds image]
B --> V[Update values with new image version]
V --> L[Lint and render the chart]
L --> T[Deploy to staging release]
T --> A[Run tests]
A --> P[Deploy to production release]
The push model and the pull model
In a push model, a pipeline runs Helm and pushes changes into the cluster. This is easy to understand, but the pipeline needs credentials to the cluster. In a pull model, often called GitOps, a controller running inside the cluster watches a Git repository and applies the chart itself whenever the repository changes. The cluster pulls the desired state, and nobody needs to push into it from outside.
Pipeline push
The pipeline runs Helm with cluster credentials. Simple and direct, but credentials must be protected and drift is only corrected when the pipeline runs.
GitOps pull
An in-cluster controller renders and applies the chart from Git. It continuously compares the cluster with the repository and can correct drift automatically.
Whatever the model, render and validate the chart in the pipeline before deploying. Catching a template error in a check that runs in seconds is far better than discovering it during a failed rollout.
16Making Upgrades Safe
A few options turn a hopeful upgrade into a controlled one.
By default, Helm sends the manifests and reports success as soon as the API server accepts them. That does not mean the pods started or became healthy. To make upgrades safer, Helm offers options that wait for resources to become ready and automatically undo a failed upgrade.
Wait for readiness
Helm waits until the resources it created are ready before reporting success, so a stuck rollout is noticed by the pipeline instead of by users.
Timeout
A limit on how long Helm waits. If resources do not become ready in time, the upgrade is reported as failed.
Atomic upgrades
If the upgrade fails, Helm automatically rolls back to the previous revision, leaving the release in a known good state.
Dry run and diff
Render and validate without changing anything, and use a comparison plugin to see exactly what an upgrade would modify.
Traps that cause upgrade failures
Immutable fields
Some fields of Kubernetes objects cannot be changed once created, such as the selector of a Deployment. A chart change that touches them makes the upgrade fail, and the object must be recreated deliberately.
Configuration changes that do not restart pods
Changing a configuration map does not automatically restart the pods that use it. A common technique is to add a checksum of the configuration to the pod template, so a change in settings changes the template and triggers a rollout.
Custom resource definitions
Because Helm does not upgrade definitions from the CRDs folder, definition changes need their own process, such as a separate chart or a manual step.
Stuck release states
If an operation is interrupted, a release may be left in a pending or failed state that blocks further changes. It must be inspected and, if needed, rolled back or repaired before continuing.
A pipeline that finishes as soon as manifests are accepted can report a green result for a release that never becomes healthy. Always wait for readiness in automated deployments.
17Performance and Scale Considerations
Helm is light, but big charts and many releases bring their own limits.
Helm itself does little work: it renders text and talks to the API server. Rendering even a large chart takes moments. The real costs appear elsewhere. Large releases produce large records that must be stored and read on every operation. Charts with hundreds of resources take longer to apply and to wait for. Repositories with thousands of chart versions produce large index files that slow searches.
Advantages
- Client-only design, no extra components to scale
- Rendering is fast and can happen anywhere
- Release records are stored with the application
- Works with the same permissions and audit trail as other cluster actions
Disadvantages / Trade-offs
- Very large releases can hit object size limits
- Large umbrella charts make upgrades slow and risky
- Many revisions stored per release use cluster storage
- Waiting for many resources can lengthen pipelines
Keep releases focused
Split a huge platform into several releases with clear responsibilities. Each is quicker to upgrade and easier to understand.
Limit history
Keep a sensible number of past revisions. A handful is usually enough for rollback and audit without filling the namespace.
Avoid huge values
Do not embed large files in values. Store big content in separate objects or external storage and reference it.
18Security Considerations
A chart is code that creates resources in your cluster, so trust matters.
A chart can create almost anything in a cluster: workloads, permissions, network rules, and even resources that grant wide access. Installing a chart from a source you do not trust is like running a program from the internet with your own permissions. Security with Helm therefore starts with knowing what you install and who is allowed to install it.
Review charts before installing them
Render the chart and read the output, especially the permissions it creates and the images it uses. A few minutes of reading prevents surprises such as broad administrative roles or containers running with excessive privileges.
Use trusted sources and pinned versions
Prefer charts from publishers you know, pin exact chart versions, and mirror important charts into your own registry so a change upstream cannot silently alter your deployments.
Verify provenance
Charts can be signed, and Helm can verify the signature and integrity before installing. Signing proves who published a chart and that nobody changed it afterwards.
Keep secrets out of plain values files
Passwords and keys placed in values files end up in version control and in the release record. Use an external secret manager or an encryption approach for values, and reference secrets instead of embedding them.
Limit who can run Helm and where
Because Helm uses your permissions, restrict them with role-based access control. Give pipelines access only to the namespaces they deploy to, not the whole cluster.
Protect the release records
Anyone who can read secrets in a namespace can read the release history, including rendered manifests and values. Restrict that access just as you would for any sensitive secret.
A popular chart is not automatically a safe or well-configured chart. Defaults are chosen for convenience, and production needs often call for tighter settings on permissions, network access, and resource limits.
19Troubleshooting, Monitoring, and Metrics
Most Helm problems are visible if you look at the rendered output and the release status.
When something goes wrong, there are usually only three places it can have gone wrong: the values were not what you expected, the template rendered something different from what you intended, or the cluster rejected or could not run the result. Working through them in order finds the cause quickly.
Check the release status and history
See whether the release is deployed, failed, or stuck in a pending state, and which revision is current. The history shows what changed and when.
Look at the values actually used
Retrieve the values stored with the release and compare them with what you thought you supplied. Many problems are simply a value in the wrong file or with the wrong name.
Render the chart locally
Produce the final manifests without installing and read them. This reveals indentation errors, missing values, and unexpected resources.
Lint the chart
Run the built-in checker to catch structural problems, such as invalid metadata or malformed templates, before they reach a cluster.
Inspect the cluster resources
Look at events and pod status for the resources that Helm created. Image pull errors, failed probes, and quota problems appear there, not in Helm’s output.
| Symptom | Likely Cause | What To Do |
|---|---|---|
| Upgrade fails with an immutable field message | The chart changed a field that cannot be modified | Recreate the object deliberately or revert the change |
| Release stuck in a pending state | A previous operation was interrupted | Inspect history, then roll back or repair |
| Rendered output is broken | Indentation or missing value in a template | Render locally and fix the template |
| Values seem ignored | Wrong key path or overridden by a later source | Check precedence and the exact nesting of the value |
| Install says a resource already exists | The object was created outside Helm | Adopt it deliberately or remove it first |
| Pods do not restart after a settings change | Pod template did not change | Add a checksum of the settings to the pod template |
Release status
Track releases that are failed or pending. A release that is not in the deployed state needs attention before the next change.
Pipeline duration and failures
Watch how long deployments take and how often they fail. A slowly growing duration often hints at a chart that has grown too big.
Chart and image versions in use
Keep an inventory of which chart versions run where, so outdated or vulnerable ones are found and upgraded.
Drift from the desired state
Compare what runs in the cluster with what the chart and values describe. Manual edits create differences that surprise the next upgrade.
20Design Patterns for Good Charts
Habits that make charts easy to use and safe to change.
Pattern: Sensible defaults, minimal required values
Design the chart so that it installs with very few choices, and let users override only what they need. A chart that requires twenty values before it works is hard to adopt.
Pattern: Document every value
Comment each setting in the default values file, with its meaning and allowed choices. The values file is the user manual of the chart.
Pattern: Validate with a schema
Describe the allowed values in a schema so mistakes are caught immediately with a clear message, rather than deep inside a failed rollout.
Pattern: Reusable helpers for names and labels
Define standard names and labels once and reuse them everywhere, so all resources are consistent and selectors always match.
Pattern: Checksum annotations for settings
Add a checksum of configuration to the pod template so that a settings change automatically triggers a rolling restart.
Pattern: Optional features behind switches
Let users turn features such as ingress, persistence, or autoscaling on or off. The chart stays small for simple cases and powerful for complex ones.
Pattern: Library charts for shared standards
Put company-wide conventions, such as standard labels, security settings, and probes, into a shared library chart that many application charts reuse.
flowchart TD
L[Library chart
company standards] --> A[Application chart A]
L --> B[Application chart B]
L --> C[Application chart C]
A --> RA[Release in staging and production]
B --> RB[Release in staging and production]
C --> RC[Release in staging and production]
21Anti-patterns to Avoid
Mistakes that make charts fragile and releases painful.
Problem
Putting real passwords and keys in values files kept in version control.
Why It’s Harmful
Secrets spread to every person and system that can read the repository and are also stored in the release record.
Correct Approach
Use an external secret manager or encrypted values, and pass only references to secrets through the chart.
Problem
Installing charts without pinning the version.
Why It’s Harmful
A later install may fetch a newer chart with different behaviour, making environments differ and breaking repeatability.
Correct Approach
Pin the chart version and upgrade it deliberately after testing.
Problem
Editing resources in the cluster by hand after a release.
Why It’s Harmful
The cluster drifts from the chart, so the next upgrade may overwrite the change or fail in a confusing way, and nobody knows what is really running.
Correct Approach
Make every change through the chart and values, and let the version-controlled files be the single source of truth.
Problem
Building one enormous chart for an entire platform.
Why It’s Harmful
Upgrades are slow and risky, any failure blocks everything, and the release record may exceed size limits.
Correct Approach
Split the platform into focused charts and releases with clear ownership.
Problem
Templates with heavy logic and deep nesting.
Why It’s Harmful
Nobody can predict what is rendered, and small changes cause surprising results, defeating the purpose of a readable package.
Correct Approach
Keep templates simple, move repeated logic into helpers, and prefer more values over cleverness.
Problem
Running upgrades without waiting for readiness or a way back.
Why It’s Harmful
Pipelines report success for releases that never become healthy, and failures are found by users.
Correct Approach
Wait for readiness with a sensible timeout and use automatic rollback on failure where it is safe.
Problem
Relying on rollback to protect data.
Why It’s Harmful
Rollback restores manifests, not data. A migration that has already changed the database stays changed.
Correct Approach
Take backups before risky upgrades and design migrations so that the previous version still works with the new data structure.
22Best Practices and Common Mistakes
A short checklist for confident use of Helm.
Best Practices
- Keep charts and values files in version control
- Pin chart and image versions for repeatable releases
- Render and lint charts in the pipeline before deploying
- Wait for readiness and consider automatic rollback on failure
- Use a values file per environment, listing only differences
- Review third-party charts and verify their sources
- Keep secrets out of values files and out of version control
Common Mistakes
- Believing Helm runs or heals applications
- Forgetting that rollback does not undo data changes
- Assuming custom definitions are upgraded with the chart
- Editing live resources directly and causing drift
- Confusing chart version with application version
- Overriding values in an unexpected order
Try an upgrade and a rollback of a test release before you depend on them in production. Seeing how revisions and history behave makes stressful moments much calmer.
23Real-World Scenarios
How teams use Helm in everyday operations.
A retailer standardising forty services
A retailer had forty services, each with its own hand-written manifests that had drifted apart. The platform team created one shared chart that encoded standard probes, limits, and labels. Each service now supplies a short values file, upgrades are consistent, and a change to company standards is made in one place.
A startup building preview environments
A small company installs a release for every pull request in its own namespace, with a temporary address, and removes it when the request is merged. Reviewers see the change running before approving it, and no leftovers accumulate because uninstalling removes everything the release created.
A bank controlling third-party software
A bank mirrors approved charts into its own registry, verifies their signatures, and pins exact versions. Teams can install monitoring and ingress components quickly, but only from charts that security has reviewed, and every upgrade is a reviewed change to a values file.
A software vendor shipping to customers
A vendor packages its product as a chart with a schema and documented values. Customers install it on their own clusters with a handful of choices, and the vendor ships upgrades as new chart versions, with clear notes on any values that changed.
An operations team recovering from a bad release
After a release caused errors, the team looked at the revision history, identified the previous good revision, and rolled back in seconds. They then checked that no database change had been part of the release, and fixed the chart before trying again.
24Frequently Asked Questions
Helm is the package manager for Kubernetes. It bundles the many files of an application into one package called a chart, lets you customise it with values, installs it as a release, and keeps a history so you can upgrade or roll back.
A chart is the package, the blueprint. A release is one installed instance of that chart in a cluster. You can install the same chart many times, each as a separate release with its own name and values.
No. The current major version is client-only. The older Tiller component was removed, and Helm now works with the permissions of the person or pipeline that runs it.
By default, as secrets in the same namespace as the release, one record per revision. It can be configured to use configuration maps or a database instead.
Chart defaults have the lowest priority, then parent chart values, then your values files with later files winning, and finally individual overrides given on the command line, which win over everything.
No. Rollback reapplies earlier manifests, but it does not reverse changes to data or database structure. Take backups and design migrations with this in mind.
They solve different problems. Helm packages, shares, and tracks applications using templates. Kustomize customises plain manifests with overlays. Many teams use both, for example rendering a chart and patching the result.
Hooks run special resources, usually jobs, at particular moments such as before an upgrade or after an install. They are used for migrations, cleanups, and checks, and they need their own cleanup policy.
The chart change modified a field that Kubernetes does not allow to change after creation, such as a workload selector. The object must be deleted and recreated deliberately, or the change must be reverted.
No. Definitions in the CRDs folder are installed on first install but are not upgraded or removed later, to avoid deleting custom objects by accident. Handle definition changes with a separate process.
Not automatically. A chart can create powerful resources. Review the rendered output, prefer trusted publishers, pin versions, and verify signatures where available.
GitOps controllers can render and apply Helm charts from a Git repository automatically. The chart and values live in Git, and the controller keeps the cluster in line with them, correcting drift.
25Summary and Key Takeaways
Helm is the package manager for Kubernetes. It solves the problem of managing many separate manifest files by bundling them into charts, letting you customise them with values, and installing them as tracked releases. Each install, upgrade, and rollback creates a numbered revision, so you always know what changed and can return to an earlier state with a single action.
Helm is light and flexible, but it rewards care. Charts should be simple, versions should be pinned, secrets should stay out of plain files, and pipelines should render, lint, wait for readiness, and be ready to roll back. It does not run your application or undo your data, and it sits alongside tools such as Kustomize and GitOps controllers rather than replacing them. Used thoughtfully, Helm turns complicated deployments into repeatable, reviewable, and reversible routines.
Key Takeaways
- Helm is a package manager for Kubernetes — it bundles an application’s manifests into a chart and installs it as a release with one action.
- Charts, values, and releases are the core ideas — the chart is the blueprint, values are your choices, and the release is the installed result with numbered revisions.
- Helm is client-only — it renders templates locally and sends manifests to the API server using your own permissions, with no server component in the cluster.
- Values layer from defaults to command line — later and more specific sources override earlier ones, so one chart serves many environments.
- Upgrades and rollbacks are tracked — every change is a revision, but rollback restores manifests, not data, so plan backups and migrations carefully.
- Security needs attention — review charts, pin and verify versions, keep secrets out of values files, and protect access to release records.
- Automate with care — render and lint in pipelines, wait for readiness, prefer atomic upgrades where safe, and consider GitOps to keep clusters in line with Git.