Memelihara Konfigurasi Kubernetes dengan Kustomize

Reyhan Sofian Haqqi
Pujangga Teknologi
Published in
4 min readAug 25, 2019

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

Teknik untuk mengelola objek Kubernetes (https://kubernetes.io/docs/concepts/overview/working-with-objects/object-management/)
  1. 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.
  2. 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.
  3. 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 bernamakustomization.yaml yang isinya terdiri dari beberapa kategori fields:

  1. 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
  2. generators: menghasilkan sebuah resource baru. Contoh: secretGenerator, configMapGenerator
  3. transformers: mengubah atau mengganti nilai sebuah resource. Contoh: namePrefix, nameSuffix, images, commonLabels, patchesJson6902
  4. 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

Struktur akar direktori

Lalu kita buat base kustomization yang berisi deployment.yaml, service.yaml, dan kustomization.yaml seperti berikut

hello-world/base/deployment.yaml
hello-world/base/service.yaml
hello-world/base/kustomization.yaml

Jika kita jalankan perintah kustomize build hello-world/base akan menghasilkan keluaran seperti berikut

Output of kustomize build

Dapat kita lihat bahwa Kustomize akan menggabukan 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 . Lalu kita buat satu berkas baru dengan nama patch-replicas.yaml dan kustomization.yaml yang masing-masing isinya seperti berikut

hello-world/overlays/staging/patch-replicas.yaml
hello-world/overlays/staging/kustomization.yaml

Dan apabila kita jalan perintahkustomize build hello-world/overlays akan menghasilkan keluaran

Output of kustomize build

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 .

Ilustrasinya seperti berikut:

Base deployment dengan 1 replicas (https://speakerdeck.com/spesnova/introduction-to-kustomize?slide=28)

Kita mendefinisikan replicas di base kustomization kita dengan nilai 1 (hello-world/base/deployment.yaml).

Patch deployment replicas menjadi 3 replicas (https://speakerdeck.com/spesnova/introduction-to-kustomize?slide=29)

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.

Hasil patch deployment replicas menjadi 3 replicas (https://speakerdeck.com/spesnova/introduction-to-kustomize?slide=30)

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

--

--