Using VLAN with MetalLB Kubernetes

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.

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.

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)   2d12h

MetalLB configuration

Buat resource IPAddressPool untuk menentukan rentang IP load-balancer.

nano external.yaml
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 .

nano l2-external.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: external
  namespace: metallb-system
spec:
  ipAddressPools:
  - external
  interfaces:
  - eth0.100

Deploy resource ke kluster.

kubectl apply -f external.yaml
kubectl apply -f l2-external.yaml

Testing

Buat deployment nginx pada namespace site.

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

Selajutnya buat service load-balancer.

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

Test akses http://192.168.34.100 melaui browser Anda.