Apakah itu GitOps?

GitOps adalah salah satu cara untuk mengimplementasikan Continuous Deployment aplikasi berbasis cloud yang menggunakan Git sebagai single source of truth. Secara garis besar, GitOps adalah Git yang berisi deskripsi tentang kondisi infrastruktur yang kita inginkan secara deklaratif dan proses yang berjalan secara otomatis untuk membuat kondisi di infrastruktur sesuai dengan apa yang telah kita deklarasikan di Git repository. Misalnya kita ingin men-deploy aplikasi baru atau mengubah versi aplikasi yang telah berjalan, yang perlu kita lakukan adalah mengubah isi Git repository dan selanjutnya akan diproses secara otomatis.

Bagaimana GitOps Bekerja?

Seperti yang sudah dijelaskan sebelumnya, komponen utama dalam GitOps adalah Git dan automation tools. GitOps menitikberatkan proses deployment pada Git repository sebagai pusatnya. Setidaknya dibutuhkan 2 git repository untuk implementasi GitOps, yaitu repository untuk aplikasi dan repository untuk konfigurasi aplikasi. Repository aplikasi berisi tentang source code aplikasi dan repository konfigurasi berisi tentang semua konfigurasi aplikasi yang kita inginkan untuk dijalankan pada infrastruktur. Konfigurasi ini biasanya berisi tentang aplikasi apa yang ingin kita jalankan, kebutuhan infrastuktur seperti apa yang dibutuhkan untuk menjalankan aplikasi (message broker, database, service mesh, dll), dan versi berapa yang akan kita pakai.

Lalu apakah Argo CD?

Argo CD merupakan alat implementasi GitOps yang digunakan untuk melakukan continuous deployment secara deklaratif untuk Kubernetes. Pengaturan aplikasi akan disimpan secara deklaratif, dikelola secara otomatis, dapat diaudit, dan mudah dipahami. 

Argo CD akan melakukan deployment secara otomatis untuk aplikasi yang sudah kita deklarasikan pada target cluster GKE yang ditentukan. Deployment aplikasi ini dapat kita atur untuk mengikuti salah satu branch, tag, atau pin ke versi yang spesifik pada git commit di repository kita.

Di bawah ini adalah gambaran arsitektur Argo CD.

Instalasi ArgoCD pada Google Kubernetes Engine

Tutorial kali ini akan membahas bagaimana mengimplementasikan GitOps di Google Kubernetes Engine(GKE) dengan Argo CD. Sebelum membuat tutorial, yang harus kita persiapkan terlebih dahulu adalah: 

  • Google Cloud SDK yang sudah terkoneksi dengan proyek GCP kita
  • kubectl tools yang dipasang pada perangkat kita
  • Git private repository yang akan kita gunakan untuk menyimpan file konfigurasi aplikasi
  1. Membuat Cluster di GKE (Opsional)

Pertama yang harus kita siapkan adalah cluster GKE dan akses ke dalamnya. Disini kita akan membuat cluster GKE dengan nama gitops-demo yang terletak di asia-southeast2-a, tipe mesin e2-medium, dan berisi 2 nodes sesuai dengan command dibawah ini.

gcloud container clusters create gitops-demo \
--num-nodes "2" \
--zone "asia-southeast2-a" \
--node-locations "asia-southeast2-a" \
--machine-type "e2-medium"

Selanjutnya untuk berinteraksi dengan cluster via kubectl dari perangkat kita, kita bisa menggunakan command seperti di bawah ini.

gcloud container clusters get-credentials gitops-demo --zone asia-southeast2-a

2. Instalasi Argo CD

Langkah kedua yang kita lakukan adalah menyediakan namespace yang akan digunakan untuk instalasi Argo CD. Disini kita akan menggunakan namespace dengan nama argocd dan menginstal Argo CD kedalamnya.

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Argo CD tidak memiliki IP publik secara bawaan namun kita memilki beberapa cara untuk mengekspos Argo CD kita, diantaranya adalah: mengubah service type menjadi LoadBalancer, Ingress, atau kubectl port-forward. Pada contoh kali ini kita akan mengubah service type menjadi LoadBalancer dan mendapatkan IP publik supaya bisa diakses dari internet dengan command seperti di bawah ini.

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
kubectl get svc argocd-server -n argocd --output jsonpath='{.status.loadBalancer.ingress[0].ip}'

Selanjutnya jika kita akses IP publik dari service yang sudah kita ubah ke LoadBalancer tadi menggunakan web browser, kita akan mendapatkan tampilan login ke Argo CD seperti di bawah ini.

