Belajar GitOps - FluxCD - Your First GitOps Deployment
Episode 6 of 36

Belajar GitOps - FluxCD - Your First GitOps Deployment

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

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

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.

Struktur Repository Manifest

Repository manifest (fleet repo) adalah tempat semua konfigurasi cluster disimpan:

Struktur repository manifest
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.

Membuat Source GitRepository

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:

gitrepository.yaml di flux-system
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.git
  • interval — 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.

SSH vs HTTPS

Autentikasi dikonfigurasi lewat spec.secretRef:

MetodeURLSecretCocok untuk
HTTPS + PAThttps://github.com/...username + passwordGitHub, GitLab
HTTPS + tokenhttps://github.com/...tokenToken tanpa username
SSHgit@github.com:...identity + known_hostsRepo privat, security ketat

Repo publik tidak butuh secret sama sekali. Repo privat HTTPS memakai basic auth dengan personal access token sebagai password:

Membuat secret untuk repo privat
flux create secret git webapp-auth \
  --url=https://github.com/arman/webapp-manifests.git \
  --username=arman \
  --password=$GITHUB_TOKEN

Important

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:

Memeriksa status source
flux get sources git

Output flux get sources git menampilkan kolom READY dan STATUS. Jika READY bernilai True, repo sudah berhasil disalin ke cache Flux.

Membuat Kustomization

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:

Kustomization untuk webapp
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: webapp
  • sourceRef — 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).

Mendeploy Aplikasi Pertama

Sekarang kita isi repo dengan manifest aplikasi webapp di direktori webapp/:

webapp/deployment.yaml
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: 80

Tambahkan file namespace.yaml untuk membuat namespace webapp, lalu commit semuanya:

Commit manifest dan trigger sinkronisasi
git add webapp/
git commit -m "feat: add webapp manifests"
git push origin main
flux reconcile source git webapp

flux reconcile source git webapp memaksa Flux mengambil versi terbaru tanpa menunggu interval.

Verifikasi Deployment

Tunggu beberapa detik lalu periksa:

Memeriksa hasil reconciliation
flux get kustomizations
kubectl get deployment webapp -n webapp
kubectl get pods -n webapp

Cek peristiwa terbaru jika ada masalah:

Melihat events resource
kubectl describe kustomization webapp -n flux-system
kubectl get events -n flux-system --sort-by=.lastTimestamp | tail -20

Warning

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.

Mengubah Konfigurasi lewat Git

Inti GitOps diuji di sini. Ubah jumlah replika dari 2 menjadi 4, lalu commit dan push — tanpa menyentuh kubectl apply:

Ubah konfigurasi dan push
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 webapp

Flux 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.

Penutup

Deployment GitOps pertama kalian sudah berjalan dan teruji:

  • Struktur 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.
  • Commit ke Git, push, lalu Flux menyesuaikan cluster — loop GitOps bekerja end-to-end.
  • Verifikasi mandiri dengan 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!

Belajar GitOps - FluxCD - Your First GitOps Deployment | Belajar FluxCD & GitOps