Membangun Mesin Pengembangan Kubernetes secara Local dengan Lima-vm

What?

Mesin Pengembangan adalah salah satu perkakas yang bisa digunakan oleh Pengembang untuk mendapatkan feedback dari apa yang sedang dikerjakan. Dengan catatan mesin ini bisa berjalan di Laptop/Komputer secara Local, tentunya dengan sumber daya yang memadai.

Diharapkan dengan Mesin ini yang tersedia di local, dapat meningkatkan jumlah iterasi dan feedback yang didapat menjadi lebih sering.

Dengan mendapatkan feedback yang sering, pengembang dapat melakukan beberapa iterasi yang disebut Inner loop secara mandiri. Setelah cukup percaya diri, pekerjaan bisa diteruskan ke anggota Tim yang lain untuk melalui iterasi lain seperti Testing, Bug fixing dll, yang disebut Outer loop, berikut ilustrasi yang diambil dari blog Sourcegraph.

Inner loop and Outer loop

Why?

Sebagai pengembang yang sehari-hari berinteraksi dengan aplikasi yang di deploy di Kubernetes, ada baik-nya untuk mendekatkan diri dengan teknologi yang satu ini.

Inilah salah satu alasan saya untuk membuat sebuah "Development Box" yang terisolasi berupa virtual machine. Dan berisikan beberapa tools terkait untuk belajar Kubernetes.

Sebelum-nya saya menggunakan Multipass.run dan Microk8s, namun kali ini mari kita coba untuk eksplorasi Kind dengan Lima-vm.

How?

Instalasi Lima-vm bisa mengikuti tulisan saya sebelum-nya disini, selain itu ada beberapa tools lain yang perlu di-install.

Membuat vm dengan template Docker

1limactl start template://docker

Tambahkan flag --rosetta jika menggunakan Chip Apple silicon dan ingin menjalankan container berbasis x86.

Instalasi CLI tool

Install cli tools berikut ini sudah terinstal di-dalam Lima-vm docker, berikut cara instalasi-nya

  1. Kubectl
  2. Kind
  3. Ctlptl

Membuat Kind cluster dengan Ctlptl

Sebelum-nya pastikan sudah berada di dalam Lima-vm docker

1limactl shell docker

Buat file kind.yaml

1---
2apiVersion: ctlptl.dev/v1alpha1
3kind: Registry
4name: ctlptl-registry
5port: 5005
6---
7apiVersion: ctlptl.dev/v1alpha1
8kind: Cluster
9product: kind
10registry: ctlptl-registry
11kindV1Alpha4Cluster:
12 name: my-cluster
13 nodes:
14 - role: control-plane
15 - role: worker

Mengapa menggunakan Ctlptl ? karena ctlptl dapat membuat cluster berdasarkan config file, yang nanti akan berguna jika ingin berbagi config dengan anggota tim yang lain.

Cluster config diatas sudah mencakup local registry jika kita ingin build local image, push image tersebut ke local registry yang bisa dipull oleh Kind cluster. Beberapa contoh definisi ctlptl bisa lihat di repo ini.

Namun iterasi yang lebih nyaman untuk workflow diatas saya sarankan dijalankan bersama Tilt.dev, yang mana akan dibahas di artikel selanjutnya.

Buat cluster dengan perintah berikut.

1jimbo@lima-docker:~/hello-podinfo$ ctlptl apply -f kind.yaml
2Creating registry "ctlptl-registry"...
3registry.ctlptl.dev/ctlptl-registry created
4No kind clusters found.
5Creating cluster "my-cluster" ...
6 ✓ Ensuring node image (kindest/node:v1.32.2) đŸ–ŧ
7 ✓ Preparing nodes đŸ“Ļ đŸ“Ļ
8 ✓ Writing configuration 📜
9 ✓ Starting control-plane đŸ•šī¸
10 ✓ Installing CNI 🔌
11 ✓ Installing StorageClass 💾
12 ✓ Joining worker nodes 🚜
13Set kubectl context to "kind-my-cluster"
14You can now use your cluster with:
15 
16kubectl cluster-info --context kind-my-cluster
17 
18Thanks for using kind! 😊
19 Connecting kind to registry ctlptl-registry
20Switched to context "kind-my-cluster".
21 🔌 Connected cluster kind-my-cluster to registry ctlptl-registry at localhost:5005
22 👐 Push images to the cluster like 'docker push localhost:5005/alpine'
23cluster.ctlptl.dev/kind-my-cluster created

Pastikan sudah terkoneksi dengan Kind cluster

1jimbo@lima-docker:~/hello-podinfo$ kubectl cluster-info
2Kubernetes control plane is running at https://127.0.0.1:34881
3CoreDNS is running at https://127.0.0.1:34881/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
4 
5To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Dari definisi cluster Ctlptl pada file kind.yaml diatas, kita dapat definisikan cluster terdiri dari 1 server dan 1 worker. Kita bisa pastikan dengan perintah kubecl get nodes

1jimbo@lima-docker:~/hello-podinfo$ kubectl get nodes
2NAME STATUS ROLES AGE VERSION
3my-cluster-control-plane Ready control-plane 40m v1.32.2
4my-cluster-worker Ready <none> 40m v1.32.2

Deploy Demoapp ke cluster Kind

Buatlah file demoapp.yaml dengan isi sbb.

1---
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: demoapp
6spec:
7 replicas: 1
8 selector:
9 matchLabels:
10 app: demoapp
11 template:
12 metadata:
13 labels:
14 app: demoapp
15 spec:
16 containers:
17 - name: demoapp
18 image: docker.io/hashicorp/demo-webapp-lb-guide
19 ports:
20 - containerPort: 9898
21 env:
22 - name: PORT
23 value: "9898"
24 - name: HOST_IP
25 valueFrom:
26 fieldRef:
27 fieldPath: status.podIP

Execute deployment dengan kubectl

1jimbo@lima-docker:~/hello-podinfo$ kubectl apply -f demoapp.yaml
2deployment.apps/demoapp created

Tunggu hingga deployment ready

1jimbo@lima-docker:~/hello-podinfo$ kubectl get deployments --watch
2NAME READY UP-TO-DATE AVAILABLE AGE
3demoapp 0/1 1 0 35s
4demoapp 1/1 1 1 45s

Get nama pod yang ingin kita testing, bisa pakai command berikut.

1jimbo@lima-docker:~/hello-podinfo$ kubectl get pods
2NAME READY STATUS RESTARTS AGE
3demoapp-6c66595c9f-bnjsw 1/1 Running 0 6m14s

Lakukan port-forward untuk bisa mengakses pod tersebut.

1jimbo@lima-docker:~/hello-podinfo$ kubectl port-forward pod/demoapp-6c66595c9f-bnjsw 9090:9898
2Forwarding from 127.0.0.1:9090 -> 9898
3Forwarding from [::1]:9090 -> 9898

Coba kirim request ke pod dengan curl, kamu bahkan bisa request dari host machine karena Lima-vm sudah support automatic port forwarding.

1jimbo@host:~$ curl http://localhost:9090
2Welcome! You are on node 10.244.1.4:9898

Kesimpulan

Kebiasaan saya di Windows menggunakan WSL bisa saya replikasi juga di lingkungan Macos/Linux dengan Lima-vm. Kita bisa melakukan iterasi pengembangan/eksperimen dengan lebih leluasa tanpa khawatir tidak sengaja mengganggu host/machine utama yang kita gunakan sehari-hari karena sudah ter-isolasi dalam sebuah virtual machine.

Terimakasih untuk semua creator, maintainer dari semua tools diatas, Kualitas hidup saya menjadi lebih baik!