DevOps & Cloud

Kubernetes Helm: Package Manager

TOKEN

Tutorial lengkap Kubernetes Helm β€” charts, values, releases, repositories, instalasi, membuat chart sendiri, dan best practices manajemen aplikasi di Kubernetes

1. Pengenalan Helm

Helm adalah package manager resmi untuk Kubernetes. Sama seperti apt atau npm mengelola paket di sistem operasi atau Node.js, Helm mengelola paket aplikasi di Kubernetes. Paket-paket ini disebut chart β€” sekumpulan file YAML yang didefinisikan untuk menginstal, memperbarui, atau menghapus aplikasi di cluster Kubernetes.

Dengan hanya satu perintah helm install, Anda bisa mendeployseluruh stack aplikasi β€” termasuk Deployment, Service, ConfigMap, Secret, Ingress, dan resource Kubernetes lainnya β€” tanpa perlu menulis puluhan bahkan ratusan file YAML secara manual.

Mengapa Helm Penting?

Manfaat Penjelasan
PackagingMengemas semua Kubernetes manifests menjadi satu unit yang bisa di-share dan di-install ulang
TemplatingVariable dan conditionals memungkinkan satu chart dikonfigurasi untuk banyak environment
Release ManagementSetiap instalasi Helm disebut release, memungkinkan rollback dan history
RepositoriBerbagi chart melalui repository seperti ArtifactHub atau ChartMuseum
Dependency ManagementChart bisa memiliki sub-chart sebagai dependency, mirip npm package.json
RollbackSangat mudah melakukan rollback ke versi sebelumnya jika ada masalah
Diagram: Cara Kerja Helm
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     HELM ECOSYSTEM                            β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Helm     β”‚    β”‚  Helm        β”‚    β”‚  Helm Repos       β”‚  β”‚
β”‚  β”‚ CLI      │───►│  Chart       │◄───│  - ArtifactHub    β”‚  β”‚
β”‚  β”‚ (Client) β”‚    β”‚  (Template)  β”‚    β”‚  - ChartMuseum    β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚  - Custom Repo    β”‚  β”‚
β”‚                         β”‚            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                         β–Ό                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚              KUBERNETES CLUSTER                       β”‚   β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚   β”‚
β”‚  β”‚  β”‚ Release 1  β”‚ β”‚ Release 2  β”‚ β”‚ Release 3  β”‚       β”‚   β”‚
β”‚  β”‚  β”‚ (nginx)    β”‚ β”‚ (redis)    β”‚ β”‚ (postgres) β”‚       β”‚   β”‚
β”‚  β”‚  β”‚            β”‚ β”‚            β”‚ β”‚            β”‚       β”‚   β”‚
β”‚  β”‚  β”‚ Chart:     β”‚ β”‚ Chart:     β”‚ β”‚ Chart:     β”‚       β”‚   β”‚
β”‚  β”‚  β”‚ ingress-   β”‚ β”‚ bitnami/   β”‚ β”‚ bitnami/   β”‚       β”‚   β”‚
β”‚  β”‚  β”‚ nginx      β”‚ β”‚ redis      β”‚ β”‚ postgresql β”‚       β”‚   β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Konsep dasar Helm meliputi:

2. Instalasi Helm

Helm tersedia untuk berbagai platform. Helm 3 adalah versi terbaru yang tidak lagi membutuhkan Tiller (server-side component yang ada di Helm 2).

Linux (menggunakan skrip instalasi)

Bash
# Download dan instal Helm secara otomatis
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# Verifikasi instalasi
helm version
# version.BuildInfo{Version:"v3.15.0", GitCommit:"c27a625", GoVersion:"go1.22.3"}

# Cek konfigurasi
helm env

macOS (menggunakan Homebrew)

Bash
# Instalasi menggunakan Homebrew
brew install helm

# Verifikasi
helm version

Windows (menggunakan Chocolatey)

Bash
# Instalasi menggunakan Chocolatey
choco install kubernetes-helm

# Verifikasi
helm version

Mengunduh Binari Langsung

Bash
# Download dari GitHub releases
wget https://get.helm.sh/helm-v3.15.0-linux-amd64.tar.gz

# Ekstrak
tar -zxvf helm-v3.15.0-linux-amd64.tar.gz

# Pindahkan ke PATH
sudo mv linux-amd64/helm /usr/local/bin/helm

# Verifikasi
helm version
πŸ’‘ Tips

