Apa itu Kustomize?
Kustomize adalah sebuah alat command line (CLI) yang bisa digunakan untuk memelihara konfigurasi Kubernetes atau biasa disebut objek Kubernetes (Kubernetes object) secara deklaratif. Kustomize diluncurkan oleh Google dan menjadi sub-projek dari Kubernetes SIG-CLI.
Konsep Kustomize
Deklaratif (declarative). Secara mudah dari deklaratif adalah kita mendefinisikan state dari objek Kubernetes dan biarkan sistem Kubernetes yang membuatnya dengan cara membuat berkas-berkas konfigurasi untuk objek Kubernetes, lalu aplikasikan menggunakan kubectl apply. Contoh:
kubectl diff -f configs/ && kubectl apply -f configs/
untuk melihat perbedaan yang terjadi di dalam berkas-berkas yang ada di dalam sebuah direktori, lalu aplikasikan perubahannya.Konfigurasi bebas template (template-free configuration). Parameterized template adalah cara yang digunakan untuk menghasilkan konfigurasi yang dapat digunakan berulang kali (reusable). Akan tetapi perlu tambahan alat dan waktu untuk belajar. Jika beberapa tim ingin menambahkan konfigurasi baru yang nilainya bisa berubah-ubah, maka konfigurasi ini perlu dibuatkan template baru. Akhirnya template ini akan semakin besar dan semakin susah dibaca. Hal ini menjadi tidak sesuai dengan tujuan awal dari reusability. Akhirnya Kustomize menggunakan konsep reusability dengan menggunakan patch yang mana menyusun bagian-bagian yang diperlukan pada saat proses diffing.
Dapat disusun (composable). Kustomize dapat menyusun (compose) konfigurasi Kubernetes dengan menggunakan base dan overlays yang berisi sekumpulan sumber daya untuk konfigurasi. Sehingga konsep reusability masih tetap terjaga.
Glosarium
Kustomization root
Kustomization root adalah sebuah direktori yang isinya terdapat berkas bernama kustomization.yaml
. Biasanya berkas ini berada di dalam akar direktori (root folder).
Kustomization
Ini adalah istilah untuk sebuah berkas yang bernama kustomization.yaml
yang isinya terdiri dari beberapa kategori fields:
-
resources
: root relative path ke sebuah berkas YAML atau JSON yang valid untuk objek Kubernetes. Atau bisa juga sebuah path ke sebuah kustomization atau URL dari sebuah kustomization. Contoh: resources, crds -
generators
: menghasilkan sebuah resource baru. Contoh: secretGenerator, configMapGenerator -
transformers
: mengubah atau mengganti nilai sebuah resource. Contoh: namePrefix, nameSuffix, images, commonLabels, patchesJson6902 -
meta
: menambahkan nilai yang berlaku untuk keseluruhan kustomization. Contoh: vars, namespace, apiVersion, kind
Base
Base adalah sebuah kustomization yang direferensikan oleh kustomization lain. Dengan kata lain, base akan digunakan oleh satu atau beberapa overlay sebagai dasar untuk sebuah kustomization.
Overlay
Overlay adalah sebuah kustomization yang bergantung (depend) kepada kustomization lain. Dengan kata lain, sebuah overlay membutuhkan satu atau beberapa base untuk membuat sebuah kustomization. Overlay tidak dapat digunakan jika tidak memiliki base.
Penggunaan Dasar
Mari kita mulai dengan membuat struktur direktori seperti berikut
Lalu kita buat base kustomization yang berisi deployment.yaml
, service.yaml
, dan kustomization.yaml
seperti berikut
Jika kita jalankan perintah kustomize build hello-world/base
akan menghasilkan keluaran seperti berikut
Dapat kita lihat bahwa Kustomize akan menggabungkan berkas-berkas yang ada di dalam field resources
menjadi satu berkas. Lalu bagaimana jika kita ingin menambahkan replicas
untuk deployment yang ada di staging? Cukup mudah. Kita cuma perlu membuat overlays
di direktori hello-world/overlays/staging
.
Selanjutnya kita buat satu berkas baru dengan nama patch-replicas.yaml
dan kustomization.yaml
yang masing-masing isinya seperti berikut
Dan apabila kita jalan perintah kustomize build hello-world/overlays
akan menghasilkan keluaran
Jika kita perhatikan di keluaran dari hasil build di atas, nilai replicas
yang ada di dalam deployment berganti dari 1 menjadi 3. Nilai ini sesuai dengan nilai yang kita definisikan di berkas hello-world/staging/patch-replicas.yaml
.
Kita mendefinisikan replicas
di base kustomization kita dengan nilai 1 (hello-world/base/deployment.yaml
).
Lalu kita buat overlays untuk staging dan kita ubah nilai replicas
menjadi 3 (hello-world/staging/patch-replicas.yaml
). Kita daftarkan patch tersebut ke dalam resources patchesStrategicMerge
.
Dengan mendaftarkan patch tersebut, kita bisa mengubah nilai dari deployment replicas
dari 1 menjadi 3.
Ekstra
Kita bisa memvalidasi apakah hasil kustomize build
sesuai dengan Kubernetes API dengan menggunakan kubeval (https://github.com/instrumenta/kubeval). Penggunaan dengan Kustomize juga cukup mudah dengan menggunakan pipe. Contoh: kustomize build hello-world/staging | kubeval
Credits
- https://kubernetes.io/docs/concepts/overview/working-with-objects/object-management/
- https://speakerdeck.com/spesnova/introduction-to-kustomize
- https://github.com/kubernetes-sigs/kustomize/blob/master/docs/glossary.md
- https://kubectl.docs.kubernetes.io/pages/app_management/field_merge_semantics.html
Discussion