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
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
#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/v1alpha1kind: Registryname: ctlptl-registryport: 5005---apiVersion: ctlptl.dev/v1alpha1kind: Clusterproduct: kindregistry: ctlptl-registrykindV1Alpha4Cluster: 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.yamlCreating registry "ctlptl-registry"...registry.ctlptl.dev/ctlptl-registry createdNo 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-clusterThanks for using kind! đ Connecting kind to registry ctlptl-registrySwitched 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-infoKubernetes control plane is running at https://127.0.0.1:34881CoreDNS is running at https://127.0.0.1:34881/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo 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 nodesNAME STATUS ROLES AGE VERSIONmy-cluster-control-plane Ready control-plane 40m v1.32.2my-cluster-worker Ready <none> 40m v1.32.2
#Deploy Demoapp ke cluster Kind
Buatlah file demoapp.yaml
dengan isi sbb.
---apiVersion: apps/v1kind: Deploymentmetadata: name: demoappspec: 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.yamldeployment.apps/demoapp created
Tunggu hingga deployment ready
jimbo@lima-docker:~/hello-podinfo$ kubectl get deployments --watchNAME READY UP-TO-DATE AVAILABLE AGEdemoapp 0/1 1 0 35sdemoapp 1/1 1 1 45s
Get nama pod yang ingin kita testing, bisa pakai command berikut.
jimbo@lima-docker:~/hello-podinfo$ kubectl get podsNAME READY STATUS RESTARTS AGEdemoapp-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:9898Forwarding from 127.0.0.1:9090 -> 9898Forwarding 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:9090Welcome! 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!