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.
#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
#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: kind10registry: ctlptl-registry11kindV1Alpha4Cluster:12 name: my-cluster13 nodes:14 - role: control-plane15 - 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-cluster17 18Thanks for using kind! đ19 Connecting kind to registry ctlptl-registry20Switched to context "kind-my-cluster".21 đ Connected cluster kind-my-cluster to registry ctlptl-registry at localhost:500522 đ 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-info2Kubernetes control plane is running at https://127.0.0.1:348813CoreDNS is running at https://127.0.0.1:34881/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy4 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 nodes2NAME STATUS ROLES AGE VERSION3my-cluster-control-plane Ready control-plane 40m v1.32.24my-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: demoapp11 template:12 metadata:13 labels:14 app: demoapp15 spec:16 containers:17 - name: demoapp18 image: docker.io/hashicorp/demo-webapp-lb-guide19 ports:20 - containerPort: 989821 env:22 - name: PORT23 value: "9898"24 - name: HOST_IP25 valueFrom:26 fieldRef:27 fieldPath: status.podIP
Execute deployment dengan kubectl
1jimbo@lima-docker:~/hello-podinfo$ kubectl apply -f demoapp.yaml2deployment.apps/demoapp created
Tunggu hingga deployment ready
1jimbo@lima-docker:~/hello-podinfo$ kubectl get deployments --watch2NAME READY UP-TO-DATE AVAILABLE AGE3demoapp 0/1 1 0 35s4demoapp 1/1 1 1 45s
Get nama pod yang ingin kita testing, bisa pakai command berikut.
1jimbo@lima-docker:~/hello-podinfo$ kubectl get pods2NAME READY STATUS RESTARTS AGE3demoapp-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:98982Forwarding from 127.0.0.1:9090 -> 98983Forwarding 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:90902Welcome! 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!