Helm Zero to Hero
A comprehensive Helm tutorial by Abhishek Veeramalla that treats Helm as the “APT for Kubernetes” — covering chart anatomy, repository management, release lifecycle, and custom chart authoring from first principles. Accompanied by the helm-zero-to-hero GitHub repository for hands-on revision.
What Is Helm?
Helm is the package manager for Kubernetes. Just as apt installs software on Ubuntu or yum manages RPMs on RHEL, Helm installs and manages applications on a Kubernetes cluster.
The analogy extends cleanly:
| Linux Package Manager | Helm Equivalent |
|---|---|
apt install nginx | helm install my-nginx bitnami/nginx |
apt install nginx=1.18.0 | helm install my-nginx bitnami/nginx --version 13.0.0 |
/etc/nginx/nginx.conf | helm install my-nginx bitnami/nginx --values custom-values.yaml |
| Package repository (APT repo) | Helm Chart Repository |
.deb file | Helm Chart (a directory of templated YAML) |
Without Helm, installing a controller like Prometheus, Grafana, Argo CD, or an application like NGINX requires manually writing or copying dozens of Kubernetes manifests — Deployments, Services, ConfigMaps, RBAC rules, and sometimes CRDs. Helm collapses this into a single command: helm install.
Core Components
Helm Charts
A Chart is a packaged collection of files that describe a set of Kubernetes resources. It is the atomic unit of deployment in Helm — similar to a .deb or .rpm in Linux.
A chart directory contains:
- Chart.yaml — metadata (name, version, description, dependencies)
- values.yaml — default configuration values
- templates/ — Kubernetes manifest files written as Go templates
- charts/ — sub-charts (dependencies)
- README.md — optional documentation
Charts make complex applications reusable and versioned. The same chart can deploy a development instance with 1 replica and a production instance with 100 replicas by changing only the values.yaml.
Helm Repositories
A Repository is an HTTP server that stores and indexes charts. The community standard is to host repositories via GitHub Pages, but any static web server works.
Key commands:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list
helm repo update # refresh local index
helm search repo nginx # find chartsHelm Releases
A Release is a specific instance of a chart running in a cluster. It is the deployed, version-tracked application. Helm tracks every release in the cluster (via Secrets since Helm v3), enabling upgrade, rollback, and history inspection.
helm install myapp ./myapp # create a release
helm list # show releases
helm upgrade myapp ./myapp # update a release
helm rollback myapp 1 # revert to revision 1
helm uninstall myapp # remove a releaseThe Helm 3 Architecture Shift
Helm v2 required a cluster-side component called Tiller that maintained state and applied changes. This introduced a significant security concern — Tiller ran with cluster-admin privileges and was a high-value attack target.
Helm v3 (current) removed Tiller entirely. All operations are client-side; Helm uses the Kubernetes API directly and stores release history as Secrets in the target Namespace. This is a major security and operational improvement — no extra cluster component to secure or upgrade.
Practical implication: Helm v3 works out of the box with any kubeconfig that has sufficient RBAC. No
helm initor Tiller installation is required.
Creating and Customizing Charts
The helm create command scaffolds a complete chart structure:
helm create paymentsThis generates a working chart with deployment.yaml, service.yaml, ingress.yaml, and hpa.yaml templates. The author customizes templates using Go template syntax:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}Values are injected from values.yaml or overridden at install time:
helm install payments ./payments --set image.tag=v2.1.0
helm install payments ./payments -f prod-values.yamlPackaging and Distributing Charts
Charts are packaged as .tgz archives and indexed for repository hosting:
helm package payments # creates payments-1.0.0.tgz
helm repo index . # generates index.yamlThe index.yaml file lists all chart versions with download URLs and checksums. Hosting a repository on GitHub Pages (or S3, GCS, Artifactory) makes charts available to any consumer via helm repo add.
Release Lifecycle: Install → Upgrade → Rollback → Uninstall
Helm treats releases as versioned, mutable deployments. Every helm upgrade creates a new revision (stored in a Secret). If a deployment breaks, helm rollback <release> <revision> reverts to a known-good state in seconds — a safety net that raw kubectl apply does not provide natively.
| Command | Action | Safety Net |
|---|---|---|
helm install | Deploy a chart for the first time | Fails if release name already exists |
helm upgrade | Apply changes to an existing release | Creates a new revision; previous state is preserved |
helm rollback | Revert to a prior revision | Non-destructive; old revision is re-applied |
helm uninstall | Remove all resources | --keep-history preserves revision secrets |
CI/CD Integration
Helm is the standard deployment mechanism in GitOps and CI/CD pipelines:
- Build stage:
helm packagecreates the artifact - Test stage:
helm templaterenders manifests for linting;helm lintvalidates chart structure - Deploy stage:
helm upgrade --installdeploys (creates if absent, upgrades if present) - Verify stage:
helm testruns chart-defined verification Pods
Security Considerations
- Chart provenance: Helm supports GPG-signed charts (
helm package --sign) to verify publisher identity - Repository trust: Only add repositories from verified sources; malicious charts can deploy cluster-scoped resources
- RBAC scope: Helm runs with the caller’s kubeconfig permissions; restrict who can
helm installinto production Namespaces - Values leakage:
values.yamlmay contain secrets; prefer Sealed Secrets or External Secrets Operator rather than plain-text sensitive values - Tiller removal (v3): Eliminates a persistent cluster-side attack surface compared to Helm v2
Why Helm Matters
Kubernetes is powerful but verbose. A production application may require 20+ Kubernetes objects. Helm reduces this to one versioned, configurable, rollback-capable command. It turns Kubernetes from a low-level resource API into a deployable-application platform — the difference between writing raw SQL and using an ORM.
See Also
Wiki Concepts
- Helm — Main concept page: architecture, installation, and ecosystem
- Helm Charts — Deep dive into chart anatomy, templating, and authoring
- Helm Release Management — Revisions, upgrades, rollbacks, and history
- Kubernetes Ingress — Helm is the canonical installation path for NGINX Ingress Controller
- Kubernetes ConfigMaps and Secrets — Helm
values.yamlas externalized configuration - Kubernetes Namespaces — Helm releases are scoped to Namespaces
- GitOps Security — Chart provenance, repository trust, and pipeline hardening
- Tooling Index — Helm’s place in the DevOps toolchain
- CKA Study Roadmap — Post-CKA Helm specialization path
Related Sources
- DevOps to DevSecOps in 9 Hours — Abhishek Veeramalla’s broader DevSecOps curriculum
- CKA Day 33 — Kubernetes Ingress — Ingress controller installation via Helm
Creator / Entity
- Abhishek Veeramalla — Creator of this Helm tutorial and the helm-zero-to-hero GitHub repository