GitOps dengan Argo CD

Konsep Inti GitOps:

Git adalah satu-satunya sumber kebenaran (single source of truth). Kita tidak akan pernah lagi menjalankan kubectl apply -f ... secara manual. Kita akan mendeploy sebuah agent di dalam Kubernetes yang tugasnya adalah "memantau" repository Git, dan secara otomatis menyamakan state kluster dengan apa pun yang ada di repository itu.

Alat yang Kita Pakai:

  • Git Repository (GitHub): Sebagai "sumber kebenaran" kita.

  • Argo CD: Sebagai agent GitOps. Ini adalah controller yang akan kita install di dalam kluster kind kita.

  • Kluster kind: Yang sudah Anda siapkan.


Langkah 0: Persiapan

Pastikan kluster kind Anda berjalan dan kubectl sudah terkonfigurasi.

Langkah 1: Siapkan "Config Repository" Anda

Ini adalah langkah paling penting. Anda perlu repository Git baru yang hanya berisi manifes YAML Kubernetes Anda.

  1. Buat Repo Baru di GitHub:

    • Buatlah repository public baru. (Bisa juga private, tapi public lebih mudah untuk tutorial ini).

    • Misalnya, beri nama: argocd-demo

  2. Clone Repo Baru dan Pindahkan File YAML Anda:

    Di terminal macOS Anda (di luar proyek Spring Boot):

    # Pindah ke direktori home atau tempat Anda biasa menyimpan kode
    cd ~
    
    # Clone repo yang baru Anda buat
    git clone https://github.com/semmidev/argocd-demo.git
    
    # Masuk ke direktori
    cd argocd-demo
  3. Salin SEMUA file YAML Anda ke repo ini:

  4. Commit dan Push:

    Bash

    git add .
    git commit -m "Initial Kubernetes manifests"
    git push origin main

PENTING: Repository ini sekarang adalah "sumber kebenaran" Anda.


Langkah 2: Bersihkan Kluster Anda (Wajib!)

Untuk membuktikan GitOps berfungsi, kita harus mulai dari kluster yang bersih. Hapus semua resource yang sudah Anda buat secara manual.

# Hapus semua resource dari sesi sebelumnya
kubectl delete -f /path/ke/7-app.yml
kubectl delete -f /path/ke/6-postgres.yml
kubectl delete -f /path/ke/2-configmap.yml
kubectl delete -f /path/ke/3-secret.yml
kubectl delete -f /path/ke/5-pvc.yml
kubectl delete -f /path/ke/4-pv.yml

# Pastikan tidak ada yang tersisa (kecuali resource 'kube-system')
kubectl get all -A

Kluster kind Anda sekarang harus kosong.


Langkah 3: Install Argo CD di Kluster kind

Sekarang kita install agent GitOps-nya.

# 1. Buat namespace khusus untuk Argo CD
kubectl create namespace argocd

# 2. Terapkan manifes instalasi Argo CD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Ini akan membuat banyak deployment, service, dll. di dalam namespace argocd.

Langkah 4: Akses Argo CD (UI)

Cara termudah untuk berinteraksi dengan Argo CD adalah melalui UI-nya. Kita akan menggunakan port-forward.

  1. Buka Terminal BARU dan biarkan tetap berjalan:

    # Teruskan port UI Argo CD ke localhost:8081
    kubectl port-forward svc/argocd-server -n argocd 8081:443
  2. Dapatkan Password Admin Awal:

    Password-nya disimpan di dalam secret Kubernetes.

    # Perintah ini akan mengambil dan men-decode password-nya
    kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

    Simpan password yang muncul.

  3. Login ke UI:

    • Buka browser Anda ke https://localhost:8081 (Akan ada peringatan keamanan sertifikat, klik "Advanced" -> "Proceed").

    • Username: admin

    • Password: Password yang Anda dapatkan dari langkah sebelumnya.


Langkah 5: Buat "Aplikasi" di Argo CD

Sekarang kita akan memberitahu Argo CD untuk "memantau" repository Git Anda.

  1. Di UI Argo CD, klik + NEW APP.

  2. Isi formulir:

    • Application Name: my-demo-app

    • Project Name: default

    • Sync Policy: Manual (Kita akan klik "Sync" secara manual untuk belajar).

  3. Source:

    • Repository URL: URL GitHub Anda, misal: https://github.com/sammidev/my-k8s-config.git

    • Revision: HEAD

    • Path: . (Artinya root dari repository)

  4. Destination:

    • Cluster URL: https://kubernetes.default.svc (Ini adalah kluster in-cluster tempat Argo CD berjalan).

    • Namespace: default (Ini adalah namespace tujuan tempat aplikasi Anda akan di-deploy).

  5. Klik CREATE.

Langkah 6: Deploy dengan GitOps (The Magic!)

Anda akan melihat kartu my-demo-app dengan status Missing dan OutOfSync. Ini normal. Argo CD melihat bahwa repo Git Anda memiliki YAML, tetapi kluster Anda (di namespace default) masih kosong.

  1. Klik kartu my-demo-app untuk melihat detailnya.

  2. Anda akan melihat visualisasi semua resource Anda (ConfigMap, Secret, PV, PVC, StatefulSet, dll.).

  3. Klik tombol Sync di bagian atas.

  4. Biarkan semua opsi dicentang, lalu klik SYNCHRONIZE.

Apa yang terjadi? Argo CD sekarang akan membaca semua file YAML di repo Git Anda dan menjalankan kubectl apply untuk Anda.

Anda bisa melihat di UI, satu per satu resource akan dibuat dan menjadi Healthy. Anda juga bisa mengecek di terminal:

kubectl get all,pv,pvc

Semua aplikasi Anda (Postgres dan Spring Boot) akan menyala, tanpa Anda mengetik kubectl sama sekali.


Langkah 7: Praktek GitOps (Melakukan Upgrade)

Ini adalah bagian terpenting. Mari kita upgrade aplikasi kita.

Tugas: Ganti image dari sammidev/demo-time:1.0.0 ke sammidev/demo-time:1.1.0.

CARA LAMA (JANGAN DILAKUKAN): kubectl set image ...

CARA BARU (GIT-OPS):

  1. Push image baru Anda (Asumsi sudah Anda lakukan):

    Anda sudah build dan push sammidev/demo-time:1.1.0.

  2. Ubah Sumber Kebenaran (Git):

    • Di macOS Anda, buka repository my-k8s-config (bukan proyek Spring Boot).

    • Edit file 7-app.yml.

    • Ubah baris image:

      ...
            image: sammidev/demo-time:1.1.0 # <-- UBAH DI SINI
      ...
  3. Commit dan Push Perubahan:

    git add 7-app.yml
    git commit -m "Upgrade demo-time-app to v1.1.0"
    git push origin main
  4. Sync Perubahan:

    • Kembali ke UI Argo CD.

    • Setelah beberapa saat, status my-demo-app akan berubah menjadi OutOfSync.

    • Argo CD telah mendeteksi bahwa Git (v1.1.0) dan kluster (v1.0.0) sudah tidak sama.

    • Klik my-demo-app, lalu klik Sync lagi.

Argo CD akan melihat perbedaan kecil itu (hanya image tag di Deployment) dan hanya akan menerapkan perubahan itu, yang secara otomatis memicu Rolling Update di Kubernetes.

Last updated