Understand the nouns
Chart, values, release, template, and revision are the core building blocks.
Learn Helm as the release engine for Kubernetes, not just a bag of commands. This page shows how charts, values, templates, revisions, repos, upgrades, rollbacks, and cleanup fit into one repeatable workflow you can trust.
templates/
values.yaml
helm template
REV 1
stable install with default values
deployed
REV 2
replicas increased for production
deployed
REV 3
bad image tag introduced during upgrade
failed
REV 4
rollback restored healthy configuration
rolled back
Helm feels simple at first and confusing later because most people learn the install command before they learn how charts are structured or how releases get versioned. Go in this order and Helm will feel much more predictable.
Chart, values, release, template, and revision are the core building blocks.
Use helm template and helm lint so you can see the generated YAML before it hits a cluster.
Install a chart, check status, and inspect rendered manifests and stored values.
Learn how overrides, values files, and revisions work so upgrades become deliberate rather than scary.
Practice history, rollback, uninstall, and namespace cleanup so experiments stay disposable.
The shortest useful definition of Helm is: a package and release manager for Kubernetes that turns templates plus values into versioned installs.
Helm does not replace Kubernetes. It produces Kubernetes manifests and tracks each install or upgrade as a release revision so you can inspect and roll back what changed.
Use Helm when the same app needs different values across environments, when you want repeatable installs, or when a pile of raw YAML is getting hard to maintain.
Helm becomes intuitive once you can picture the whole sequence: you start with a chart, feed it values, render Kubernetes YAML, send that to the cluster, and then track the result as a release with revision history.
A chart is the package that contains templates, defaults, and metadata.
Values files and --set overrides customize the install for an environment.
Helm resolves template expressions into plain Kubernetes manifests.
The rendered objects are submitted to Kubernetes and become the active release state.
Every change becomes a new release revision that Helm can inspect or roll back to.
Use status, history, get, rollback, and uninstall as the release lifecycle tools.
Once the chart folder structure stops feeling mysterious, Helm gets much easier to reason about. Most charts are a small set of well-known files with clear jobs.
Chart.yamlStores chart metadata such as name, version, app version, and dependency declarations.
values.yamlHolds the default configuration values that templates can reference through .Values.
templates/Contains Kubernetes YAML templates such as Deployments, Services, Ingress objects, and helpers.
my-app/
Chart.yaml
values.yaml
charts/
templates/
deployment.yaml
service.yaml
_helpers.tpl
NOTES.txt
_helpers.tpl
Usually stores reusable snippets for names, labels, and common template logic.
NOTES.txt
Optional post-install instructions shown to the user after a successful install.
charts/
Contains chart dependencies when they are pulled or packaged locally.
Helm templates are just Kubernetes YAML with placeholders. The key skill is learning how a
value flows from values.yaml into the final manifest that the cluster sees.
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "my-app.name" . }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "my-app.name" . }}
spec:
containers:
- name: app
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
.Values.*
Reads values from values.yaml or overrides passed at install and upgrade time.
include
Calls reusable helper templates so naming and labels stay consistent across objects.
After templating, Helm sends plain Kubernetes YAML to the cluster. Kubernetes never sees the template expressions.
Search or filter the command atlas below. The focus is not just syntax, but what each command is good for so you know when to use it in a real workflow.
| Command | What it does | When to use it |
|---|---|---|
helm create demo-chart |
Scaffolds a new chart directory with defaults, templates, and helper files. | Use it when you want a fast starter chart to customize. |
helm lint ./demo-chart |
Runs chart checks and catches common structure or templating problems. | Use it before installing or packaging a chart. |
helm template demo ./demo-chart |
Renders templates locally without installing anything. | Best way to inspect the generated Kubernetes YAML before it hits a cluster. |
helm template demo ./demo-chart -f values-prod.yaml |
Renders the chart using a specific values file. | Use it to preview production-style overrides safely. |
helm install demo ./demo-chart -n lab --create-namespace |
Installs a chart as a new release in the lab namespace. |
Use it for a first-time install on a cluster. |
helm upgrade demo ./demo-chart -n lab |
Upgrades an existing release using the chart contents on disk. | Use it after changing chart templates or values. |
helm upgrade demo ./demo-chart -f values-prod.yaml -n lab |
Upgrades a release using an explicit values file. | Use it when environments are represented by separate values files. |
helm upgrade demo ./demo-chart --set image.tag=2.0.0 -n lab |
Overrides one value inline during an upgrade. | Helpful for one-off tests or CI-driven image updates. |
helm upgrade demo ./demo-chart --install -n lab |
Installs if missing, otherwise upgrades the release. | Useful in automation where you want one command for both states. |
helm list -A |
Lists releases across all namespaces. | Use it to orient yourself when you forget where a release lives. |
helm status demo -n lab |
Shows the current release state, revision, and other metadata. | Start here when a release behaves unexpectedly. |
helm history demo -n lab |
Shows release revision history. | Use it before deciding which revision to roll back to. |
helm rollback demo 1 -n lab |
Rolls the release back to revision 1. |
Use it when a recent upgrade broke the app. |
helm get values demo -n lab |
Shows the values currently stored for the release. | Use it to verify what configuration Helm actually applied. |
helm get manifest demo -n lab |
Prints the rendered manifests stored for the release. | Use it when you want to compare chart intent with cluster reality. |
helm install demo ./demo-chart --dry-run --debug |
Simulates an install and prints detailed debug output. | One of the safest pre-flight checks before a first install. |
helm repo add bitnami https://charts.bitnami.com/bitnami |
Adds a chart repository to your local Helm config. | Use it before searching or installing charts from that source. |
helm repo update |
Refreshes local repository indexes. | Run it after adding repos or before searching for fresh chart versions. |
helm search repo nginx |
Searches added chart repositories for matching charts. | Useful when you want to discover installable charts quickly. |
helm show values bitnami/nginx |
Prints the chart's default values. | Use it before writing overrides for a repo chart. |
helm dependency update ./demo-chart |
Downloads or updates chart dependencies declared in Chart.yaml. |
Use it when a chart depends on other charts. |
helm uninstall demo -n lab |
Removes a release from the namespace. | Use it for cleanup when you want the app gone but not the whole namespace. |
Tip: pair helm template, helm lint, and helm get manifest before you blame Kubernetes. Many Helm problems are visible before the cluster even sees the YAML.
These labs assume you already have a local Kubernetes cluster available. If you do not, create one with kind or use the Kubernetes page first, then come back here and layer Helm on top.
Fast, disposable, and perfect for install, upgrade, rollback, and uninstall drills.
Good if you want a one-machine Kubernetes setup with fewer moving parts.
Use template and lint before install. It saves time and confusion later.
Delete releases, namespaces, and local clusters in a known order so labs stay disposable.
Create a lab namespace and confirm your cluster is ready for chart installs.
kubectl create namespace lab
kubectl config set-context --current --namespace=lab
helm list
kubectl get ns
Scaffold a chart and look at the files Helm generates for you.
helm create demo-chart
helm lint ./demo-chart
find demo-chart -maxdepth 2 -type f | sort
Preview the Kubernetes YAML Helm will generate without touching the cluster.
helm create demo-chart
helm template demo ./demo-chart
helm template demo ./demo-chart --set replicaCount=3
helm install demo ./demo-chart --dry-run --debug
Install a chart as a real release, then inspect status, values, and rendered manifests.
helm create demo-chart
helm install demo ./demo-chart -n lab --create-namespace
helm status demo -n lab
helm get values demo -n lab
helm get manifest demo -n lab
Make a release change on purpose and watch Helm record a new revision.
helm create demo-chart
helm install demo ./demo-chart -n lab --create-namespace
helm upgrade demo ./demo-chart --set replicaCount=3 -n lab
helm history demo -n lab
helm get values demo -n lab
Introduce a bad image tag or config override, then use history and rollback to recover.
helm create demo-chart
helm install demo ./demo-chart -n lab --create-namespace
helm upgrade demo ./demo-chart --set image.tag=does-not-exist -n lab
helm history demo -n lab
helm status demo -n lab
helm rollback demo 1 -n lab
helm history demo -n lab
Some problems are chart problems. Others are Kubernetes runtime problems that Helm merely triggered. Start by identifying which layer is actually failing before you change anything.
Use helm lint for structure and obvious template issues.
chart
Use helm template or --dry-run --debug to see what Helm generated.
render
Use helm status, helm history, and helm get values.
release
Use kubectl get, describe, and logs if the chart rendered fine but the app still failed.
cluster
| Signal | Likely meaning | First move |
|---|---|---|
| Template render error | The chart references a value path or helper incorrectly. | helm template and inspect the failing template |
| Install succeeded but Pods fail | Helm worked, but the generated Kubernetes objects are unhealthy at runtime. | kubectl get pods then describe and logs |
| Upgrade created a bad revision | A values change or chart change broke the workload. | helm history then helm rollback |
| Wrong config in cluster | The values you think you applied are not the values Helm stored. | helm get values |
| Unexpected generated YAML | The chart rendered something other than what you assumed. | helm get manifest or helm template |
| Repo chart behaves differently than expected | You may be overriding the wrong key or missing a required value block. | helm show values and compare your overrides carefully |
Change the chart values, install a release, upgrade it, deliberately pick a broken version, and then roll back to a healthy revision. The goal is to make revision thinking feel intuitive.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
template:
spec:
containers:
- image: my-app:1.0.0
Helm cleanup is straightforward when you remember the boundaries: release first, namespace second, cluster last if you are using a disposable local setup.
helm uninstall demo -n lab.kubectl delete namespace lab.Once Helm makes sense, the next jump is combining it with CI/CD and deployment discipline. That is where charts become truly powerful rather than just convenient packaging.
helm dependency update.helm template output before and after a value change.Helm works best when the surrounding platform layers already make sense.