Deployment GitOps pertama kalian: struktur repository manifest, membuat source GitRepository dan Kustomization, mendeploy aplikasi pertama, lalu uji auto sync dengan mengubah konfigurasi lewat Git.

Di episode 5 kalian sudah menguasai Flux CLI — flux check, flux get, flux reconcile, sampai flux create. Sekarang semua alat itu kita pakai untuk hal yang nyata: deployment GitOps pertama. Mulai episode ini, Git menjadi satu-satunya sumber kebenaran; cluster hanya mengikuti apa yang ada di repository.
Kita akan menyiapkan struktur repository, source GitRepository, dan Kustomization, lalu mendeploy aplikasi pertama dan menguji loop GitOps.
Repository manifest (fleet repo) adalah tempat semua konfigurasi cluster disimpan:
gitops-cluster/
├── clusters/production/
│ └── flux-system/
├── apps/webapp/
│ ├── deployment.yaml
│ └── service.yaml
└── infrastructure/
└── ingress-nginx/clusters/ — konfigurasi spesifik cluster, termasuk file bootstrap dari flux bootstrap di episode 4.apps/ — konfigurasi aplikasi bisnis: satu folder per aplikasi.infrastructure/ — komponen platform seperti ingress controller, monitoring, atau storage.Tip
Tidak ada aturan kaku; yang penting konsisten. Beberapa tim menaruh semuanya di apps/, tim lain memisahkan infrastructure/ karena izin PR-nya berbeda. Pilih yang sesuai ukuran tim.
Source adalah titik awal semua alur GitOps. Flux tidak menerapkan manifest langsung dari repo; ia menyalin repo ke cache lokal, lalu manifest itu dirender dan diterapkan. Objek yang mengatur ini adalah GitRepository:
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: webapp
namespace: flux-system
spec:
interval: 1m
ref:
branch: main
url: https://github.com/arman/webapp-manifests.gitinterval — seberapa sering Flux mengecek repo. Untuk production biasa 5m sampai 10m; untuk lab bisa 1m agar perubahan cepat terdeteksi.ref — bisa branch, tag, commit, atau semver. Detailnya dibahas di episode 9.Autentikasi dikonfigurasi lewat spec.secretRef:
| Metode | URL | Secret | Cocok untuk |
|---|---|---|---|
| HTTPS + PAT | https://github.com/... | username + password | GitHub, GitLab |
| HTTPS + token | https://github.com/... | token | Token tanpa username |
| SSH | git@github.com:... | identity + known_hosts | Repo privat, security ketat |
Repo publik tidak butuh secret sama sekali. Repo privat HTTPS memakai basic auth dengan personal access token sebagai password:
flux create secret git webapp-auth \
--url=https://github.com/arman/webapp-manifests.git \
--username=arman \
--password=$GITHUB_TOKENImportant
Jangan pernah menaruh token di manifest. Selalu simpan dalam Secret Kubernetes, dan jangan commit Secret itu ke Git. Untuk kebutuhan production, episode 11 membahas SOPS dan External Secrets Operator.
Verifikasi source berhasil tersinkronisasi:
flux get sources gitOutput flux get sources git menampilkan kolom READY dan STATUS. Jika READY bernilai True, repo sudah berhasil disalin ke cache Flux.
GitRepository hanya menyediakan isi repo. Kustomization-lah yang menentukan apa yang diterapkan — ini CRD dari Kustomize Controller, jangan disamakan dengan file kustomization.yaml yang dibahas di episode 7:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: webapp
namespace: flux-system
spec:
interval: 5m
path: ./webapp
prune: true
sourceRef:
kind: GitRepository
name: webapp
targetNamespace: webappsourceRef — menunjuk ke source mana, di sini GitRepository bernama webapp.path — direktori di dalam repo yang dirender. Bisa folder berisi kustomization.yaml, atau langsung file YAML polos.targetNamespace — namespace default untuk resource yang tidak menyebutkan namespace.prune — menyingkirkan resource yang sudah tidak ada di Git (garbage collection).Sekarang kita isi repo dengan manifest aplikasi webapp di direktori webapp/:
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
namespace: webapp
spec:
replicas: 2
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx:1.27
ports:
- containerPort: 80Tambahkan file namespace.yaml untuk membuat namespace webapp, lalu commit semuanya:
git add webapp/
git commit -m "feat: add webapp manifests"
git push origin main
flux reconcile source git webappflux reconcile source git webapp memaksa Flux mengambil versi terbaru tanpa menunggu interval.
Tunggu beberapa detik lalu periksa:
flux get kustomizations
kubectl get deployment webapp -n webapp
kubectl get pods -n webappCek peristiwa terbaru jika ada masalah:
kubectl describe kustomization webapp -n flux-system
kubectl get events -n flux-system --sort-by=.lastTimestamp | tail -20Warning
Jika flux get kustomizations menunjukkan READY bernilai False, pesan pada kolom STATUS adalah petunjuk terbaik. Penyebab paling umum: path salah, namespace belum dibuat, atau sourceRef belum Ready. Cek juga kubectl describe dan events sebelum panik.
Inti GitOps diuji di sini. Ubah jumlah replika dari 2 menjadi 4, lalu commit dan push — tanpa menyentuh kubectl apply:
git add webapp/deployment.yaml
git commit -m "chore: scale webapp to 4 replicas"
git push origin main
flux reconcile kustomization webapp
kubectl get pods -n webappFlux mendeteksi perubahan di repo, merender ulang manifest, dan menyesuaikan cluster. Tidak ada apply manual, tidak ada drift — Git dan cluster selaras.
Note
Bandingkan dengan cara lama: login ke cluster, ubah deployment manual, lupa merekam perubahan. Dengan GitOps, setiap perubahan punya jejak audit di Git dan bisa di-rollback hanya dengan git revert lalu push.
Deployment GitOps pertama kalian sudah berjalan dan teruji:
clusters/, apps/, infrastructure/ membuat repository manifest rapi dan mudah dinavigasi.GitRepository menyediakan isi repo ke Flux; autentikasi via HTTPS atau SSH diatur lewat Secret.Kustomization menentukan path, source, namespace target, dan perilaku prune.flux get, kubectl get, dan events sebelum memercayai status.Semuanya masih memakai manifest polos. Di episode 7 kita akan bekerja dengan Kustomize: template base yang bisa dipakai ulang, overlays untuk tiap environment, patch strategi, dan fitur CRD Kustomization yang tidak ada pada binary Kustomize. Sampai jumpa!