Install MetalLB di Kubernetes

Menginstall MetalLB di kluster kubernetes memungkinkan Anda untuk membuat load-balacer tanpa integrasi dengan cloud provider agar mendapatkan external IP.

Saat pertama kali membuat service dengan type LoadBalancer tanpa metalLB, status dari externalIP menjadi <pending>. Namun Anda tetap bisa menambahkannya secara manual.

Sebelum memulai instalasi, pastikan network addon yang digunakan compatible. Cek network addon compatibility.

Preparation

Jika Anda menggunakan mode IPVS pada kube-proxy, sejak Kubernetes v1.14.2 Anda perlu mengaktifkan mode strict ARP.

kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

Installation By Manifest

Untuk men-deploy MetalLB.

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

Deploy MetalLB dengan mode FRR.

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

Configuration

Menentukan IP yang akan ditetapkan pada service load balancer.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.10/32

Jika ingin menetukan range IP.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.10-192.168.100.145

Untuk menentukan range IP dengan cidr.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.0/24
  autoAssign: true
  avoidBuggyIPs: true

avoidBuggyIPs digunakan agar IP yang ditetapkan pada service load balancer terhindar dari akhiran .0 dan .255 {: .prompt-tip }

Untuk menerapkan alamat IP pada namespace atau service tertentu.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.0/24
  avoidBuggyIPs: true
  serviceAllocation:
    priority: 50
    namespaces:
      - namespace-a
      - namespace-b

Atau bisa juga dengan mengedit annotation pada manifest service.

kubectl edit -n namespace-a service/nginx-svc
apiVersion: v1
kind: Service
metadata:
  annotations:
    metallb.universe.tf/address-pool: first-pool
    metallb.universe.tf/loadBalancerIPs: 192.168.100.100
...

Setelah selesai konfigurasi IPAddressPool, Buat resource L2Advertisement seperti berikut.

kubectl apply -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: first-dist
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
EOF

Test

Jalankan perintah berikut untuk membuat service load balancer. Bila perlu sesuaikan kembali baik app: dan ports: dengan deployment Anda.

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

Cek service.

# kubectl get -n site service
NAME        TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)        AGE
nginx-svc   LoadBalancer   10.11.62.131   192.168.100.100   80:32053/TCP   21h