Pastikan kubectl sudah terkonfigurasi dengan benar sebelum menggunakan Helm, karena Helm akan berinteraksi langsung dengan Kubernetes cluster melalui kubeconfig.

3. Helm Charts

Chart adalah unit dasar packaging di Helm. Sebuah chart berisi deskripsi set resource Kubernetes yang related, dan Helm menggunakannya untuk membuat release baru di cluster Anda. Chart berada dalam direktori dengan struktur tertentu yang sudah didefinisikan.

Struktur Direktori Chart

Struktur Direktori
my-chart/
β”œβ”€β”€ Chart.yaml          # Metadata chart (nama, versi, deskripsi)
β”œβ”€β”€ Chart.lock          # Lock file untuk dependencies
β”œβ”€β”€ values.yaml         # Default values untuk konfigurasi
β”œβ”€β”€ values.schema.json  # JSON Schema untuk validasi values
β”œβ”€β”€ charts/             # Direktori sub-chart dependencies
β”‚   └── dependency-1/
β”œβ”€β”€ templates/          # Template Kubernetes manifests
β”‚   β”œβ”€β”€ deployment.yaml
β”‚   β”œβ”€β”€ service.yaml
β”‚   β”œβ”€β”€ ingress.yaml
β”‚   β”œβ”€β”€ configmap.yaml
β”‚   β”œβ”€β”€ _helpers.tpl    # Template helpers (reusable functions)
β”‚   β”œβ”€β”€ NOTES.txt       # Catatan yang ditampilkan setelah install
β”‚   └── tests/
β”‚       └── test-connection.yaml
β”œβ”€β”€ .helmignore         # File yang diabaikan saat packaging
└── LICENSE             # Lisensi (opsional)

File Chart.yaml

File Chart.yaml berisi metadata chart yang sangat penting:

YAML
apiVersion: v2
name: my-nginx-app
description: Aplikasi Nginx deployment dengan Helm
type: application          # "application" atau "library"
version: 0.2.0             # Versi chart ini (semver)
appVersion: "1.27.0"       # Versi aplikasi yang di-deploy
keywords:
  - nginx
  - web-server
  - reverse-proxy
maintainers:
  - name: BeebaneLabs
    email: dev@beebanelabs.com
    url: https://beebanelabs.pages.dev
home: https://beebanelabs.pages.dev
sources:
  - https://github.com/Beebane25/helm-charts
icon: https://beebanelabs.pages.dev/images/logo_beebane.png
dependencies:
  - name: common
    version: "2.x.x"
    repository: "https://charts.bitnami.com/bitnami"

Jenis Chart

Jenis Penjelasan Contoh
ApplicationChart biasa yang bisa di-install ke clusterNginx, MySQL, Redis
LibraryChart yang hanya menyediakan helper templates, tidak bisa di-install sendiribitnami/common

Template Kubernetes di Chart

Template di dalam chart menggunakan sintaks Go template yang dienkapsulasi dalam kurung dua {{ }}:

