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 notes

Template 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 prod

Chart 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.enabled

Helm Best Practices

  • Version your charts — Use semantic versioning in Chart.yaml
  • Use named templates — DRY principle with _helpers.tpl
  • Lint before deployinghelm lint catches template errors early
  • Use helm diff plugin — 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 test hooks 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 5m

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