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
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 LoadBalancersBGPAdvertisement
- Untuk mengexposeIPAddressPool
di BGP route tableBGPPeer
- 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.