DEV Community

DevCorner2
DevCorner2

Posted on

๐Ÿšข Helm Chart Full Documentation Guide

๐Ÿ“˜ What is Helm?

Helm is a package manager for Kubernetes. It helps you define, install, and manage Kubernetes applications using Helm charts, which are collections of Kubernetes manifests combined into a single package.


๐Ÿงฑ Helm Chart Structure

When you create a new chart with helm create mychart, this is the typical directory structure:

mychart/
โ”œโ”€โ”€ .helmignore
โ”œโ”€โ”€ Chart.yaml
โ”œโ”€โ”€ values.yaml
โ”œโ”€โ”€ charts/
โ”œโ”€โ”€ templates/
โ”‚   โ”œโ”€โ”€ deployment.yaml
โ”‚   โ”œโ”€โ”€ service.yaml
โ”‚   โ”œโ”€โ”€ ingress.yaml
โ”‚   โ”œโ”€โ”€ _helpers.tpl
โ”‚   โ””โ”€โ”€ ...
Enter fullscreen mode Exit fullscreen mode

๐Ÿ”น 1. Chart.yaml

Metadata about your chart.

apiVersion: v2
name: mychart
description: "A Helm chart for Kubernetes"
type: application
version: 0.1.0
appVersion: 1.16.0
Enter fullscreen mode Exit fullscreen mode

๐Ÿ”น 2. values.yaml

Default values for your templates.

replicaCount: 2

image:
  repository: nginx
  tag: stable
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80
Enter fullscreen mode Exit fullscreen mode

๐Ÿ”น 3. templates/

YAML templates that generate Kubernetes manifests.


๐Ÿ›  Step-by-Step: Creating a Helm Chart

โœ… Step 1: Install Helm

brew install helm   # macOS
choco install kubernetes-helm  # Windows
Enter fullscreen mode Exit fullscreen mode

โœ… Step 2: Create a New Chart

helm create mychart
Enter fullscreen mode Exit fullscreen mode

โœ… Step 3: Modify Chart.yaml

Update the metadata.

โœ… Step 4: Customize values.yaml

This allows configuration without changing the templates.

โœ… Step 5: Write Templates (templates/)

Templates use Go templating:

Example: deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deployment
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: 80
Enter fullscreen mode Exit fullscreen mode

๐Ÿ’ก Helm Template Language Basics

  • {{ .Values.xxx }}: Access value from values.yaml.
  • {{ .Chart.Name }}: Chart metadata.
  • {{ .Release.Name }}: Name of the release.
  • {{- if ... }} / {{- else }} / {{- end }}: Control logic.
  • {{ include "mychart.fullname" . }}: Use helper templates.

๐Ÿ“ฆ Packaging and Installing the Chart

โœ… Step 1: Lint the chart

helm lint mychart
Enter fullscreen mode Exit fullscreen mode

โœ… Step 2: Package the chart

helm package mychart
Enter fullscreen mode Exit fullscreen mode

This creates mychart-0.1.0.tgz.

โœ… Step 3: Install the chart

helm install myrelease ./mychart
Enter fullscreen mode Exit fullscreen mode

โœ… Step 4: Upgrade the chart

helm upgrade myrelease ./mychart
Enter fullscreen mode Exit fullscreen mode

โœ… Step 5: Uninstall the chart

helm uninstall myrelease
Enter fullscreen mode Exit fullscreen mode

๐Ÿ”ง Overriding Values

helm install myrelease ./mychart --set replicaCount=3
Enter fullscreen mode Exit fullscreen mode

Or with a file:

helm install myrelease ./mychart -f myvalues.yaml
Enter fullscreen mode Exit fullscreen mode

๐Ÿง  Advanced Concepts

โœ… 1. dependencies and charts/

Declare dependencies in Chart.yaml:

dependencies:
  - name: redis
    version: 14.8.8
    repository: https://charts.bitnami.com/bitnami
Enter fullscreen mode Exit fullscreen mode

Then run:

helm dependency update
Enter fullscreen mode Exit fullscreen mode

โœ… 2. helpers.tpl

Reusable functions:

{{- define "mychart.fullname" -}}
{{ printf "%s-%s" .Release.Name .Chart.Name }}
{{- end }}
Enter fullscreen mode Exit fullscreen mode

Use like:

metadata:
  name: {{ include "mychart.fullname" . }}
Enter fullscreen mode Exit fullscreen mode

โœ… 3. Conditional Resources

{{- if .Values.service.enabled }}
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ...
{{- end }}
Enter fullscreen mode Exit fullscreen mode

๐Ÿ“š Helm Repositories

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo nginx
helm install my-nginx bitnami/nginx
Enter fullscreen mode Exit fullscreen mode

๐Ÿงช Helm Testing

In templates/tests/test-connection.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "mychart.fullname" . }}-test"
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['{{ include "mychart.fullname" . }}']
  restartPolicy: Never
Enter fullscreen mode Exit fullscreen mode

Run tests:

helm test myrelease
Enter fullscreen mode Exit fullscreen mode

๐Ÿ“ค Helm Chart Best Practices

  • Use values.yaml for all configurable settings.
  • Use _helpers.tpl to keep templates DRY.
  • Always run helm lint.
  • Include tests and probes (liveness/readiness).
  • Use semantic versioning.
  • Document values in README.md.

๐Ÿณ Dockerize Your Helm App (Optional)

For CI/CD, create a Dockerfile that copies your Helm chart into an image, or run Helm from a pipeline.


๐ŸŒ Helm in Production

  • Use helm diff to preview changes.
  • Use Helm secrets or external secret managers for sensitive data.
  • Store Helm charts in private registries (e.g., Harbor, ChartMuseum, OCI registries).
  • Automate deployments with ArgoCD or Flux.

๐Ÿ“Ž Bonus: Useful Commands

helm list                                # List all releases
helm uninstall myrelease                # Delete release
helm get manifest myrelease             # Show rendered YAML
helm template mychart                   # Render templates locally
helm show values mychart                # Show default values
helm show chart mychart                 # Show chart metadata
Enter fullscreen mode Exit fullscreen mode

Top comments (0)