Helm Guide

Chart Structure

myapp/ ├── Chart.yaml # Chart metadata ├── values.yaml # Default configuration values ├── values.prod.yaml # Environment overrides ├── charts/ # Chart dependencies ├── templates/ │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ ├── configmap.yaml │ ├── secret.yaml │ ├── hpa.yaml │ ├── NOTES.txt # Post-install instructions │ └── _helpers.tpl # Template helpers/partials └── .helmignore # Chart.yaml apiVersion: v2 name: myapp description: My application Helm chart type: application version: 0.3.1 # chart version appVersion: "1.2.3" # app version

values.yaml

replicaCount: 3 image: repository: registry.example.com/myapp tag: "v1.2.3" pullPolicy: IfNotPresent service: type: ClusterIP port: 80 targetPort: 8080 ingress: enabled: true className: nginx host: app.example.com tls: true resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "512Mi" autoscaling: enabled: false minReplicas: 2 maxReplicas: 10 targetCPUUtilizationPercentage: 70 env: LOG_LEVEL: info DB_HOST: postgres config: appConfig: | server.port=8080 feature.flag=true

Template Syntax

# templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "myapp.fullname" . }} labels: {{- include "myapp.labels" . | nindent 4 }} spec: replicas: {{ .Values.replicaCount }} template: spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" {{- if .Values.env }} env: {{- range $key, $val := .Values.env }} - name: {{ $key }} value: {{ $val | quote }} {{- end }} {{- end }} resources: {{- toYaml .Values.resources | nindent 12 }} # _helpers.tpl {{- define "myapp.fullname" -}} {{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }} {{- end }} {{- define "myapp.labels" -}} app.kubernetes.io/name: {{ .Chart.Name }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} {{- end }}

Install / Upgrade / Rollback

# Add repository helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update # Search charts helm search repo bitnami/postgresql # Install chart helm install myrelease ./myapp \ --namespace production \ --create-namespace \ -f values.yaml \ -f values.prod.yaml \ --set image.tag=v1.3.0 \ --set replicaCount=5 # Dry run (preview) helm install myrelease ./myapp --dry-run --debug # Upgrade helm upgrade myrelease ./myapp \ --namespace production \ -f values.prod.yaml \ --set image.tag=v1.4.0 \ --atomic \ --timeout 5m # Rollback to previous revision helm rollback myrelease 0 # 0 = previous helm rollback myrelease 3 # specific revision # List releases helm list --all-namespaces # History helm history myrelease -n production # Uninstall helm uninstall myrelease -n production

Hooks

# templates/job-migration.yaml apiVersion: batch/v1 kind: Job metadata: name: {{ include "myapp.fullname" . }}-migration annotations: "helm.sh/hook": pre-upgrade,pre-install "helm.sh/hook-weight": "-5" "helm.sh/hook-delete-policy": hook-succeeded spec: template: spec: restartPolicy: Never containers: - name: migration image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" command: ["./migrate.sh"] # Hook types: pre-install, post-install, pre-upgrade, # post-upgrade, pre-rollback, post-rollback, # pre-delete, post-delete, test