Limiting the Set of Nodes Where a Service Can Be Announced #
Pada mode L2, hanya satu node yang akan dipilih (elected) untuk mengumumkan (announce) sebuah IP service pada satu waktu.
Secara default, seluruh node yang menjalankan Speaker MetalLB memenuhi syarat untuk mengumumkan IP mana pun.
Namun, pada beberapa skenario, hanya sebagian node yang memiliki konektivitas ke jaringan tertentu. Dalam kondisi seperti ini, penting untuk membatasi node mana saja yang boleh menjadi titik masuk (entry point) bagi IP service.
Pembatasan tersebut dapat dilakukan dengan menggunakan node selector pada Custom Resource L2Advertisement.
Speaker") end subgraph NodeB[Node B] metallBB("MetalLB
Speaker") end subgraph NodeC[Node C] metallBC("MetalLB
Speaker") end end subgraph External_Network[External Network / Router] SubnetA["(Subnet A)"] SubnetB["(Subnet B)"] end %% Definisi Koneksi metallBA -->|announces| SubnetA metallBB -->|announces| SubnetA metallBC -->|announces| SubnetB
Pada contoh di atas:
- NodeA dan NodeB terhubung ke Subnet A
- NodeC terhubung ke Subnet B
Untuk membatasi node yang dapat mengumumkan IP dari sebuah address pool tertentu, properti nodeSelectors harus didefinisikan pada L2Advertisement.
Contoh: Address Pool Hanya untuk NodeA dan NodeB #
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
nodeSelectors:
- matchLabels:
kubernetes.io/hostname: NodeA
- matchLabels:
kubernetes.io/hostname: NodeB
Dengan konfigurasi ini:
- Seluruh IP dari
first-poolhanya dapat diakses melalui NodeA atau NodeB - MetalLB tetap akan memilih satu node saja di antara keduanya untuk mengumumkan IP tersebut
Contoh: Address Pool Hanya untuk NodeC #
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- second-pool
nodeSelectors:
- matchLabels:
kubernetes.io/hostname: NodeC
Dengan konfigurasi ini:
- Seluruh IP dari
second-poolselalu diumumkan oleh NodeC - Node lain tidak akan pernah digunakan untuk mengumumkan IP dari pool ini
Specify network interfaces that LB IP can be announced from #
Pada mode L2, secara default MetalLB Speaker akan mengumumkan IP LoadBalancer melalui seluruh network interface yang dimiliki oleh sebuah node.
Kita dapat membatasi interface yang digunakan dengan properti interfaces pada resource L2Advertisement.
Contoh: Membatasi Interface yang Digunakan #
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- third-pool
interfaces:
- eth0
- eth1
Konfigurasi di atas membuat MetalLB hanya mengumumkan Service yang menggunakan IP dari third-pool melalui interface eth0 dan eth1 pada seluruh node.
Menggabungkan Interface Selector dan Node Selector #
Selector interfaces juga dapat digunakan bersamaan dengan nodeSelectors.
Pada contoh berikut, IP dari fourth-pool hanya akan diumumkan melalui interface eth3 pada NodeA saja:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- fourth-pool
nodeSelectors:
- matchLabels:
kubernetes.io/hostname: NodeA
interfaces:
- eth3
Artinya:
- Node lain tidak akan pernah mengumumkan IP dari
fourth-pool - NodeA hanya akan mengumumkannya melalui
eth3
Perilaku Union Antar L2Advertisement #
Satu IPAddressPool dapat direferensikan oleh lebih dari satu L2Advertisement.
MetalLB akan menggunakan union (gabungan) dari seluruh selector yang berlaku.
Contoh Union Interface #
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example-advertisement9
namespace: metallb-system
spec:
interfaces:
- eno1
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example-advertisement10
namespace: metallb-system
spec:
ipAddressPools:
- pool1
nodeSelectors:
- matchLabels:
kubernetes.io/hostname: hostB
interfaces:
- ens18
Konfigurasi di atas berarti:
- IP dari semua IPAddressPool (termasuk
pool1) diumumkan melalui interfaceeno1pada semua node - IP dari
pool1juga diumumkan melalui interfaceens18padahostB
Catatan Edge Case (Perhatian Khusus) #
-
Semua NodeSelector Tidak Cocok
-
Jika tidak ada node yang cocok dengan
nodeSelectors, maka:- IP tidak akan diumumkan
- Service akan terlihat allocated tetapi tidak dapat diakses dari jaringan
-
Selalu pastikan label node benar dan konsisten.
-
-
Node Down / Tidak Ready
-
Jika node yang terpilih mati atau
NotReady:- MetalLB akan memilih ulang node lain yang masih cocok dengan selector
- Jika tidak ada alternatif node β IP menjadi tidak reachable.
-
-
Perubahan Label Node
-
Mengubah label node (
kubernetes.io/hostnameatau label custom):- Bisa menyebabkan IP berpindah node (re-election)
- Berpotensi memicu ARP refresh atau gangguan koneksi singkat.
-
-
Satu Node Selector = Single Point of Failure
-
Address pool yang dibatasi ke satu node saja (seperti NodeC):
- Tidak memiliki failover
- Cocok hanya untuk kasus jaringan yang benar-benar terisolasi.
-
-
Subnet Tidak Konsisten
-
Jangan mengumumkan IP dari subnet A melalui node yang hanya terhubung ke subnet B:
- Bisa menyebabkan ARP tidak terselesaikan
- Service tidak bisa diakses walaupun MetalLB terlihat βnormalβ.
-
Best Practice MetalLB (Mode L2) #
-
Gunakan Label Node Khusus
-
Hindari bergantung penuh pada
kubernetes.io/hostname -
Contoh:
kubectl label node nodeA metallb.io/subnet=subnet-a -
Lebih aman dan mudah dipelihara.
-
-
Minimal Dua Node per Address Pool (Jika Memungkinkan)
-
Untuk high availability:
- Setidaknya 2 node dalam satu
nodeSelectors - Menghindari single point of failure.
- Setidaknya 2 node dalam satu
-
-
Pisahkan Address Pool Berdasarkan Topologi Jaringan
- Satu subnet β satu address pool β satu
L2Advertisement - Lebih jelas dan mengurangi risiko salah konfigurasi.
- Satu subnet β satu address pool β satu
-
Monitoring & Observability
-
Pantau log
speaker:- Re-election yang sering β indikasi flapping network atau node instability
-
Integrasikan dengan Prometheus jika memungkinkan.
-
-
Gunakan Mode BGP Jika Topologi Kompleks
-
Jika:
- Banyak subnet
- Banyak router
- Butuh load balancing aktif
-
Mode BGP lebih scalable dibanding L2.
-