Ana içeriğe geç

Helm Cheatsheet#

Helm 3+ varsayılır. Tiller'sız, namespace bazlı release.

📦 Repo Yönetimi#

# Repo ekle
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# Listele / güncelle / sil
helm repo list
helm repo update
helm repo remove bitnami

# Search
helm search repo postgresql
helm search hub ingress           # ArtifactHub'ı arar

🔍 Inspect#

# Chart bilgisi
helm show chart bitnami/postgresql
helm show values bitnami/postgresql > postgresql-defaults.yaml
helm show readme bitnami/postgresql
helm show all bitnami/postgresql

# Specific version
helm show values bitnami/postgresql --version 12.5.0

🚀 Install / Upgrade#

# Install
helm install <RELEASE> bitnami/postgresql -n <NS> --create-namespace

# Custom values
helm install <RELEASE> bitnami/postgresql -f values.yaml -n <NS>

# Multiple values files (sonraki öncekini override eder)
helm install <RELEASE> bitnami/postgresql -f values.yaml -f values-prod.yaml

# CLI override
helm install <RELEASE> bitnami/postgresql \
  --set primary.persistence.size=20Gi \
  --set auth.username=appuser \
  --set image.tag=16

# Specific version
helm install <RELEASE> bitnami/postgresql --version 12.5.0

# Dry run (manifestleri görmek)
helm install <RELEASE> bitnami/postgresql --dry-run --debug

# Upgrade (atomic = fail durumunda otomatik rollback)
helm upgrade --install <RELEASE> bitnami/postgresql \
  -f values.yaml \
  --atomic \
  --timeout 5m

# Force re-install
helm upgrade <RELEASE> bitnami/postgresql --force

# Reset values (önceki değerleri sıfırla)
helm upgrade <RELEASE> bitnami/postgresql --reset-values

📋 List / Status / History#

# Tüm release'ler
helm list
helm list -A                       # tüm namespace'ler
helm list --all                    # failed/uninstalled dahil

# Release durumu
helm status <RELEASE>
helm status <RELEASE> -n <NS> --show-resources

# Hooks/notes
helm get notes <RELEASE>
helm get values <RELEASE>          # uygulanan values
helm get values <RELEASE> --all    # default + override
helm get manifest <RELEASE>        # uygulanan manifestler

# History (rollback için)
helm history <RELEASE>

↩️ Rollback / Uninstall#

# Rollback (önceki revision'a)
helm rollback <RELEASE>
helm rollback <RELEASE> 3          # specific revision
helm rollback <RELEASE> --wait --timeout 5m

# Uninstall
helm uninstall <RELEASE>
helm uninstall <RELEASE> --keep-history       # rollback için
helm uninstall <RELEASE> -n <NS>

🛠️ Chart Geliştirme#

# Yeni chart iskeleti oluştur
helm create my-app

# Chart yapısı:
# my-app/
# ├── Chart.yaml          ← chart metadata
# ├── values.yaml         ← default values
# ├── values.schema.json  ← values doğrulama
# ├── templates/
# │   ├── deployment.yaml
# │   ├── service.yaml
# │   ├── ingress.yaml
# │   ├── _helpers.tpl
# │   └── NOTES.txt
# ├── charts/             ← dependencies
# └── tests/

# Lint
helm lint my-app
helm lint my-app -f values.yaml

# Template render (apply etmeden manifestleri gör)
helm template my-app
helm template <RELEASE> my-app -f values.yaml
helm template <RELEASE> my-app --debug --show-only templates/deployment.yaml

# Package
helm package my-app
helm package my-app --destination ./dist

# Dependency
helm dependency update my-app    # Chart.yaml'daki dependencies'i indir
helm dependency build my-app     # Chart.lock'tan

🔬 Debug#

# Render edilen manifest'i debug
helm install <RELEASE> my-app --dry-run --debug

# Belirli bir resource'u render et
helm template <RELEASE> my-app --show-only templates/deployment.yaml

# Failed release'in hatasına bak
helm status <RELEASE>
kubectl get events -n <NS> --sort-by='.lastTimestamp'

# Hook'lar (preInstall vb)
helm install <RELEASE> my-app --no-hooks      # hook'ları skip et

📝 Templating Basics#

_helpers.tpl#

{{/*
Common labels
*/}}
{{- define "my-app.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
{{- end }}

Template kullanımı#

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-app.fullname" . }}
  labels:
    {{- include "my-app.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Chart.Name }}
  template:
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
        env:
        {{- range $k, $v := .Values.env }}
        - name: {{ $k }}
          value: {{ $v | quote }}
        {{- end }}
        resources:
          {{- toYaml .Values.resources | nindent 10 }}
        {{- with .Values.probes }}
        livenessProbe:
          {{- toYaml .liveness | nindent 10 }}
        readinessProbe:
          {{- toYaml .readiness | nindent 10 }}
        {{- end }}

Conditional#

{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
# ...
{{- end }}

Range#

volumes:
{{- range .Values.extraVolumes }}
- name: {{ .name }}
  {{- toYaml . | nindent 2 }}
{{- end }}

Functions#

{{ "Hello" | upper }}                    # HELLO
{{ .Values.tag | default "latest" }}
{{ .Values.host | required ".host required" }}
{{ tpl .Values.template . }}             # nested templating
{{ now | date "2006-01-02" }}
{{ randAlphaNum 16 }}
{{ .Values.config | toYaml | nindent 4 }}

🔐 OCI Registry#

# Registry'e push (Helm 3.8+)
helm registry login <REGISTRY>
helm push my-app-1.0.0.tgz oci://<REGISTRY>/charts

# Pull
helm pull oci://<REGISTRY>/charts/my-app --version 1.0.0

# Install from OCI
helm install <RELEASE> oci://<REGISTRY>/charts/my-app --version 1.0.0

🪝 Hooks#

# templates/post-install-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Release.Name }}-migrate
  annotations:
    "helm.sh/hook": post-install,post-upgrade
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
  template:
    spec:
      containers:
      - name: migrate
        image: my-app:{{ .Chart.AppVersion }}
        command: ["./migrate"]
      restartPolicy: Never

⚡ Faydalı one-liner'lar#

# Tüm namespace'lerdeki release'lerin chart versiyonu
helm list -A -o json | jq '.[] | "\(.namespace)/\(.name)\t\(.chart)"'

# Outdated chart'lar
helm list -A | tail -n +2 | awk '{print $1, $2, $9}' | \
  while read name ns chart; do
    repo=$(echo $chart | cut -d'-' -f1)
    helm search repo $repo --version $(echo $chart | cut -d'-' -f2-)
  done

# Release'in tüm secret'larını gör (Helm internal)
kubectl get secret -A -l owner=helm

# Manuel Helm 2 → 3 migration (legacy)
helm-2to3 convert <RELEASE>

🆘 Acil senaryolar#

Sorun Çözüm
another operation in progress Helm 3'te helm rollback <RELEASE> veya secret'ı manuel temizle: kubectl delete secret -l name=<RELEASE>
Failed install hayalet kaldı helm uninstall <RELEASE> --no-hooks
Values değiştirdim ama uygulanmadı helm upgrade --reset-values veya --force
Dependency güncellenmiyor helm dependency update, sonra Chart.lock'u commit'le
Manifests render olmuyor helm template ... --debug --show-only ile spesifik dosya
Hook never finishes helm install --no-hooks ile bypass + manuel hook çalıştır