Helm charts dalam alur GitOps: HelmRepository sebagai source, HelmRelease untuk release, strategi pengelolaan values, siklus hidup install upgrade rollback, hingga dependency antar release.

Di episode 7 kalian sudah menggunakan Kustomize untuk me-merge dan men-transform manifest. Kini giliran Helm — cara lain, dan sering kali lebih praktis, untuk mengemas aplikasi. Flux menjalankan Helm sepenuhnya dari dalam cluster lewat Helm Controller, jadi kalian tidak perlu memasang Helm di laptop.
Kita akan pelajari HelmRepository sebagai source chart, HelmRelease sebagai wadah release, pengelolaan values, siklus hidup release, dan dependency.
Sebelum chart bisa di-install, Flux harus tahu dari mana chart itu berasal. Objeknya bernama HelmRepository. Repo publik contohnya Bitnami dan ingress-nginx:
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: bitnami
namespace: flux-system
spec:
interval: 1h
url: https://charts.bitnami.com/bitnamiBuat lewat CLI:
flux create source helm bitnami \
--url=https://charts.bitnami.com/bitnami \
--interval=1hRepo privat (ChartMuseum, Artifactory, Harbor) butuh autentikasi:
flux create secret helm auth-helm \
--username=arman \
--password=$HELM_PASSWORD
flux create source helm internal \
--url=https://helm.internal.acme.com \
--secret-ref=auth-helmSelain HTTP, HelmRepository juga mendukung OCI — chart dikemas sebagai image di registry seperti Harbor, ECR, atau GHCR. Cukup beri type: oci dan URL registry:
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: ghcr
namespace: flux-system
spec:
type: oci
interval: 10m
url: oci://ghcr.io/armanTip
OCI menjadi standar distribusi chart modern karena bisa memakai registry yang sama dengan image aplikasi, termasuk mekanisme auth dan scan kerentanan yang sudah ada.
HelmRelease adalah CRD dari Helm Controller. Ia mereferensikan chart dari HelmRepository dan menentukan konfigurasi release:
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: redis
namespace: databases
spec:
interval: 5m
chart:
spec:
chart: redis
version: "20.x"
sourceRef:
kind: HelmRepository
name: bitnami
values:
architecture: standalone
auth.enabled: trueLewat CLI:
flux create helmrelease redis \
--source=HelmRepository/bitnami \
--chart=redis \
--chart-version="20.x" \
--target-namespace=databasesYang perlu diperhatikan:
chart.spec.chart — nama chart di repository.chart.spec.version — batasan versi semver. Nilai "20.x" berarti semua versi 20.spec.interval — seberapa sering Flux memeriksa chart versi baru.spec.values — nilai yang menimpa default chart.Chart selalu di-install ke namespace yang sama dengan lokasi HelmRelease, kecuali kalian set spec.targetNamespace. Untuk merelease chart ke namespace lain, sertakan service account agar Helm Controller punya izin.
Ada dua cara utama memberikan values: inline di spec.values, atau diambil dari ConfigMap atau Secret lewat spec.valuesFrom.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: redis
namespace: databases
spec:
chart:
spec:
chart: redis
version: "20.x"
sourceRef:
kind: HelmRepository
name: bitnami
values:
architecture: standalone
valuesFrom:
- kind: ConfigMap
name: redis-values
valuesKey: common.yaml
- kind: Secret
name: redis-secret-values
valuesKey: secrets.yamlUrutan override (yang terakhir menang):
values.yaml).spec.values pada HelmRelease.valuesFrom sesuai urutan kemunculannya di daftar.Warning
valuesFrom dan spec.values digabung dengan urutan yang deterministik, tapi hasilnya bukan deep merge penuh. Simpan setiap nilai hanya di satu tempat untuk menghindari kejutan saat chart di-upgrade.
Helm Controller mengelola install, upgrade, dan rollback secara otomatis. Setiap kali chart atau source berubah, Flux melakukan upgrade:
flux get helmreleases
flux reconcile helmrelease redis
kubectl describe helmrelease redis -n databasesChart Helm dengan pre-upgrade, post-install, atau job test tetap berjalan karena Flux mendukung penuh hook Helm. Aktifkan test agar Flux mengeksekusi job test saat upgrade:
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: redis
namespace: databases
spec:
interval: 5m
test:
enable: true
chart:
spec:
chart: redis
version: "20.x"
sourceRef:
kind: HelmRepository
name: bitnamiinstall.createNamespace: true — Helm membuat namespace otomatis saat install.upgrade.force: true — force upgrade, merecreate resource yang immutable.upgrade.atomic: true — jika upgrade gagal, seluruh release di-rollback otomatis.uninstall.disableHooks dan uninstall.keepHistory — mengontrol perilaku saat HelmRelease dihapus.apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: redis
namespace: databases
spec:
install:
createNamespace: true
remediation:
retries: 3
upgrade:
atomic: true
remediation:
retries: 5
rollback:
enable: true
interval: 5m
chart:
spec:
chart: redis
version: "20.x"
sourceRef:
kind: HelmRepository
name: bitnamiImportant
Kombinasi upgrade.atomic: true dan remediation.retries adalah yang terbaik untuk production: kegagalan tidak pernah meninggalkan cluster dalam kondisi setengah-setengah.
Ada dua lapis dependency yang perlu dipahami: antar chart dan antar Kustomization atau HelmRelease.
dependsOn antar Kustomization atau antar HelmRelease:apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
namespace: flux-system
spec:
dependsOn:
- name: databases
path: ./apps
prune: true
sourceRef:
kind: GitRepository
name: fleetDengan ini, Kustomization apps baru dijalankan setelah databases selesai dan semua release-nya dilaporkan sehat. Detail orkestrasi seperti health check dan pencegahan circular dependency dibahas tuntas di episode 10.
Note
Kunci mental: Kustomize atau HelmRelease menentukan apa yang dideploy, sedangkan dependsOn menentukan urutan deploy. Keduanya bekerja bersama untuk menjaga konsistensi.
Helm kini menjadi bagian dari alur GitOps kalian:
dependsOn.Selanjutnya kita akan mendalami source management: referensi Git tingkat lanjut, HelmRepository dan OCIRepository, bucket storage, sampai verifikasi signature GPG dan Cosign. Sampai jumpa!