Skip to main content
  1. Posts/

Advanced L2 Configuration with MetalLB

·4 mins·
metallb metallb kubernetes
Table of Contents

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.

graph LR %% Definisi Node dan Subgraph subgraph Cluster_Kubernetes[Kubernetes Cluster] subgraph NodeA[Node A] metallBA("MetalLB
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-pool hanya 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-pool selalu 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 interface eno1 pada semua node
  • IP dari pool1 juga diumumkan melalui interface ens18 pada hostB

Catatan Edge Case (Perhatian Khusus)
#

  1. 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.

  2. 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.
  3. Perubahan Label Node

    • Mengubah label node (kubernetes.io/hostname atau label custom):

      • Bisa menyebabkan IP berpindah node (re-election)
      • Berpotensi memicu ARP refresh atau gangguan koneksi singkat.
  4. 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.
  5. 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)
#

  1. 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.

  2. Minimal Dua Node per Address Pool (Jika Memungkinkan)

    • Untuk high availability:

      • Setidaknya 2 node dalam satu nodeSelectors
      • Menghindari single point of failure.
  3. Pisahkan Address Pool Berdasarkan Topologi Jaringan

    • Satu subnet β†’ satu address pool β†’ satu L2Advertisement
    • Lebih jelas dan mengurangi risiko salah konfigurasi.
  4. Monitoring & Observability

    • Pantau log speaker:

      • Re-election yang sering β†’ indikasi flapping network atau node instability
    • Integrasikan dengan Prometheus jika memungkinkan.

  5. Gunakan Mode BGP Jika Topologi Kompleks

    • Jika:

      • Banyak subnet
      • Banyak router
      • Butuh load balancing aktif
    • Mode BGP lebih scalable dibanding L2.

Related

Using VLAN with MetalLB Kubernetes
·2 mins
metallb kubernetes metallb
Install MetalLB di Kubernetes
·2 mins
metallb kubernetes metallb
MetalLB BGP Routing with pfSense
·3 mins
metallb kubernetes cilium pfsense metallb
Configure Calico with eBPF Mode
·3 mins
calico kubernetes calico
Convert Docker Compose to Kubernetes Resources
·1 min
kubernetes kubernetes
Konfigurasi Mode VXLAN pada Calico Kubernetes
·2 mins
calico kubernetes calico