⌂ Home

Helm Charts Overview

The Kubernetes package manager — install, upgrade, rollback, and share complex applications with a single command.

Helm packages Kubernetes manifests into reusable charts. A chart bundles templates, default values, and metadata so that deploying a multi-resource application is as simple as helm install.

Core Model

What Is Helm?

Package manager for K8s

Helm is to Kubernetes what apt is to Ubuntu or yum is to RHEL — it packages, versions, and distributes application definitions.

Charts

A chart is a directory of templated YAML, a values.yaml with defaults, and a Chart.yaml with metadata (name, version, dependencies).

Releases

Every helm install creates a release — a named, versioned instance of a chart running in a namespace. You can have multiple releases of the same chart.

Repositories

Chart repositories are HTTP servers hosting packaged charts. Public hubs like ArtifactHub aggregate thousands of community charts.

Values override

Override defaults at install time with --set flags or a custom -f values-prod.yaml file — same chart, different environments.

Rollback built-in

Helm tracks every release revision. helm rollback reverts to any previous revision instantly — safer than manually undoing kubectl apply changes.

Helm 3 (current) is a client-only tool — it talks directly to the Kubernetes API server. The server-side Tiller component from Helm 2 is gone.
Chart Structure

Anatomy of a Helm Chart

Directory Layout
mychart/
├── Chart.yaml          # Chart metadata (name, version, appVersion, dependencies)
├── values.yaml         # Default configuration values
├── charts/             # Sub-charts (dependencies)
├── templates/          # Go-template YAML manifests
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── configmap.yaml
│   ├── secret.yaml
│   ├── _helpers.tpl    # Reusable template snippets
│   ├── NOTES.txt       # Post-install usage instructions
│   └── tests/
│       └── test-connection.yaml
├── .helmignore         # Files to exclude from packaging
└── README.md           # Chart documentation
Helm Rendering Pipeline values.yaml replicas: 3 image: nginx:1.25 port: 80 --set / -f overrides replicas: 5 Helm Template Go template engine Merges values + templates Produces final K8s YAML templates/*.yaml {{ .Values.replicas }} {{ .Values.image }} render Rendered Manifests Deployment (replicas: 5) Service (port: 80) Ingress ConfigMap Secret kubectl apply Kubernetes API Resources created in cluster Release History (stored as Secrets in namespace) Revision 1 → helm install | Revision 2 → helm upgrade | Revision 3 → helm upgrade helm rollback myrelease 1 ← revert to any previous revision helm history myrelease ← view all revisions
Lifecycle

Helm Release Lifecycle

1

Add Repository

helm repo add bitnami https://charts.bitnami.com/bitnami — register a chart repository locally.

2

Search Charts

helm search repo nginx — find available charts and versions in your added repositories.

3

Inspect Values

helm show values bitnami/nginx — review configurable parameters before installing.

4

Install Release

helm install my-nginx bitnami/nginx -f values-prod.yaml — deploy the chart as a named release.

5

Upgrade Release

helm upgrade my-nginx bitnami/nginx --set replicas=5 — apply config changes or new chart versions.

6

Rollback

helm rollback my-nginx 1 — revert to a previous revision when something breaks.

7

Uninstall

helm uninstall my-nginx — remove the release and all its Kubernetes resources.

Every helm upgrade creates a new revision. Use helm history my-nginx to list all revisions and their statuses.
Setup

Installing Helm on Ubuntu / Linux

Option 1 — Official Install Script (recommended)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# Verify
helm version
Option 2 — APT Package Manager (Debian / Ubuntu)
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | \
  sudo tee /usr/share/keyrings/helm.gpg > /dev/null

echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/helm.gpg] \
  https://baltocdn.com/helm/stable/debian/ all main" | \
  sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

sudo apt-get update
sudo apt-get install helm

helm version
Option 3 — Snap
sudo snap install helm --classic
helm version
Option 4 — Download Binary Manually
# Check latest version at https://github.com/helm/helm/releases
HELM_VERSION="v3.16.3"
wget https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz
tar -zxvf helm-${HELM_VERSION}-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
rm -rf linux-amd64 helm-${HELM_VERSION}-linux-amd64.tar.gz

helm version
macOS (Homebrew)
brew install helm
helm version
Post-Install — Add Popular Repos
# Bitnami (extensive collection of production charts)
helm repo add bitnami https://charts.bitnami.com/bitnami

# Prometheus Community
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# Ingress-NGINX
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# Update local cache
helm repo update

# Verify
helm repo list
Quick Reference

Essential Helm Commands

CategoryCommandDescription
Repositoryhelm repo add NAME URLRegister a chart repository
helm repo updateRefresh local repo index cache
helm repo listList added repositories
helm repo remove NAMERemove a repository
Searchhelm search repo KEYWORDSearch local repos for charts
helm search hub KEYWORDSearch ArtifactHub
helm show values CHARTDisplay configurable values
Install / Upgradehelm install RELEASE CHARTDeploy a chart as a new release
helm install RELEASE CHART -f values.yamlInstall with custom values file
helm install RELEASE CHART --set key=valInstall with inline override
helm upgrade RELEASE CHARTUpgrade to new values or chart version
Rollbackhelm rollback RELEASE REVISIONRevert to a previous revision
helm history RELEASEList all release revisions
Statushelm listList installed releases
helm status RELEASEShow release status and notes
helm get values RELEASEShow user-supplied values
Debughelm template RELEASE CHARTRender templates locally (no install)
helm install --dry-run --debug RELEASE CHARTDry run with server-side validation
Cleanuphelm uninstall RELEASEDelete release and its resources
helm uninstall RELEASE --keep-historyDelete resources but keep release history
Create / Packagehelm create CHARTNAMEScaffold a new chart directory
helm package CHARTDIRPackage chart into .tgz archive
helm lint CHARTDIRValidate chart for errors
Pullhelm pull CHART --untarDownload chart archive and extract
Hands-On

Real-World Helm Examples

Deploy NGINX with Bitnami Chart
# Add repo and install
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install my-nginx bitnami/nginx --namespace web --create-namespace

# Check release
helm list -n web
kubectl get pods -n web

# Upgrade with custom values
helm upgrade my-nginx bitnami/nginx -n web --set replicaCount=3

# Rollback to revision 1
helm rollback my-nginx 1 -n web

# Cleanup
helm uninstall my-nginx -n web
Install Prometheus Monitoring Stack
helm repo add prometheus-community \
  https://prometheus-community.github.io/helm-charts
helm repo update

# Install with values override file
helm install monitoring prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace \
  -f monitoring-values.yaml

# View what was deployed
helm status monitoring -n monitoring
kubectl get pods -n monitoring
Custom values.yaml Override
# values-prod.yaml
replicaCount: 5

image:
  repository: myapp
  tag: "2.1.0"

service:
  type: LoadBalancer
  port: 443

resources:
  requests:
    cpu: 250m
    memory: 256Mi
  limits:
    cpu: 500m
    memory: 512Mi

ingress:
  enabled: true
  hosts:
    - host: myapp.example.com
      paths:
        - path: /
          pathType: Prefix
Create Your Own Chart
# Scaffold a new chart
helm create myapp

# Edit templates and values
# templates/deployment.yaml, templates/service.yaml, values.yaml

# Lint for errors
helm lint myapp/

# Test render locally
helm template my-release myapp/

# Package for distribution
helm package myapp/

# Install from local chart
helm install my-release ./myapp
Pull and Inspect a Chart
# Download chart to local directory
helm pull bitnami/nginx --untar

# Explore the chart structure
ls nginx/
cat nginx/Chart.yaml
cat nginx/values.yaml

# Install from local copy with modifications
helm install my-nginx ./nginx -f my-overrides.yaml
Decision Guide

Helm vs Other Deployment Approaches

AspectHelmKustomizePlain kubectl apply
TemplatingGo templates with conditionals, loops, functionsOverlay patches — no templatingNone — raw YAML
PackagingVersioned .tgz archives, shareable via reposDirectory-based, no packagingRaw files
Release trackingBuilt-in revision history and rollbackNone (rely on Git)None
DependenciesChart dependencies in Chart.yamlComponents via basesManual ordering
EcosystemThousands of community charts on ArtifactHubGrowing but smallerN/A
Learning curveMedium — Go template syntaxLow — patches and overlaysLow — plain YAML
Best fitDistributing apps, complex multi-resource installsEnvironment-specific overlays, GitOpsSimple, one-off deploys
Helm and Kustomize are not mutually exclusive. Many teams use helm template to render charts, then apply Kustomize overlays on top.
Use It Well

Practice and Real-World Thinking

Install from public repo

Add the Bitnami repo, search for WordPress, inspect its values, install it with a custom admin password, then uninstall.

Upgrade and rollback

Install NGINX, upgrade to 5 replicas, verify, then rollback to revision 1. Check helm history output.

Create your own chart

Run helm create, customize the templates for a simple app, lint, template-render locally, then install.

Multi-environment values

Write values-dev.yaml and values-prod.yaml for the same chart — different replica counts, resource limits, and image tags.

Namespace isolation

Install the same chart twice in different namespaces (--namespace staging vs --namespace production) and observe independent releases.

Dry-run debugging

Use helm template and helm install --dry-run --debug to spot rendering issues before deploying anything.