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 ManagerHelm Equivalent
apt install nginxhelm install my-nginx bitnami/nginx
apt install nginx=1.18.0helm install my-nginx bitnami/nginx --version 13.0.0
/etc/nginx/nginx.confhelm install my-nginx bitnami/nginx --values custom-values.yaml
Package repository (APT repo)Helm Chart Repository
.deb fileHelm 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 charts

Helm 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 release

The 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 init or Tiller installation is required.

Creating and Customizing Charts

The helm create command scaffolds a complete chart structure:

helm create payments

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

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

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

CommandActionSafety Net
helm installDeploy a chart for the first timeFails if release name already exists
helm upgradeApply changes to an existing releaseCreates a new revision; previous state is preserved
helm rollbackRevert to a prior revisionNon-destructive; old revision is re-applied
helm uninstallRemove 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 package creates the artifact
  • Test stage: helm template renders manifests for linting; helm lint validates chart structure
  • Deploy stage: helm upgrade --install deploys (creates if absent, upgrades if present)
  • Verify stage: helm test runs 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 install into production Namespaces
  • Values leakage: values.yaml may 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

Creator / Entity

  • Abhishek Veeramalla — Creator of this Helm tutorial and the helm-zero-to-hero GitHub repository