Level 15 / Kubernetes packaging

Helm 0 to Hero

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.

  • Why Helm exists Stop copy-pasting raw manifests and start shipping reusable packages with sane defaults.
  • What you practice Chart structure, rendering, installing, upgrading, rolling back, and cleaning up.
  • How to use this page Learn the mental model first, then jump to commands, labs, or the simulator when needed.
Chart
Values
Templates
Release
Rollback

Render pipeline

Chart code Reusable templates and metadata live in one versioned package.
templates/
Values Environment-specific configuration overrides defaults without editing templates.
values.yaml
Rendered manifests Helm fills template placeholders and sends plain Kubernetes YAML to the cluster.
helm template

Release history

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

Learn Helm in the order people actually use it

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.

01

Understand the nouns

Chart, values, release, template, and revision are the core building blocks.

02

Render before installing

Use helm template and helm lint so you can see the generated YAML before it hits a cluster.

03

Install and inspect

Install a chart, check status, and inspect rendered manifests and stored values.

04

Upgrade safely

Learn how overrides, values files, and revisions work so upgrades become deliberate rather than scary.

05

Rollback and clean up

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.

When Helm helps most

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.

See the Helm flow end to end before you memorize commands

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.

1 Author or fetch a chart

A chart is the package that contains templates, defaults, and metadata.

2 Provide values

Values files and --set overrides customize the install for an environment.

3 Render templates

Helm resolves template expressions into plain Kubernetes manifests.

4 Install or upgrade

The rendered objects are submitted to Kubernetes and become the active release state.

5 Store revision history

Every change becomes a new release revision that Helm can inspect or roll back to.

6 Operate the release

Use status, history, get, rollback, and uninstall as the release lifecycle tools.

Know the files inside a chart and what each one is responsible for

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.yaml

Stores chart metadata such as name, version, app version, and dependency declarations.

values.yaml

Holds the default configuration values that templates can reference through .Values.

templates/

Contains Kubernetes YAML templates such as Deployments, Services, Ingress objects, and helpers.

Minimal chart treestarter layout
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.

Read a simple template and understand what Helm is really doing

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.

Template exampledeployment snippet
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.

Rendered output

After templating, Helm sends plain Kubernetes YAML to the cluster. Kubernetes never sees the template expressions.

The Helm commands you will reach for most often

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.

21 rows
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.

Safe Helm exercises you can run on a disposable cluster

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.

Best path

kind + Helm

Fast, disposable, and perfect for install, upgrade, rollback, and uninstall drills.

Most visual

Docker Desktop

Good if you want a one-machine Kubernetes setup with fewer moving parts.

Important habit

Always render first

Use template and lint before install. It saves time and confusion later.

Cleanup rule

Uninstall intentionally

Delete releases, namespaces, and local clusters in a known order so labs stay disposable.

Lab 0

Bootstrap a clean namespace for Helm work

Create a lab namespace and confirm your cluster is ready for chart installs.

5 min
RunNamespace bootstrap
kubectl create namespace lab
kubectl config set-context --current --namespace=lab
helm list
kubectl get ns
Lab 1

Create a starter chart and inspect the files

Scaffold a chart and look at the files Helm generates for you.

10 min
RunChart scaffold
helm create demo-chart
helm lint ./demo-chart
find demo-chart -maxdepth 2 -type f | sort
Lab 2

Render a chart locally before installing it

Preview the Kubernetes YAML Helm will generate without touching the cluster.

10 min
RunRender only
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
Lab 3

Install a release and inspect its stored state

Install a chart as a real release, then inspect status, values, and rendered manifests.

12 min
RunInstall + inspect
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
Lab 4

Upgrade a release using values overrides

Make a release change on purpose and watch Helm record a new revision.

12 min
RunUpgrade flow
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
Lab 5

Break a release and recover with rollback

Introduce a bad image tag or config override, then use history and rollback to recover.

15 min
RunRollback drill
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

Debug Helm in the right layer

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.

Fast debug sequence

Lint the chart

Use helm lint for structure and obvious template issues.

chart
Render the manifests

Use helm template or --dry-run --debug to see what Helm generated.

render
Inspect release state

Use helm status, helm history, and helm get values.

release
Check Kubernetes objects

Use kubectl get, describe, and logs if the chart rendered fine but the app still failed.

cluster

Common signals and what they usually mean

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

Practice install, upgrade, broken release, and rollback

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.

Current revision0
Target version1.0.0
Replicas1
Release statenot installed

Action log

Release history

Rendered summaryrelease view
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  template:
    spec:
      containers:
        - image: my-app:1.0.0

Leave no stray releases behind

Helm cleanup is straightforward when you remember the boundaries: release first, namespace second, cluster last if you are using a disposable local setup.

Fast cleanup checklist

  • Uninstall the release: helm uninstall demo -n lab.
  • Delete the namespace when the whole lab is done: kubectl delete namespace lab.
  • Remove local starter charts or package files you created during practice.
  • Reset your active namespace if you changed it during the labs.

What Helm does not clean automatically

  • Cluster-wide objects, external cloud resources, or persistent storage side effects may remain.
  • If the chart created PVC-backed workloads, verify what data and storage should persist.
  • Remember that uninstall removes the release, but not your repo config or local chart files.

Your next step after Helm feels comfortable

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.

Practice next

  • Create separate values files for dev, staging, and prod.
  • Add a chart dependency and run helm dependency update.
  • Compare helm template output before and after a value change.
  • Use Helm in a CI/CD pipeline only after rendering and linting feel routine.

Related pages in this hub

Helm works best when the surrounding platform layers already make sense.

  • Kubernetes for the orchestration layer Helm is packaging for.
  • Containers & Docker for the image layer that charts often deploy.
  • CI/CD for automating chart validation and releases.