Artikel ini adalah lanjutan dari artikel sebelumnya tentang High Avaliability Kubernetes Cluster dengan CAPI di LXD
Jika kalian mengikuti seri sebelumnya tentang High Avaliability Kubernetes Cluster dengan CAPI di LXD, kube-vip saya pasang sebagai loadbalancer agar terpasang secara default untuk menyediakan Virtual IP (VIP) bagi control-plane, memastikan API server tetap highly available. Namun, fungsi kube-vip tidak berhenti di situ. Ia juga bisa bertindak sebagai LoadBalancer untuk Service di dalam cluster, memberikan "jalan masuk" dari luar cluster kedalam Pod.
Apa itu Kube-VIP?
Kube-VIP adalah tools opensource yang dirancang untuk mengalokasikan Virtual IP (VIP) pada cluster Kubernetes. Kube-VIP sendiri sering dipakai untuk cluster yang menggunakan High Avaliability, kube-vip juga sering digunakan sebagai tool pendukung untuk Loadbalance clustering.
Bagaimana Mekanisme Kube-VIP?
Secara umum, kube-vip bekerja dengan mekainsem leader election, untuk pemilihannya sendiri menggunakan lease pada etcd.
Mendeteksi Service Baru:
kube-vipterus memantau resourceServicedi dalam cluster. Ketika ia menemukan sebuahServicedengantype: LoadBalancer, kube-vip akan trigger dirinya untuk running.Leader Election: Jika ada beberapa replika
kube-vipyang berjalan (satu di setiap node), mereka akan melakukan proses leader election khusus untuk Service tersebut. Hanya satukube-vipyang akan menjadi atau leader untuk expose VIP.Mengambil alih VIP:
kube-vipyang menjadi leader akan mengambil alih alamat IP yang didefinisikan dispec.loadBalancerIPatau dari pool alamat IP. Ia akan memasang alamat IP virtual ke network interface di node tempat ia berjalan.Routing:
kube-vipkemudian akan memberikan info ke jaringan lokal bahwa alamat IP virtual tersebut kini bisa dijangkau melalui node-nya. Caranya dengan menggunakan protokol ARP (untuk Layer 2). Jadi, router didalam host kalian akan tahu ke mana harus mengirim traffic untuk IP tersebut.Kube-Proxy: Setelah traffic dari luar berhasil masuk ke node yang menggunakan VIP, tugas selanjutnya diambil alih oleh
kube-proxy.kube-proxyakan meneruskan traffic tersebut secara merata ke salah satu Pod yang menjadi target dari Servicenginx, di mana pun Pod itu berada di dalam cluster.
Singkatnya, kube-vip membawa traffic dari luar ke dalam cluster, dan kube-proxy mendistribusikannya ke Pod yang tepat.
Bagaimana Cara menggunakan Kube-VIP dalam Cluster Kubernetes?
Untuk mengaktifkan fitur ini, kita hanya perlu memastikan bahwa pada konfigurasi static pod kube-vip (yang biasanya dibuat oleh clusterctl), terdapat argumen svc_election yang bernilai true.
# Contoh env var di dalam static pod manifest kube-vip
# /etc/kubernetes/manifests/kube-vip.yaml
apiVersion: v1
kind: Pod
metadata:
name: kube-vip
namespace: kube-system
spec:
containers:
- args:
- manager
env:
# Variabel ini yang mengaktifkan fitur LoadBalancer Service
- name: svc_enable
value: "true"
# Opsi ini memastikan hanya satu node yang menjadi leader untuk satu service
- name: svc_election
value: "true"
# ... variabel env lainnyaUji Coba
Mari kita coba mengekspos sebuah Pod nginx menggunakan Service LoadBalancer.
Deploy Pod Nginx
# Gunakan kubeconfig cluster production kalian export KUBECONFIG=nb-cluster-prod.kubeconfig kubectl run nginx --image=nginxExpose Pod dengan Service LoadBalancer
kubectl expose pod nginx --port=80 --type=LoadBalancerJika kalian cek
Service-nya,EXTERNAL-IPakan berada dalam status<pending>. Ini karena kita perlu memberitahukube-vipalamat IP mana yang harus digunakan.$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12h nginx LoadBalancer 10.98.175.118 <pending> 80:32494/TCP 3sMenetapkan Alamat IP Eksternal
Edit
Servicenginxdan tambahkan anotasikube-vip.io/loadbalancerIPs.kubectl edit svc nginxTambahkan anotasi berikut di bawah
metadata.annotations:apiVersion: v1 kind: Service metadata: annotations: kube-vip.io/loadbalancerIPs: "10.236.16.101" # <-- Tambahkan IP ini ... spec: ...Penting! Pastikan alamat IP yang kalian pilih (
10.236.16.101dalam contoh ini) berada di subnet yang sama dengan node cluster kalian dan tidak sedang digunakan oleh perangkat lain.Verifikasi
Setelah disimpan,
kube-vipakan langsung mendeteksi perubahan dan men-assign IP tersebut.$ kubectl get svc nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.98.175.118 10.236.16.101 80:32494/TCP 2m16skalian bisa melihat anotasi tambahan
kube-vip.io/vipHostpadaServiceyang menunjukkan node mana yang saat ini menjadi leader dan memegang VIP.$ kubectl get svc nginx -o yaml ... metadata: annotations: kube-vip.io/loadbalancerIPs: 10.236.16.101 kube-vip.io/vipHost: nb-cluster-prod-pwxdw-td6jr # <-- VIP dipegang oleh node ini ...Jika kalian masuk ke node tersebut dan memeriksa alamat IP-nya, kalian akan melihat VIP (
10.236.16.101) terpasang di network interface-nya.# Login ke node nb-cluster-prod-pwxdw-td6jr $ ip a ... 23: eth0@if24: <...> inet 10.236.16.96/24 ... inet 10.236.16.101/32 scope global eth0 # <-- Ini dia VIP-nya ...Melihat log dari Pod
kube-vipdi node tersebut juga akan mengonfirmasi proses ini, di mana ia berhasil mendapatkan lease dan menambahkan VIP.

Pengujian dari Luar cluster
Sekarang, mari kita coba akses aplikasi yang sudah kita deploy sebelumnya dari luar cluster yang berada di jaringan yang sama (10.236.16.0/24), disini, saya akan coba akses nginx menggunakan alamat IP eksternal.
# Cek konektivitas
nc -zv 10.236.16.101 80
# Output: Connection to 10.236.16.101 80 port [tcp/http] succeeded!
# Akses Nginx
curl [http://10.236.16.101](http://10.236.16.101)-m8gn.webp)
Referensi
https://kube-vip.io/docs/installation/static/