Dalam adopsi orkestrasi kontainer modern, Kubernetes (K8s) telah menjadi standar de facto di tingkat enterprise. Namun, bagi praktisi h...
Dalam adopsi orkestrasi kontainer modern, Kubernetes (K8s) telah menjadi standar de facto di tingkat enterprise. Namun, bagi praktisi homelab, startup, maupun tim DevOps yang mengelola server bare-metal atau klaster virtualisasi privat (seperti Proxmox VE), menjalankan distribusi Kubernetes standar upstream (k8s vanilla) sering kali terlalu berat dalam konsumsi memori serta kompleks dalam instalasi dan pemeliharaannya.
Sebagai alternatif yang efisien, K3s dari Rancher (kini CNCF Sandbox project) hadir sebagai distribusi Kubernetes bersertifikasi resmi yang dikemas dalam satu file biner tunggal (< 100 MB) dengan kebutuhan RAM minimal hanya 512 MB. Kendati demikian, pengguna yang bermigrasi dari cloud publik (seperti AWS EKS atau GCP GKE) ke lingkungan on-premises sering kali membentur kendala mendasar: ketika membuat Service bertipe LoadBalancer, status IP eksternal akan menggantung selamanya pada status <pending> karena ketiadaan komponen cloud controller terintegrasi.
Solusi standar industri untuk mengatasi limitasi ini adalah menerapkan MetalLB. MetalLB bertindak sebagai penyedia network load balancer mandiri untuk klaster Kubernetes bare-metal dengan memanfaatkan protokol jaringan standar seperti Layer 2 (ARP/NDP) atau BGP.
1. Prasyarat Sistem dan Persiapan Node Linux
Sebelum menginstal K3s, pastikan host Linux (Ubuntu 24.04/22.04 LTS atau Debian 12) telah disiapkan dengan konfigurasi kernel dan firewall yang sesuai:
# Perbarui indeks paket dan instal paket utilitas pendukung
sudo apt update && sudo apt install -y curl iptables ebtables ethtool
# Pastikan swap dinonaktifkan untuk stabilitas kubelet (rekomendasi Kubernetes)
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
# Pastikan modul forwarding kernel aktif
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-k8s.conf
sudo sysctl --system
2. Instalasi K3s Server dengan Penonaktifan ServiceLB Bawaan
Secara default, K3s menyertakan ServiceLB internal (sebelumnya bernama Klipper-LB) dan ingress controller Traefik. Agar alokasi IP LoadBalancer dapat ditangani sepenuhnya oleh MetalLB tanpa konflik port atau perebutan paket ARP, kita harus menonaktifkan ServiceLB saat instalasi:
# Instal K3s Server dengan flag penonaktifan servicelb
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable servicelb" sh -
# Verifikasi status layanan K3s
sudo systemctl status k3s --no-pager
Atur izin akses file kubeconfig agar user biasa dapat menjalankan perintah kubectl tanpa harus beralih ke user root:
# Konfigurasi kubeconfig user lokal
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
export KUBECONFIG=~/.kube/config
echo "export KUBECONFIG=~/.kube/config" >> ~/.bashrc
# Periksa kesiapan node klaster
kubectl get nodes -o wide
3. Instalasi MetalLB via Manifest Resmi
Deploy komponen controller dan speaker MetalLB ke dalam namespace khusus metallb-system menggunakan manifest resmi rilis terbaru:
# Terapkan manifest instalasi MetalLB native
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
# Pantau proses pembuatan pod hingga seluruh komponen berstatus RUNNING
kubectl get pods -n metallb-system -w
4. Konfigurasi IP Address Pool dan Layer 2 Advertisement
Mulai versi 0.13+, MetalLB tidak lagi menggunakan ConfigMap sederhana, melainkan memanfaatkan Custom Resource Definitions (CRD) yaitu IPAddressPool dan L2Advertisement.
Buat file konfigurasi bernama metallb-config.yaml. Tentukan rentang IP pada subnet LAN Anda yang tidak dialokasikan oleh server DHCP router fisik (misalnya: 192.168.10.240 - 192.168.10.250):
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: lan-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.10.240-192.168.10.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: lan-l2-advert
namespace: metallb-system
spec:
ipAddressPools:
- lan-ip-pool
Terapkan konfigurasi MetalLB ke dalam klaster:
kubectl apply -f metallb-config.yaml
IPAddressPool berada di luar DHCP Scope router utama Anda. Jika router memberikan IP yang sama ke perangkat fisik lain di LAN, akan terjadi konflik ARP (duplicate IP) yang menyebabkan paket jaringan drop intermiten.
5. Validasi Deploy Aplikasi dengan Service LoadBalancer
Untuk memverifikasi fungsionalitas MetalLB, buat deployment uji coba menggunakan web server Nginx dan ekspos servicenya dengan tipe LoadBalancer:
# Deploy web server Nginx sederhana
kubectl create deployment web-demo --image=nginx:alpine --replicas=2
# Ekspos deployment sebagai Service bertipe LoadBalancer pada port 80
kubectl expose deployment web-demo --port=80 --type=LoadBalancer
# Amati alokasi IP eksternal dari Service
kubectl get svc web-demo
Output terminal akan menampilkan alamat IP dari pool MetalLB pada kolom EXTERNAL-IP:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-demo LoadBalancer 10.43.142.85 192.168.10.240 80:31254/TCP 15s
Uji koneksi HTTP langsung dari mesin lain di jaringan lokal menggunakan curl:
curl -I http://192.168.10.240
# Output: HTTP/1.1 200 OK
Kesimpulan
Kombinasi K3s dan MetalLB menyediakan fondasi klaster Kubernetes bare-metal yang sangat tangguh, ringan, dan mandiri tanpa ketergantungan pada vendor cloud publik. Dengan mode Layer-2, setiap service berjenis LoadBalancer secara transparan memperoleh alamat IP statis yang dapat diakses langsung oleh seluruh perangkat di jaringan lokal atau diteruskan melalui gateway router utama.
COMMENTS