Panduan singkat untuk membuat service LoadBalancer dengan External-IP menggunakan VLAN.
Sebelum memulai pastikan Anda sudah memiliki:
- pfSense
- Kluster Kubernetes dengan addon network (flannel atau cilium)
Semua saya buat dalam lingkup VM.
Create VLAN
Buat VLAN di pfsense. pertama login ke dashboard
Selanjutnya arahkan ke Interfaces -> Assignments -> VLANs

Klik Add lalu pada parent interface pilih interface dan tentukan VLAN tag

Kembali ke tab Interface Assignments. Pilih Add pada interface VLAN.

Selanjutnya arahkan ke Interfaces -> OPT1. Lalu Enable interface dan tentukan IP VLAN.

VLAN configuration
Membuat dan konfigurasi interface VLAN dapat Anda lakukan pada semua node atau hanya pada master node saja.
1
2
ip link add link eth0 eth0.100 type vlan id 100
ip link set eth0.100 up
Disini tidak perlu menambahkan IP pada interface VLAN. Sebab akan dialokasi untuk service load-balancer kecuali IP yang mengarah ke router pfSense (192.168.34.1/24).
Install MetalLB
Untuk deploy MetalLB dengan manifest.
1
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
Tunggu beberapa saat sampai pods controller dan speaker status running.
# kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-595f88d88f-kb48s 1/1 Running 3 (21m ago) 2d12h
speaker-dvqjl 1/1 Running 6 (20m ago) 2d12h
speaker-txfx7 1/1 Running 6 (20m ago) 2d12h
speaker-wxb96 1/1 Running 6 (20m ago) 2d12hMetalLB configuration
Buat resource IPAddressPool untuk menentukan rentang IP load-balancer.
1
nano external.yaml
1
2
3
4
5
6
7
8
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: external
namespace: metallb-system
spec:
addresses:
- 192.168.34.100-192.168.34.245
Selanjutnya buat resource L2Advertisement .
1
nano l2-external.yaml
1
2
3
4
5
6
7
8
9
10
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: external
namespace: metallb-system
spec:
ipAddressPools:
- external
interfaces:
- eth0.100
Deploy resource ke kluster.
1
2
kubectl apply -f external.yaml
kubectl apply -f l2-external.yaml
Testing
Buat deployment nginx pada namespace site.
1
2
kubectl create ns site
kubectl create deployment -n site demo --image=nginxdemos/hello --port=80 --replicas=2
Selajutnya buat service load-balancer.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: demo
namespace: site
spec:
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: demo
type: LoadBalancer
EOF
Cek service.
# kubectl get -n site service/demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo LoadBalancer 10.11.102.64 192.168.34.100 80:31797/TCP 5m18s
