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

limactl 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

limactl shell docker

Buat file kind.yaml

---
apiVersion: ctlptl.dev/v1alpha1
kind: Registry
name: ctlptl-registry
port: 5005
---
apiVersion: ctlptl.dev/v1alpha1
kind: Cluster
product: kind
registry: ctlptl-registry
kindV1Alpha4Cluster:
name: my-cluster
nodes:
- role: control-plane
- 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.

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

Pastikan sudah terkoneksi dengan Kind cluster

jimbo@lima-docker:~/hello-podinfo$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:34881
CoreDNS is running at https://127.0.0.1:34881/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To 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

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

Deploy Demoapp ke cluster Kind

Buatlah file demoapp.yaml dengan isi sbb.

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demoapp
spec:
replicas: 1
selector:
matchLabels:
app: demoapp
template:
metadata:
labels:
app: demoapp
spec:
containers:
- name: demoapp
image: docker.io/hashicorp/demo-webapp-lb-guide
ports:
- containerPort: 9898
env:
- name: PORT
value: "9898"
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.podIP

Execute deployment dengan kubectl

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

Tunggu hingga deployment ready

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

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

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

Lakukan port-forward untuk bisa mengakses pod tersebut.

jimbo@lima-docker:~/hello-podinfo$ kubectl port-forward pod/demoapp-6c66595c9f-bnjsw 9090:9898
Forwarding from 127.0.0.1:9090 -> 9898
Forwarding 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.

jimbo@host:~$ curl http://localhost:9090
Welcome! 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!