YAML (Template)
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-chart.fullname" . }}
  labels:
    {{- include "my-chart.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "my-chart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "my-chart.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: {{ .Values.service.targetPort }}
          {{- if .Values.resources }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
          {{- end }}

Melihat Chart yang Tersedia

Bash
# Lihat chart yang bisa di-install dari repository yang ditambahkan
helm search repo nginx

# Cari chart di ArtifactHub
helm search hub nginx

# Lihat detail chart
helm show chart bitnami/nginx
helm show values bitnami/nginx
helm show readme bitnami/nginx
helm show all bitnami/nginx

4. Helm Values & Customization

Values adalah mekanisme utama Helm untuk menyesuaikan chart tanpa mengubah template. File values.yaml berisi default konfigurasi yang bisa di-override saat install atau upgrade.

File values.yaml Default

YAML
# values.yaml - Default configuration
# BeebaneLabs Helm Chart

replicaCount: 3

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "1.27.0"

service:
  type: ClusterIP
  port: 80
  targetPort: 8080

ingress:
  enabled: true
  className: nginx
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: app.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: app-tls
      hosts:
        - app.example.com

resources:
  limits:
    cpu: 500m
    memory: 256Mi
  requests:
    cpu: 250m
    memory: 128Mi

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 75

monitoring:
  enabled: true
  port: 9090

Override Values saat Install

Bash
# Override value dari command line
helm install my-release bitnami/nginx \
  --set replicaCount=5 \
  --set image.tag=1.27.1 \
  --set service.type=LoadBalancer

# Override dengan multiple values
helm install my-release bitnami/nginx \
  --set replicaCount=5 \
  --set ingress.enabled=false

# Gunakan file values custom
helm install my-release bitnami/nginx \
  -f my-custom-values.yaml

# Gabungkan values default + custom
helm install my-release bitnami/nginx \
  -f production-values.yaml \
  --set image.tag=latest

Perintah yang Berguna untuk Values

Bash
# Lihat values yang sudah di-install
helm get values my-release

# Lihat semua values (termasuk default)
helm get values my-release --all

# Lihat values dalam format yaml
helm get values my-release -o yaml

# Render template dengan values tertentu (tanpa install)
helm template my-release bitnami/nginx \
  -f production-values.yaml

# Validasi chart dengan values tertentu
helm lint bitnami/nginx \
  -f production-values.yaml

Konfigurasi Per Environment

Diagram: Strategi Values per Environment
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  VALUES MANAGEMENT STRATEGY                 β”‚
β”‚                                                             β”‚
β”‚  values.yaml (Default)                                      β”‚
β”‚  β”œβ”€β”€ replicaCount: 1                                        β”‚
β”‚  β”œβ”€β”€ image.tag: "1.0.0"                                     β”‚
β”‚  β”œβ”€β”€ resources: (minimal)                                   β”‚
β”‚  β”‚                                                          β”‚
β”‚  β”œβ”€β”€β–Ί values-dev.yaml (Development)                         β”‚
β”‚  β”‚    β”œβ”€β”€ replicaCount: 1                                   β”‚
β”‚  β”‚    β”œβ”€β”€ image.tag: "latest"                               β”‚
β”‚  β”‚    β”œβ”€β”€ ingress.enabled: false                            β”‚
β”‚  β”‚                                                          β”‚
β”‚  β”œβ”€β”€β–Ί values-staging.yaml (Staging)                         β”‚
β”‚  β”‚    β”œβ”€β”€ replicaCount: 2                                   β”‚
β”‚  β”‚    β”œβ”€β”€ image.tag: "1.0.0-rc1"                           β”‚
β”‚  β”‚    β”œβ”€β”€ resources: (medium)                               β”‚
β”‚  β”‚                                                          β”‚
β”‚  └──► values-production.yaml (Production)                   β”‚
β”‚       β”œβ”€β”€ replicaCount: 5                                   β”‚
β”‚       β”œβ”€β”€ image.tag: "1.0.0"                               β”‚
β”‚       β”œβ”€β”€ resources: (high)                                 β”‚
β”‚       β”œβ”€β”€ autoscaling.enabled: true                         β”‚
β”‚       └── monitoring.enabled: true                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

5. Helm Releases

Sebuah release adalah satu instalasi chart di dalam Kubernetes cluster. Setiap release memiliki nama unik dan bisa dikelola secara terpisah β€” di-upgrade, di-rollback, atau di-uninstall.

Perintah Install

Bash
# Install chart dari repository
helm install my-nginx bitnami/nginx

# Install dengan nama release tertentu
helm install web-app bitnami/nginx --generate-name

# Install dengan namespace tertentu
helm install my-nginx bitnami/nginx --namespace production

# Install dan buat namespace jika belum ada
helm install my-nginx bitnami/nginx \
  --namespace production --create-namespace

# Install dalam mode dry-run (preview tanpa deploy)
helm install my-nginx bitnami/nginx --dry-run --debug

# Install tanpa meng-update release notes
helm install my-nginx bitnami/nginx --no-hooks

# Install chart dari direktori lokal
helm install my-nginx ./my-local-chart

# Install chart dari file
helm install my-nginx ./my-local-chart-0.1.0.tgz

Perintah Upgrade

Bash
# Upgrade release dengan chart baru
helm upgrade my-nginx bitnami/nginx \
  --set replicaCount=5

# Upgrade dengan file values baru
helm upgrade my-nginx bitnami/nginx \
  -f new-values.yaml

# Upgrade ke versi chart tertentu
helm upgrade my-nginx bitnami/nginx --version 18.0.0

# Upgrade atau install jika belum ada (--install)
helm upgrade --install my-nginx bitnami/nginx \
  -f values.yaml

# Upgrade tanpa konfirmasi
helm upgrade my-nginx bitnami/nginx --wait --timeout 5m

# Lihat history revision
helm history my-nginx

# Rollback ke revision sebelumnya
helm rollback my-nginx 1

# Rollback ke revision tertentu
helm rollback my-nginx 3 --wait

Perintah Manage

Bash
# Lihat semua releases di semua namespace
helm list --all-namespaces

# Lihat releases di namespace tertentu
helm list -n production

# Lihat detail release
helm get all my-nginx

# Lihat manifest yang di-deploy
helm get manifest my-nginx

# Lihat notes setelah install
helm get notes my-nginx

# Uninstall release
helm uninstall my-nginx

# Uninstall dari namespace tertentu
helm uninstall my-nginx -n production

# Uninstall dengan konfirmasi
helm uninstall my-nginx --dry-run

# Lihat status release
helm status my-nginx
Diagram: Release Lifecycle
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    RELEASE LIFECYCLE                          β”‚
β”‚                                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚  INSTALL │───►│  UPGRADE │───►│  UPGRADE │──► ...       β”‚
β”‚  β”‚  rev 1   β”‚    β”‚  rev 2   β”‚    β”‚  rev 3   β”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜              β”‚
β”‚                       β”‚               β”‚                      β”‚
β”‚                       β–Ό               β–Ό                      β”‚
β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚                  β”‚ ROLLBACK β”‚   β”‚  ROLLBACKβ”‚               β”‚
β”‚                  β”‚  rev 1   β”‚   β”‚  rev 2   β”‚               β”‚
β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                       β”‚                                     β”‚
β”‚                       β–Ό                                     β”‚
β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                               β”‚
β”‚                  β”‚ UNINSTALLβ”‚                               β”‚
β”‚                  β”‚ (hapus)  β”‚                               β”‚
β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚
β”‚                                                             β”‚
β”‚  Revisions: {1, 2, 3, ...} disimpan otomatis               β”‚
β”‚  Default retention: 10 revisions terakhir                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6. Helm Repositories

Repository adalah kumpulan chart yang bisa diakses melalui HTTP. Repository memungkinkan Anda berbagi chart dengan tim atau komunitas. ArtifactHub adalah repository publik terbesar untuk Helm chart.

Mengelola Repository

Bash
# Tambah repository Bitnami
helm repo add bitnami https://charts.bitnami.com/bitnami

# Tambah repository Grafana
helm repo add grafana https://grafana.github.io/helm-charts

# Tambah repository NGINX Ingress
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# Update cache repository
helm repo update

# Lihat semua repository yang ditambahkan
helm repo list

# Lihat chart di repository tertentu
helm search repo bitnami

# Hapus repository
helm repo remove bitnami

Repository Populer

Repository URL Chart Populer
Bitnamicharts.bitnami.com/bitnaminginx, redis, postgresql, mysql, wordpress
Grafanagrafana.github.io/helm-chartsgrafana, loki, prometheus
Jetstackcharts.jetstack.iocert-manager
NGINX Ingresskubernetes.github.io/ingress-nginxingress-nginx
Harborhelm.goharbor.ioharbor (container registry)

Membuat Repository Sendiri

Bash
# Package chart menjadi file tgz
helm package ./my-chart
# Output: my-chart-0.2.0.tgz

# Buat direktori untuk repository
mkdir -p repo

# Pindahkan file package
mv my-chart-0.2.0.tgz repo/

# Buat index file (index.yaml)
helm repo index repo/ --url https://charts.example.com

# Hasilnya akan menghasilkan repo/index.yaml seperti:
# apiVersion: v1
# entries:
#   my-chart:
#     - name: my-chart
#       version: 0.2.0
#       ...

# Upload repo/ ke web server atau cloud storage
# Tambahkan repository sendiri
helm repo add myrepo https://charts.example.com

# Gunakan chart dari repository sendiri
helm install my-app myrepo/my-chart
ℹ️ Catatan

Untuk repository private, Anda bisa menggunakan ChartMuseum, Harbor, atau AWS S3 sebagai backend storage. Beberapa layanan seperti JFrog Artifactory juga mendukung Helm repository secara native.

7. Membuat Chart Sendiri

Membuat chart sendiri memberikan kontrol penuh atas cara aplikasi di-deploy di Kubernetes. Mari kita buat chart lengkap dari awal untuk sebuah aplikasi web sederhana.

Langkah 1: Inisialisasi Chart

Bash
# Buat chart baru dengan nama "web-app"
helm create web-app

# Lihat struktur yang dihasilkan
tree web-app/
# web-app/
# β”œβ”€β”€ Chart.yaml
# β”œβ”€β”€ .helmignore
# β”œβ”€β”€ charts/
# β”œβ”€β”€ templates/
# β”‚   β”œβ”€β”€ deployment.yaml
# β”‚   β”œβ”€β”€ service.yaml
# β”‚   β”œβ”€β”€ serviceaccount.yaml
# β”‚   β”œβ”€β”€ hpa.yaml
# β”‚   β”œβ”€β”€ ingress.yaml
# β”‚   β”œβ”€β”€ _helpers.tpl
# β”‚   β”œβ”€β”€ NOTES.txt
# β”‚   └── tests/
# β”‚       └── test-connection.yaml
# └── values.yaml

Langkah 2: Edit Chart.yaml

YAML
apiVersion: v2
name: web-app
description: Chart Helm untuk aplikasi web BeebaneLabs
type: application
version: 0.1.0
appVersion: "1.0.0"
maintainers:
  - name: BeebaneLabs
    email: dev@beebanelabs.com

Langkah 3: Konfigurasi Values

YAML
# values.yaml untuk aplikasi web
replicaCount: 2

image:
  repository: beebanelabs/web-app
  pullPolicy: IfNotPresent
  tag: "1.0.0"

serviceAccount:
  create: true
  name: ""
  annotations: {}

podAnnotations:
  prometheus.io/scrape: "true"
  prometheus.io/port: "9090"

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: nginx
  annotations: {}
  hosts:
    - host: web-app.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []

resources:
  limits:
    cpu: 500m
    memory: 256Mi
  requests:
    cpu: 100m
    memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

nodeSelector: {}
tolerations: []
affinity: {}

Langkah 4: Buat Deployment Template

YAML (Template)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "web-app.fullname" . }}
  labels:
    {{- include "web-app.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "web-app.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "web-app.selectorLabels" . | nindent 8 }}
    spec:
      serviceAccountName: {{ include "web-app.serviceAccountName" . }}
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /healthz
              port: http
            initialDelaySeconds: 15
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: http
            initialDelaySeconds: 5
            periodSeconds: 5
          {{- with .Values.resources }}
          resources:
            {{- toYaml . | nindent 12 }}
          {{- end }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

Langkah 5: Build, Test, dan Install

Bash
# Lint chart (validasi syntax)
helm lint web-app/

# Render template (preview output YAML)
helm template my-release web-app/

# Dry-run install
helm install my-release web-app/ --dry-run --debug

# Install chart
helm install my-release web-app/ \
  --set image.tag=1.0.0 \
  --set replicaCount=3

# Package chart untuk distribusi
helm package web-app/

# Install test
helm test my-release

_helpers.tpl: Template Helpers

Go Template
{{/*
Expand the name of the chart.
*/}}
{{- define "web-app.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Create a default fully qualified app name.
*/}}
{{- define "web-app.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

{{/*
Common labels
*/}}
{{- define "web-app.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
{{ include "web-app.selectorLabels" . }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "web-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "web-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

8. Helm Template Functions

Helm menggunakan engine templating Go yang sangat powerful. Memahami fungsi-fungsi template memungkinkan Anda membuat chart yang lebih dinamis dan fleksibel.

Fungsi Dasar

Go Template
# Akses values
{{ .Values.image.repository }}
{{ .Values.replicaCount }}

# Akses chart metadata
{{ .Chart.Name }}
{{ .Chart.Version }}

# Akses release info
{{ .Release.Name }}
{{ .Release.Namespace }}

# Default value (jika kosong, pakai default)
{{ .Values.image.tag | default "latest" }}

# Conditional (if/else)
{{- if .Values.ingress.enabled }}
# Ingress configuration
{{- end }}

# Range (loop)
{{- range .Values.ingress.hosts }}
  - host: {{ .host }}
{{- end }}

# With (scope change)
{{- with .Values.resources }}
resources:
  limits:
    cpu: {{ .limits.cpu }}
{{- end }}

# toYaml (convert ke yaml)
{{ toYaml .Values.resources | nindent 10 }}

# quote & squote
{{ .Values.image.repository | quote }}

# printf (format string)
{{ printf "%s-%s" .Release.Name .Chart.Name }}

# required (wajib diisi)
{{ required "Image repository wajib diisi!" .Values.image.repository }}

# fail (hentikan rendering dengan error)
{{ fail "Error: ingress host harus diisi" }}

Fungsi Sprig (Tambahan Helm)

Helm mendukung library Sprig yang menyediakan ratusan fungsi tambahan:

Go Template
# String manipulation
{{ .Values.name | upper }}           # "HELLO"
{{ .Values.name | lower }}           # "hello"
{{ .Values.name | title }}           # "Hello"
{{ .Values.name | trunc 5 }}         # "Hello" (truncate)
{{ .Values.name | replace "o" "0" }} # "Hell0"

# Lists & Dicts
{{ list "a" "b" "c" }}             # [a b c]
{{ dict "key1" "val1" "key2" "val2" }}
{{ keys .Values.config }}           # list semua keys
{{ hasKey .Values.config "debug" }} # true/false

# Math
{{ add 1 2 }}                       # 3
{{ mul 2 3 }}                       # 6
{{ div 10 3 }}                      # 3
{{ mod 10 3 }}                      # 1
{{ add 1 2 3 }}                     # 6

# Encoding
{{ "hello" | b64enc }}              # base64 encode
{{ "aGVsbG8=" | b64dec }}          # base64 decode

# Crypto
{{ sha256sum "hello" }}             # SHA256 hash

# Type conversion
{{ int64 .Values.replicas }}
{{ toString .Values.port }}

# Semua fungsi Sprig
# https://masterminds.github.io/sprig/

Kondisional Lanjutan

Go Template
# if/else if/else
{{- if eq .Values.env "production" }}
replicas: 5
{{- else if eq .Values.env "staging" }}
replicas: 2
{{- else }}
replicas: 1
{{- end }}

# not, and, or
{{- if and .Values.ingress.enabled .Values.tls.enabled }}
# TLS ingress
{{- end }}

{{- if or .Values.debug .Values.verbose }}
logLevel: debug
{{- end }}

{{- if not .Values.serviceAccount.create }}
# Use existing service account
{{- end }}

# ne (not equal), contains, has
{{- if ne .Values.image.tag "latest" }}
imagePullPolicy: IfNotPresent
{{- end }}

{{- if contains "prod" .Release.Name }}
resources:
  limits:
    cpu: 1000m
{{- end }}

# Regex
{{- if regexMatch "^v[0-9]+" .Values.image.tag }}
# Semver tag detected
{{- end }}

9. Helm Plugins & Ecosystem

Helm memiliki ekosistem plugin yang memperluas fungsinya. Plugin bisa ditambahkan untuk keamanan, manajemen secrets, dan integrasi dengan tools lain.

Plugin Populer

Plugin Fungsi Instalasi
helm-secretsEnkripsi/decryption values menggunakan SOPShelm plugin install https://github.com/jkroepke/helm-secrets
helm-diffPreview perubahan sebelum upgradehelm plugin install https://github.com/databus23/helm-diff
helmfileDeclarative spec untuk multiple releasesbrew install helmfile
helm-gitInstall chart dari Git repositoryhelm plugin install https://github.com/aslafy-z/helm-git
helm unittestUnit testing untuk charthelm plugin install https://github.com/helm-unittest/helm-unittest
helm-cm-pushPush chart ke OCI registryhelm plugin install https://github.com/chartmuseum/helm-push

Contoh: helm-secrets

Bash
# Instalasi helm-secrets
helm plugin install https://github.com/jkroepke/helm-secrets

# Enkripsi values file
sops --encrypt --in-place secrets.yaml
# Hasil: secrets.yaml (encrypted)

# Install dengan secrets
helm secrets upgrade my-release bitnami/nginx \
  -f values.yaml \
  -f secrets://secrets.yaml

# Lihat decrypted values
helm secrets view secrets.yaml

Contoh: helmfile

YAML
# helmfile.yaml - Declarative Helm releases
repositories:
  - name: bitnami
    url: https://charts.bitnami.com/bitnami
  - name: grafana
    url: https://grafana.github.io/helm-charts

releases:
  - name: nginx-ingress
    namespace: ingress-system
    chart: ingress-nginx/ingress-nginx
    version: 4.10.0
    values:
      - controller:
          replicaCount: 2
          resources:
            limits:
              cpu: 500m
              memory: 256Mi

  - name: monitoring
    namespace: monitoring
    chart: grafana/kube-prometheus-stack
    version: 61.0.0
    values:
      - grafana:
          adminPassword: admin123
      - prometheus:
          retention: 30d

  - name: my-app
    namespace: production
    chart: ./charts/my-app
    values:
      - values-production.yaml

Unit Testing Chart

YAML
# tests/deployment_test.yaml
suite: deployment tests
templates:
  - deployment.yaml
tests:
  - it: should create deployment with correct name
    set:
      nameOverride: my-app
    asserts:
      - isKind:
          of: Deployment
      - matchRegex:
          path: metadata.name
          pattern: my-app

  - it: should set correct replica count
    set:
      replicaCount: 3
    asserts:
      - equal:
          path: spec.replicas
          value: 3

  - it: should use correct image
    set:
      image:
        repository: my-app
        tag: "2.0"
    asserts:
      - equal:
          path: spec.template.spec.containers[0].image
          value: "my-app:2.0"

  - it: should not create HPA when autoscaling disabled
    set:
      autoscaling:
        enabled: false
    asserts:
      - hasDocuments:
          count: 1

10. Best Practices

Mengikuti best practices Helm akan membantu Anda mengelola aplikasi di Kubernetes dengan lebih efektif dan aman. Berikut panduan komprehensif dari BeebaneLabs.

Struktur Chart

Praktik Rekomendasi
Versi SemverGunakan versi semver untuk chart: major.minor.patch (1.0.0)
appVersionSelalu update appVersion sesuai versi aplikasi yang di-deploy
Minimal PermissionsJangan berikan RBAC yang terlalu luas di chart
Non-root ContainerSelalu jalankan container sebagai user non-root
Health ProbesSertakan liveness dan readiness probe
Resource LimitsSelalu set resource requests dan limits

Keamanan Chart

Manajemen Release

Diagram: Helm Best Practices Workflow
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              HELM DEPLOYMENT WORKFLOW                        β”‚
β”‚                                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚  Develop │───►│   Lint   │───►│   Test   β”‚              β”‚
β”‚  β”‚  Chart   β”‚    β”‚  & Validateβ”‚   β”‚  (unittest)β”‚            β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜              β”‚
β”‚                                        β”‚                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β”‚
β”‚  β”‚                                                          β”‚
β”‚  β–Ό                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚ Dry-Run  │───►│  Dev     │───►│ Staging  β”‚              β”‚
β”‚  β”‚ Preview  β”‚    β”‚ Deploy   β”‚    β”‚ Deploy   β”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜              β”‚
β”‚                                        β”‚                    β”‚
β”‚                                        β–Ό                    β”‚
β”‚                                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚                                  β”‚Production β”‚              β”‚
β”‚                                  β”‚  Deploy   β”‚              β”‚
β”‚                                  β”‚(--atomic) β”‚              β”‚
β”‚                                  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜              β”‚
β”‚                                        β”‚                    β”‚
β”‚                                        β–Ό                    β”‚
β”‚                                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚                                  β”‚ Monitor  β”‚              β”‚
β”‚                                  β”‚& Rollbackβ”‚              β”‚
β”‚                                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Contoh Perintah Production-Ready

Bash
# Install production dengan semua safety net
helm install my-app bitnami/nginx \
  --namespace production \
  --create-namespace \
  -f values-production.yaml \
  --set image.tag=1.27.0 \
  --atomic \
  --wait \
  --timeout 10m \
  --history-max 10

# Upgrade dengan diff preview
helm diff upgrade my-app bitnami/nginx \
  -f values-production.yaml

# Upgrade dengan atomic (auto-rollback on failure)
helm upgrade my-app bitnami/nginx \
  --namespace production \
  -f values-production.yaml \
  --atomic \
  --wait \
  --timeout 10m

# Lihat semua releases di production
helm list -n production -o wide
⚠️ Peringatan

Selalu gunakan --dry-run sebelum melakukan install/upgrade di production. Periksa diff hasil render template sebelum memastikan perubahan aman untuk diterapkan.

11. Quiz Pemahaman

Uji pemahaman Anda tentang Kubernetes Helm dengan menjawab pertanyaan berikut:

1. Apa fungsi utama file Chart.yaml?

2. Apa itu "release" dalam konteks Helm?

3. Bagaimana cara override values saat install Helm chart?

4. Apa fungsi flag --atomic saat helm install/upgrade?

5. Di direktori mana sub-chart dependencies disimpan?

πŸ” Zoom
100%
🎨 Tema