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