Untuk masuk ke dashboard Argo CD, username admin dan nama pod Argo CD server sebagai password adalah kredensial yang disediakan secara bawaan. Kita dapat menggunakan command di bawah ini untuk mendapatkan password bawaan instalasi Argo CD kita.

kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

Jika proses login berhasil kita akan melihat dashboard Argo CD yang masih kosong seperti gambar dibawah ini.

3. Menambahkan Private Git Repository

Pada contoh kali ini kita akan menggunakan sebuah private repository yang kita simpan di Github. Sebagai contoh kita akan menggunakan file deployment.yaml yang berisi nginx dengan 2 buah replika.

Selanjutnya kita akan menambahkan private repository tadi dengan mengakses menu Settings > Repositories > CONNECT REPO USING HTTPS seperti pada gambar di bawah ini.

Langkah selanjutnya adalah mengisi formulir sesuai dengan private repository kita. Pada contoh ini kita hanya perlu mengisi 3 bagian dari formulir yaitu Repository URL, Username Github kita, dan personal access token yang kita gunakan sebagai password kemudian menyimpannya dengan tombol CONNECT.

Jika langkah sebelumnya berhasil, kita dapat melihat daftar repository yang terhubung dengan Argo CD kita di halaman Settings > Repositories.

4. Menambahkan Aplikasi

Langkah selanjutnya adalah menambahkan aplikasi untuk dioperasikan oleh Argo CD dengan mengakses menu Applications > NEW APP seperti gambar di bawah ini.

Selanjutnya ada formulir yang harus kita isi supaya Argo CD dapat beroperasi. Kita akan mulai membahas dari bagian GENERAL. Pada bagian ini kita akan memberi nama nginx sebagai nama aplikasi kita dan memasukkannya pada project default dari Argo CD. Kemudian kita rubah SYNC POLICY ke Automatic untuk menggunakan fitur sinkroniasi otomatis yang memungkinkan aplikasi diperbaharui secara otomatis saat ada perubahan di git repository kita.

Pada bagian SOURCE, kita akan menambahkan pengaturan dari git repository yang sudah kita lakukan sebelumnya. Disini kita arahkan Argo CD untuk membaca branch main dan lokasi dimana file konfigurasi aplikasi berada.

Kemudian pada bagian DESTINATION kita pilih ke cluster mana aplikasi kita akan dijalankan dan namespace apa yang akan digunakan. Pada contoh kali ini kita akan menggunakan namespace default bawaan dari kubernetes.

Yang paling akhir adalah pengaturan cara pembacaan Argo CD terhadap direktory yang ada di git repository, arguments, dan variables. Pada contoh ini kita tidak merubah apapun di bagian ini.

Selanjutnya setelah kita mengisi semua formulir yang dibutuhkan dan menyimpannya, kita dapat melihat aplikasi kita pada menu Applications. Kita dapat melihat kondisi aplikasi kita apakah kondisinya sama dengan di git repository atau tidak dari kolom Status yang bertuliskan Synced seperti gambar di bawah ini.

Jika kita buka lebih detil, kita dapat melihat komponen apa saja yang terhubung antara git repository dengan Argo CD. Disini terlihat bahwa hanya ada 1 buah komponen Deployment NGINX dengan 2 buah replika.

5. Merubah isi repository

Untuk mengubah kondisi aplikasi kita, yang harus kita lakukan adalah mengubah file konfigurasi yang kita simpan di git repository. Pada contoh kali ini kita akan menambah jumlah replika. Kondisi sebelumnya kita mempunyai 2 buah replika dan selanjutnya kita akan menambahkan 3 buah replika seperti gambar di bawah ini.

Selanjutnya Argo CD akan membaca perubahan yang terjadi pada git repository dan melakukan sinkronisasi secara otomatis. Gambar di bawah menunjukkan bahwa replika NGINX sekarang berjumlah 5 buah.

Kemudian bagaimana jika kita melakukan perubahan tanpa melalui git repository? Argo CD akan menandai aplikasi kita dengan status OutOfSync. Gambar di bawah ini adalah tampilan ketika jumlah replika diturunkan menjadi 1 melalui console GCP. Kita dapat melakukan sinkronisasi lagi dengan tombol SYNC untuk menyamakan kondisi di cluster GKE kita dengan git repository atau menyalakan pengaturan Self Heal pada saat menambahkan aplikasi ke Argo CD untuk secara otomatis melakukan sinkronisasi jika terjadi perubahan dari luar git repository.

Anda punya pertanyaan seputar artikel ini? Silakan kontak kami dengan mengisi formulir di bawah.

Artikel ditulis oleh:
Sthepanus Arya Pratama
Back-end Developer