IPAddressPool adalah jantung manajemen alamat MetalLB. Episode ini membahas cara mendefinisikan rentang IP dalam bentuk range dan CIDR, opsi autoAssign serta avoidBuggyIPs, perilaku alokasi controller, dan pembebasan IP ketika Service dihapus.

Di episode 3 kalian membuat IPAddressPool pertama tanpa membahas detailnya. Episode 4 mengorek bagian yang paling penting dalam operasi sehari-hari MetalLB: IPAddressPool dan IPAM (IP Address Management). Di sinilah kalian menentukan dari mana IP eksternal berasal, berapa banyak yang tersedia, dan bagaimana controller mengelolanya.
IPAM yang salah bisa menimbulkan masalah yang sulit dilacak: dua Service memakai IP sama, IP bentrok dengan perangkat lain di jaringan, atau pool yang kosong tanpa alasan yang jelas. Memahami cara kerja pool akan membuat semua masalah ini bisa dicegah sejak awal.
Sebuah IPAddressPool bisa berisi satu atau banyak rentang, baik berupa range eksplisit maupun CIDR. Contoh berikut menggabungkan keduanya:
apiVersion: metallb.io/v1beta2
kind: IPAddressPool
metadata:
name: mixed-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.200-192.168.1.220
- 192.168.2.0/28
- fd00:1::10-fd00:1::1fRentang 192.168.1.200-192.168.1.220 dan CIDR 192.168.2.0/28 adalah cara yang sah untuk menyatakan blok IPv4, dan rentang IPv6 juga didukung. MetalLB akan menghitung semua IP yang tercakup dan memakainya sebagai satu kumpulan alamat.
Jika hanya butuh satu IP, kalian bisa menuliskannya sebagai range satu alamat: 192.168.1.200-192.168.1.200. Ini berguna untuk memberi IP khusus pada Service tertentu — teknik yang akan kita pakai lagi di episode 9 untuk seleksi Service.
Secara default, controller bebas mengambil IP dari pool mana pun yang tersedia. Opsi autoAssign: false membatasi pool agar hanya melayani Service yang secara eksplisit memintanya lewat annotation:
apiVersion: metallb.io/v1beta2
kind: IPAddressPool
metadata:
name: reserved-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.250
autoAssign: falsePool dengan autoAssign: false tidak akan dipakai otomatis oleh Service. Service yang menginginkan IP dari pool ini harus menyebutkannya lewat annotation metallb.universe.tf/address-pool: reserved-pool.
Perangkat jaringan tertentu memiliki bug dengan bit terakhir dari subnet — terutama alamat yang diakhiri dengan .255 atau .0. Opsi avoidBuggyIPs: true membuat controller menghindari IP yang berakhiran 0 dan 255 di setiap /24:
apiVersion: metallb.io/v1beta2
kind: IPAddressPool
metadata:
name: safe-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.0/24
avoidBuggyIPs: trueavoidBuggyIPs: true pada CIDR 192.168.1.0/24 membuat pool ini hanya menawarkan IP 192.168.1.1 sampai 192.168.1.254, minus alamat jaringan dan broadcast. Jika jaringan kalian dipenuhi switch lama yang bermasalah, opsi ini penyelamat.
Ketika Service LoadBalancer dibuat, controller menontonnya dan mulai mencari IP. Logika pemilihannya sederhana namun penting:
autoAssign: false dilewati kecuali Service memintanya secara eksplisit.Proses ini bisa diamati langsung lewat events Service:
kubectl describe svc nginx
kubectl get events --field-selector involvedObject.name=nginxkubectl get events --field-selector involvedObject.name=nginx akan menampilkan pesan seperti Allocated IP 192.168.1.200 yang ditulis oleh controller. Inilah bukti visual dari proses IPAM.
MetalLB melacak alokasi secara internal, sehingga dua Service tidak akan pernah mendapat IP yang sama dari pool yang sama. Konflik bisa terjadi jika IP tersebut di luar kontrol MetalLB — misalnya dipakai DHCP atau perangkat statis lain di jaringan. Oleh karena itu penting memilih blok IP yang benar-benar bebas, seperti yang kita siapkan di episode 0.
IP bersifat ephemeral: selama Service ada, IP dipinjamkan; begitu Service dihapus, IP dikembalikan ke pool dan bisa dipakai Service lain. Verifikasinya mudah:
kubectl delete svc nginx
kubectl get svc -A
kubectl get ipaddresspoolSetelah kubectl delete svc nginx, event mencatat Deallocating IP 192.168.1.200. IP kembali tersedia untuk alokasi berikutnya — tidak ada langkah manual yang diperlukan.
Warning
Jika kalian menghapus IPAddressPool yang sedang dipakai oleh Service yang masih ada, Service tersebut akan kehilangan IP-nya saat pod di-restart atau saat Service diperbarui. Hindari menghapus pool yang masih aktif di produksi.
Untuk mengetahui IP mana yang sedang dialokasikan oleh pool tertentu, periksa Service di namespace tersebut:
kubectl get svc -A -o wideKolom EXTERNAL-IP pada kubectl get svc -A -o wide menampilkan semua IP yang sedang dipinjam dari pool. Membandingkannya dengan daftar alamat di pool akan menunjukkan berapa kapasitas yang tersisa — pembahasan yang akan kalian dalami di episode 17.
Episode 4 menuntaskan pemahaman IPAM MetalLB: cara mendefinisikan pool dengan range dan CIDR, opsi autoAssign dan avoidBuggyIPs, logika alokasi controller, serta siklus hidup IP dari peminjaman hingga pembebasan.
Inti yang harus dibawa pulang:
IPAddressPool bisa berisi range eksplisit, CIDR, atau keduanya.autoAssign: false membuat pool hanya melayani Service yang memintanya lewat annotation.avoidBuggyIPs: true menghindari alamat yang berakhiran 0 dan 255.Di episode 5 selanjutnya kita akan membahas Layer 2 mode secara mendalam — cara kerja announcement dengan ARP/NDP, peran node leader yang meng-announce IP, mekanisme failover saat node mati, serta karakteristik dan keterbatasan mode ini yang sering mengejutkan pemula.