Helm vs Kustomize

Helm and Kustomize are both popular tools for managing Kubernetes configurations, but they take fundamentally different approaches. Understanding their differences helps you choose the right tool for your use case, and sometimes you might use both together.

Think of Helm like a recipe with variables—you write a template recipe once, then fill in different values (ingredients) for different situations. Kustomize is like having a base recipe and then making modifications (patches) for different variations. Both get you to the same result, but the approach is different.

Helm: Templating Approach

Helm uses a templating approach where you write templates with variables, then provide values files that fill in those variables.

How Helm Works

graph LR Chart[Helm Chart<br/>Templates] --> Values[Values File<br/>Config] Values --> Render[Rendered<br/>YAML] Render --> Deploy[Deploy to<br/>K8s] style Chart fill:#e1f5ff style Values fill:#fff4e1 style Render fill:#e8f5e9 style Deploy fill:#f3e5f5
  1. Write templates - Create YAML files with Go template syntax
  2. Define values - Create values files with configuration
  3. Render - Helm fills in template variables
  4. Deploy - Deploy rendered YAML to Kubernetes

Helm Example

Chart Template (templates/deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.name }}
spec:
  replicas: {{ .Values.replicas }}
  template:
    spec:
      containers:
      - name: {{ .Values.name }}
        image: {{ .Values.image }}:{{ .Values.tag }}
        ports:
        - containerPort: {{ .Values.port }}

Values File (values.yaml):

name: my-app
replicas: 3
image: nginx
tag: "1.21"
port: 80

Deploy:

helm install my-release ./my-chart

Helm Features

Templating

  • Go template syntax
  • Functions and pipelines
  • Conditional logic
  • Loops and ranges

Charts

  • Package applications
  • Share via repositories
  • Version management
  • Dependencies

Releases

  • Track installed instances
  • Upgrade and rollback
  • Release history

Values

  • Default values
  • Environment-specific values
  • Value overrides
  • Secret management

When to Use Helm

Third-party applications - Installing databases, monitoring tools, etc. ✅ Application packages - Sharing applications as charts ✅ Complex templating - Need for variables, conditionals, loops ✅ Dependencies - Applications with dependencies ✅ Version management - Managing application versions ✅ Chart repositories - Sharing charts publicly or privately

Helm Advantages

  • Rich ecosystem - Thousands of pre-built charts
  • Powerful templating - Flexible template system
  • Dependency management - Handle application dependencies
  • Release management - Track and manage releases
  • Mature tooling - Well-established tooling and ecosystem

Helm Disadvantages

  • Learning curve - Go template syntax can be complex
  • Template complexity - Can become hard to read
  • External tool - Requires Helm installation
  • Overkill for simple cases - May be too much for simple apps

Kustomize: Patching Approach

Kustomize uses a patching approach where you define a base configuration and apply patches for different environments.

How Kustomize Works

graph LR Base[Base<br/>Config] --> Overlay[Overlay<br/>Patches] Overlay --> Build[Build<br/>YAML] Build --> Deploy[Deploy to<br/>K8s] style Base fill:#e1f5ff style Overlay fill:#fff4e1 style Build fill:#e8f5e9 style Deploy fill:#f3e5f5
  1. Define base - Create base Kubernetes YAML files
  2. Create overlays - Define patches for different environments
  3. Build - Kustomize applies patches to base
  4. Deploy - Deploy built YAML to Kubernetes

Kustomize Example

Base (base/deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: my-app
        image: nginx:1.21
        ports:
        - containerPort: 80

Base kustomization (base/kustomization.yaml):

resources:
- deployment.yaml

Production Overlay (overlays/production/kustomization.yaml):

resources:
- ../../base
replicas:
- name: my-app
  count: 5
images:
- name: nginx
  newTag: "1.22"

Deploy:

kubectl apply -k overlays/production

Kustomize Features

Patches

  • Strategic merge patches
  • JSON patches
  • Image transformations
  • Replica count changes

Composition

  • Multiple bases
  • Resource composition
  • ConfigMap/Secret generation

Built-in kubectl

  • No external tool needed
  • kubectl apply -k command
  • Native integration

Simplicity

  • Plain YAML files
  • Easy to understand
  • Git-friendly

When to Use Kustomize

Environment management - Different configs for dev/staging/prod ✅ GitOps workflows - Native kubectl integration ✅ Simple patching - Modifying existing YAML ✅ Base + overlays - Common base with environment variations ✅ No external tools - Want to use kubectl only ✅ Plain YAML - Prefer plain YAML over templates

Kustomize Advantages

  • Simple - Easy to learn and use
  • Native kubectl - Built into kubectl
  • Git-friendly - Plain YAML files
  • Environment management - Excellent for overlays
  • No external tool - No installation needed

Kustomize Disadvantages

  • Limited templating - No variables or conditionals
  • No dependencies - Manual dependency management
  • Fewer third-party resources - Less ecosystem support
  • Patches can be complex - Complex patches can be hard to read

Side-by-Side Comparison

Simple Application

Helm:

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.name }}
spec:
  replicas: {{ .Values.replicas }}
  # ... template continues

Kustomize:

# base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  # ... full YAML

Environment-Specific Config

Helm:

# values-dev.yaml
replicas: 1
image: nginx:latest

# values-prod.yaml
replicas: 5
image: nginx:1.21

helm install app ./chart -f values-prod.yaml

Kustomize:

# overlays/production/kustomization.yaml
resources:
- ../../base
replicas:
- name: my-app
  count: 5
images:
- name: nginx
  newTag: "1.21"

kubectl apply -k overlays/production

When to Choose What

Choose Helm When:

  • Installing third-party applications (databases, monitoring)
  • Need complex templating (conditionals, loops)
  • Sharing applications as packages
  • Managing application dependencies
  • Need release management and rollback
  • Working with Helm charts from repositories

Choose Kustomize When:

  • Managing environment-specific configurations
  • Prefer plain YAML over templates
  • Using GitOps workflows
  • Simple configuration management
  • Want native kubectl integration
  • Patching existing YAML files

Using Both Together

You can use Helm and Kustomize together:

# Generate Helm chart
helm template my-app ./chart -f values.yaml > base/manifests.yaml

# Use Kustomize to patch
kubectl apply -k overlays/production

This approach:

  • Uses Helm for templating
  • Uses Kustomize for environment management
  • Combines strengths of both tools

Best Practices

Helm Best Practices

  • Keep templates simple and readable
  • Use values files for configuration
  • Version your charts
  • Test templates before deploying
  • Use chart dependencies for complex apps
  • Document required values

Kustomize Best Practices

  • Keep base configurations minimal
  • Use overlays for environment differences
  • Keep patches focused and small
  • Use strategic merge patches when possible
  • Document overlay purposes
  • Version control all configurations

Migration Considerations

From Helm to Kustomize

  • Extract values from Helm templates
  • Create base YAML files
  • Create overlays for environments
  • Test thoroughly before switching

From Kustomize to Helm

  • Identify templating needs
  • Create Helm chart structure
  • Convert overlays to values files
  • Test chart rendering

Key Takeaways

  • Helm uses templating with variables
  • Kustomize uses patching with overlays
  • Helm is better for third-party apps and complex templating
  • Kustomize is better for environment management and GitOps
  • Both tools solve configuration management differently
  • You can use both tools together
  • Choose based on your specific needs

See Also