What is Helm?

Understand what Helm is, why Kubernetes needs a package manager, and how Helm simplifies deploying and managing applications.

6 min read

What is Helm?

So you've learned Kubernetes. You can write Deployments, Services, ConfigMaps, Secrets — the whole nine yards. You're feeling pretty good about yourself.

Then your boss says: "Deploy this app to dev, staging, and production. Oh, and each environment has different configs, replicas, and resource limits. Also, we need to roll back if anything breaks. By Friday."

And suddenly you're staring at 47 YAML files thinking... there has to be a better way.

There is. It's called Helm.

The Problem Helm Solves

Let's be real — managing Kubernetes YAML at scale is painful. Here's what you're dealing with:

  • Copy-paste madness: Same YAML templates across environments with tiny differences. Change a port number? Better update it in 12 files.
  • No versioning: You kubectl apply a bunch of files and pray. Want to roll back? Good luck remembering what you changed.
  • No packaging: Want to share your app setup with another team? Here's a zip file of YAML. Enjoy.
  • No dependency management: Your app needs Redis and PostgreSQL? Deploy each one manually, in the right order, with the right config.

Helm fixes all of this.

What is Helm, Exactly?

Helm is the package manager for Kubernetes. Think apt for Ubuntu, brew for macOS, or npm for Node.js — but for Kubernetes applications.

"A package manager? For YAML files?"

Yep. Helm takes your Kubernetes manifests, turns them into reusable templates, packages them into something called a chart, and lets you deploy, upgrade, and roll back with a single command.

Instead of this:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml
kubectl apply -f ingress.yaml
# ... 15 more files
# Oh wait, I forgot to update the image tag in staging

You get this:

helm install my-app ./my-chart --set image.tag=v2.0.0

One command. All resources. Parameterized. How cool is that?

Key Concepts

Before we dive deeper, let's get the vocabulary down. Helm has a few core concepts you'll see everywhere:

Chart

A chart is a package of Kubernetes manifests. It's a directory with a specific structure containing templates, default values, and metadata. Think of it as a blueprint for your application.

my-chart/
├── Chart.yaml          # Metadata (name, version, description)
├── values.yaml         # Default configuration values
├── templates/          # Kubernetes manifest templates
│   ├── deployment.yaml
│   ├── service.yaml
│   └── ingress.yaml
└── charts/             # Dependencies (sub-charts)

Release

When you install a chart, Helm creates a release. A release is a specific instance of a chart running in your cluster. You can have multiple releases of the same chart — like installing the same app in dev and staging.

helm install my-app-dev ./my-chart    # Release: my-app-dev
helm install my-app-staging ./my-chart # Release: my-app-staging

Same chart, different releases. Each with its own config.

Repository

A repository is where charts are stored and shared. Like Docker Hub for container images, or npm registry for Node packages. You can use public repos (like Bitnami) or host your own private ones.

helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo bitnami/nginx

Values

Values are the configuration knobs for your chart. Instead of hardcoding everything in YAML, you define variables with sensible defaults and override them per environment.

# Default: 1 replica, t2.micro
helm install my-app ./my-chart

# Production: 5 replicas, custom settings
helm install my-app-prod ./my-chart \
  --set replicaCount=5 \
  --set resources.limits.memory=512Mi

How Helm Works

Here's the high-level flow:

┌─────────────────────────────────────────────────┐
│                   You (Human)                    │
│         helm install my-app ./my-chart           │
└───────────────────────┬─────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────┐
│                  Helm Client                     │
│  1. Reads chart templates + values               │
│  2. Renders templates into Kubernetes YAML       │
│  3. Sends rendered manifests to K8s API          │
│  4. Tracks the release (revision history)        │
└───────────────────────┬─────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────┐
│              Kubernetes Cluster                  │
│  Creates Deployments, Services, ConfigMaps...    │
└─────────────────────────────────────────────────┘

The key thing: Helm is a client-side tool. There's no server component in your cluster (that was Helm 2 with Tiller — we don't talk about Tiller anymore). Helm 3 talks directly to the Kubernetes API using your kubeconfig.

"Wait, what happened to Tiller?"

Tiller was a server-side component in Helm 2 that had too many permissions and was a security nightmare. Helm 3 killed it. Now Helm uses your existing Kubernetes RBAC. Much cleaner, much safer.

Helm vs. Plain kubectl

Let's compare deploying a simple app both ways:

Without Helm (kubectl)

# Create namespace
kubectl create namespace my-app

# Apply all manifests
kubectl apply -f configmap.yaml -n my-app
kubectl apply -f secret.yaml -n my-app
kubectl apply -f deployment.yaml -n my-app
kubectl apply -f service.yaml -n my-app
kubectl apply -f ingress.yaml -n my-app

# Need to update? Edit files and re-apply
kubectl apply -f deployment.yaml -n my-app

# Need to roll back? Hope you have git history
kubectl rollout undo deployment/my-app -n my-app

# Need to delete everything?
kubectl delete -f . -n my-app

With Helm

# Install
helm install my-app ./my-chart -n my-app

# Update
helm upgrade my-app ./my-chart -n my-app --set image.tag=v2.0

# Roll back
helm rollback my-app 1

# Delete everything
helm uninstall my-app -n my-app

# See history
helm history my-app

"OK but is Helm really worth learning for small projects?"

Honestly? If you're deploying a single pod with one service, kubectl apply is fine. But the moment you have more than a handful of resources, multiple environments, or need to share your setup — Helm pays for itself immediately.

When to Use Helm

Use Helm when you have:

  • Multiple environments (dev, staging, prod) with different configs
  • Repeated deployments of similar apps across teams or clusters
  • Complex applications with many interconnected resources
  • Need for rollbacks — Helm tracks every revision automatically
  • Shared infrastructure — package once, deploy everywhere

Helm 3 vs. Helm 2

If you see old tutorials mentioning Helm 2, here's what changed:

FeatureHelm 2Helm 3
Tiller (server component)RequiredRemoved
SecurityTiller had cluster-adminUses your RBAC
Release storageConfigMapsSecrets (encrypted)
Three-way mergeNoYes (smarter upgrades)
Chart.yaml apiVersionv1v2
CRD supportLimitedFirst-class

Helm 3 is simpler, more secure, and just plain better. Don't bother learning Helm 2 — it's been end-of-life since 2020.

What's Next?

You now know what Helm is and why everyone in the Kubernetes world uses it. Here's a quick recap:

  • Helm is the package manager for Kubernetes
  • Charts package your manifests into reusable, versioned bundles
  • Releases are instances of charts running in your cluster
  • Helm 3 is client-only — no Tiller, no drama

In the next tutorial, we'll install Helm on your machine and connect it to your cluster. It takes about 2 minutes. Let's go!