Tech With Ngurah Bagus
Tech With Ngurah Bagus
Published on 2025-09-23 / 114 Visits
0
0

Part-3: Kube-Vip sebagai LoadBalancer Service

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.

  1. Mendeteksi Service Baru: kube-vip terus memantau resource Service di dalam cluster. Ketika ia menemukan sebuah Service dengan type: LoadBalancer, kube-vip akan trigger dirinya untuk running.

  2. Leader Election: Jika ada beberapa replika kube-vip yang berjalan (satu di setiap node), mereka akan melakukan proses leader election khusus untuk Service tersebut. Hanya satu kube-vip yang akan menjadi atau leader untuk expose VIP.

  3. Mengambil alih VIP: kube-vip yang menjadi leader akan mengambil alih alamat IP yang didefinisikan di spec.loadBalancerIP atau dari pool alamat IP. Ia akan memasang alamat IP virtual ke network interface di node tempat ia berjalan.

  4. Routing: kube-vip kemudian 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.

  5. Kube-Proxy: Setelah traffic dari luar berhasil masuk ke node yang menggunakan VIP, tugas selanjutnya diambil alih oleh kube-proxy. kube-proxy akan meneruskan traffic tersebut secara merata ke salah satu Pod yang menjadi target dari Service nginx, 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 lainnya

Uji Coba

Mari kita coba mengekspos sebuah Pod nginx menggunakan Service LoadBalancer.

  1. Deploy Pod Nginx

    # Gunakan kubeconfig cluster production kalian
    export KUBECONFIG=nb-cluster-prod.kubeconfig
    
    kubectl run nginx --image=nginx
  2. Expose Pod dengan Service LoadBalancer

    kubectl expose pod nginx --port=80 --type=LoadBalancer

    Jika kalian cek Service-nya, EXTERNAL-IP akan berada dalam status <pending>. Ini karena kita perlu memberitahu kube-vip alamat 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   3s
  3. Menetapkan Alamat IP Eksternal

    Edit Service nginx dan tambahkan anotasi kube-vip.io/loadbalancerIPs.

    kubectl edit svc nginx

    Tambahkan 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.101 dalam contoh ini) berada di subnet yang sama dengan node cluster kalian dan tidak sedang digunakan oleh perangkat lain.

  4. Verifikasi

    Setelah disimpan, kube-vip akan 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   2m16s

    kalian bisa melihat anotasi tambahan kube-vip.io/vipHost pada Service yang 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-vip di node tersebut juga akan mengonfirmasi proses ini, di mana ia berhasil mendapatkan lease dan menambahkan VIP.

kubernetes logs

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)

test kube-vip from external cluster

Referensi

  • https://kube-vip.io/docs/installation/static/


Comment