Helm Charts for Kubernetes
February 13, 2026
|
Kubernetes
Helm
Deployment
Create charts and manage environments.
What Are Helm Charts?
Helm is the package manager for Kubernetes. Charts are collections of templated YAML files that define a complete application deployment. Instead of maintaining dozens of YAML manifests, you parameterize them with values files — making deployments repeatable, versioned, and environment-aware.
Helm Architecture
- Charts — Packages of pre-configured Kubernetes resources
- Values — Configuration parameters that customize chart behavior
- Releases — Running instances of a chart with specific values
- Repositories — Collections of charts (like Docker Hub for images)
Creating Your First Chart
helm create myapp
myapp/
├── Chart.yaml # Metadata (name, version, dependencies)
├── values.yaml # Default configuration values
├── charts/ # Dependency charts
└── templates/
├── _helpers.tpl # Template helpers and partials
├── deployment.yaml # Deployment template
├── service.yaml # Service template
├── ingress.yaml # Ingress template
├── hpa.yaml # HPA template
└── NOTES.txt # Post-install notesTemplate Example
Templates use Go template syntax with Sprig functions:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
resources:
{{- toYaml .Values.resources | nindent 12 }}Environment-Specific Values
Maintain separate values files per environment:
# values-dev.yaml
replicaCount: 1
image:
tag: "latest"
resources:
requests:
cpu: 100m
memory: 128Mi
# values-prod.yaml
replicaCount: 3
image:
tag: "v1.2.0"
resources:
requests:
cpu: 500m
memory: 512Mi
ingress:
enabled: true
hosts:
- host: app.example.com# Deploy to different environments
helm install myapp ./myapp -f values-dev.yaml --namespace dev
helm install myapp ./myapp -f values-prod.yaml --namespace prodChart Dependencies
Include external charts as dependencies in Chart.yaml:
dependencies:
- name: postgresql
version: "12.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled
- name: redis
version: "17.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabledHelm Best Practices
- Version your charts — Use semantic versioning in Chart.yaml
- Use named templates — DRY principle with _helpers.tpl
- Lint before deploying —
helm lintcatches template errors early - Use
helm diffplugin — Preview changes before applying:helm diff upgrade myapp ./myapp - Store charts in OCI registries — Use ECR, GCR, or Harbor for chart storage
- Template tests — Write
helm testhooks to validate deployments
Helm in CI/CD
# GitHub Actions example
- name: Deploy
run: |
helm upgrade --install myapp ./charts/myapp \
-f values-${{ env.ENVIRONMENT }}.yaml \
--namespace ${{ env.NAMESPACE }} \
--set image.tag=${{ github.sha }} \
--wait --timeout 5mEazy SaaS Tip: We maintain a library of battle-tested Helm chart templates for common patterns: web API + database, worker + queue, and cron jobs. Starting from these templates saves our clients 2-3 weeks of Kubernetes boilerplate.