Skip to main content
  1. Posts/

MetalLB BGP Routing with pfSense

·3 mins·
metallb kubernetes cilium pfsense metallb
Table of Contents

Di kluster kubernetes, MetalLB sering digunakan sebagai layer 2 routing untuk mengalokasikan external IP pada service load balacer yang telah dibuat.

MetalLB juga dapat diintegrasikan dengan pfSense misalnya untuk advertisement IP menggunakan routing BGP.

Sebelum memulai pastikan Anda memiliki kluster kubernetes dengan network plugin seperti Cilium atau Flannel sudah terinstall di kluster.

Configure FRR Global/Zebra
#

Login ke dashboard pfsense lalu install package frr melalui System -> Package Manager -> Available Packages.

Setelah terinstall, kembali ke dashboard lalu arahkan ke Services -> FRR Global/Zebra.

Enable FR lalu setting router ID dan master password.

Configure FRR BGP
#

Selanjutnya konfigurasikan BGP di Services -> FRR BGP. Enable BGP Routing lalu setting Local AS dan Router ID

Gunakan private AS antara 64512 - 65535 kecuali jika Anda mendapatkan public AS dari provider internet Anda.

Pada tab Advanced, scroll ke bawah lalu checklist Disable eBGP Require Policy

Configure BGP neighbors
#

Buat peer group pada Neighbors dengan nama metallb-pg dan atur Remote AS ke 65501 untuk digunakan sebagai myASN di metallb.

Buat individual neighbors ke IP setiap node yang ada di kluster. Lalu pilih peer group yang telah dibuat sebelumnya dan atur nilai remote AS sama seperti peer group.

Install MetalLB
#

Untuk menginstall metallb di kluster gunakan manifest berikut.

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml

Lalu tunggu beberapa saat sampai semua pods running.

Add MetalLB manifests
#

Agar routing BGP dapat berfungsi, Anda perlu menambahkan resource di kluster kubernetes seperti:

  • IPAddressPool - Untuk menentukan rentang IP yang akan digunakan MetalLB LoadBalancers
  • BGPAdvertisement - Untuk mengexpose IPAddressPool di BGP route table
  • BGPPeer - Untuk menghubungkan router pfSense dengan MetalLB menggunakan Local AS dan Remote AS yang sebelumnya ditentukan.

IPAddressPool

nano ipaddresspool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: metallb-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.33.100-192.168.33.245

BGPAdvertisment

nano bgpadvertisment.yaml
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: metallb-advertisment
  namespace: metallb-system
spec:
  ipAddressPools:
  - metallb-pool 
  aggregationLength: 32
  localPref: 100
  communities:
  - 65535:65282

BGPPeer

nano bgppeer-192.168.33.1.yaml
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: bgppeer-192.168.32.1
  namespace: metallb-system
spec:
  myASN: 65501
  peerASN: 65500
  peerAddress: 192.168.33.1

myASN menggunakan remote AS yang ditentukan pada peer group dan individual neighbors. Sedangkan peerASN dan PeerAddress menggunakan Local AS dan Router ID {: .prompt-tip }

Deploy manifest ke kluster kubernetes.

kubectl apply -f ipaddresspool.yaml
kubectl apply -f bgpadvertisment.yaml
kubectl apply -f bgppeer-192.168.33.1.yaml

Demo
#

Untuk percobaannya perlu membuat deployment beserta service dengan type loadbalancer.

Buat namespace dengan nama site.

kubectl create ns site

Selanjutnya buat deployment

kubectl create deployment -n site demo --image=nginxdemos/hello --port=80 --replicas=4

Buat service.

kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: demo-svc
  namespace: site
spec:
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: demo
  type: LoadBalancer
EOF

Cek service untuk memastikan sudah dapat alokasi IP.

# kubectl describe -n site service/demo-svc | grep -i ingress
LoadBalancer Ingress:     192.168.33.100

Test akses http://192.168.33.100 melalui browser.

Cek BGP route table di pfsense dengan CLI.

vtysh -c "show ip bgp"
BGP table version is 13, local router ID is 192.168.33.1, vrf id 0
Default local pref 100, local AS 65500
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 0.0.0.0/0        192.168.12.142          0         32768 ?
*> 192.168.33.0/24  0.0.0.0                  1         32768 ?
*> 192.168.33.100/32
                    192.168.33.11                          0 65501 i
*=                  192.168.33.12                          0 65501 i
*=                  192.168.33.13                          0 65501 i
*> 192.168.12.0/24 0.0.0.0                  1         32768 ?

Displayed  4 routes and 6 total paths

IP 192.168.33.100/32 ada di BGP table.

Related

Resolving Static Route Issues on pfSense
·1 min
pfsense pfsense
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
Backup dan Restore Etcd pada Kubernetes Cluster
·2 mins
kubernetes kubernetes
Deploy Kubernetes Dashboard
·1 min
kubernetes kubernetes