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.