MetalLB merupakan load balancer yang dapat diimplementasikan pada kluster kubernetes on-premises atau bare-metal. Namun MetalLB masih dalam tahap development (beta), jadi untuk pemakaian production sangat tidak disarankan.
Seperti yang kita tahu, hingga saat artikel ini ditulis Kubernetes tidak menawarkan implementasi network load balancer untuk bare-metal kubernetes kluster. Implementasi network load balancer yang tersedia saat ini hanya berbasis cloud yang ditawarkan dari berbagai platfrom IaaS (GCP, AWS, Azure, dll).
MetalLB bertujuan untuk mengatasi ketidakseimbangan ini dengan menawarkan implementasi network load balancer yang terintegrasi dengan peralatan jaringan standar, sehingga layanan eksternal pada klaster bare metal juga “berfungsi” semaksimal mungkin.
Pada skema kali ini, saya akan menggabungkan implementasi MetalLB dengan Nginx Ingress Controller. Nginx Ingress Controller disini akan bertugas untuk perutean lalu lintas aplikasi Kubernetes (Pods) dan menyediakan jembatan antara layanan Kubernetes dan layanan eksternal.
Deploy MetalLB as internal load balancer
Jika Anda menggunakan kube-proxy dalam mode IPVS, sejak Kubernetes v1.14.2 Anda harus mengaktifkan mode strictARP.
Login ke mesin yang sudah terinstall kubectl, jalankan perintah berikut untuk mengedit konfigurasi kube-proxy:
kubectl edit configmap -n kube-system kube-proxy
Ubah false menjadi true pada baris strictARP
Untuk menginstal MetalLB, apply manifest berikut:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml
Manifest diatas akan melakukan membuat pods controller dan speaker di namespace metallb-system.
- Controller, berfungsi sebagai pengontrol seluruh cluster yang menangani penetapan alamat ip.
- Speaker, berfungsi sebagai komponen yang berbicara sesuai dengan protokol pilihan Anda untuk membuat layanan dapat dijangkau.
Jalankan perintah berikut, untuk memastikan pods, dan lainnya berjalan dengan normal.
kubectl get all -n metallb-system
Berikut nya kita perlu mengkonfigurasi MetalLB menggunakan configmap, kita akan menggunakan konfigurasi Layer 2 untuk artikel ini. Buat file baru dengan nama metallb-config.yaml, setelah itu salin konfigurasi dibawah ke dalam file tersebut.
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 10.102.0.60-10.102.0.100
Pada baris addresses: sesuaikan dengan alamat ip yang sudah anda alokasikan.
Apply manifest yaml tersebut.
kubectl apply -f metallb-config.yaml
Anda dapat memeriksa konfigurasi dengan menjalankan perintah berikut:
kubectl describe configmaps -n metallb-system
Nginx Ingress Controller
Login ke mesin yang sudah terinstall helm, jalankan perintah berikut untuk menambahkan repository ingress nginx versi stabil.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
Apabila kubernetes kluster anda memakai CNI, perlu ada penyesuaian konfigurasi pada manifest yaml. Simpan manifest yaml ke local mesin, disini saya akan menyimpan di direktori C:\ dengan nama ingress-nginx,yaml.
helm show values ingress-nginx/ingress-nginx > C:\ingress-nginx.yaml
Berikut adalah yang harus di ubah :
- hostNetwork: false menjadi true.
- hostPort: false menjadi true.
- kind: Deployment menjadi DaemonSet.
Selanjutnya create namespace untuk menyimpan resources nginx ingress controller.
kubectl create namespace ingress-nginx
Jalankan perintah berikut untuk menerapkan manifest yaml yang sudah di sesuaikan sebelumnya.
helm install ingress01 ingress-nginx/ingress-nginx -n ingress-nginx --values C:\ingress-nginx.yaml
Apabila sudah selesai, pastikan status dari semua resource nginx ingress controller berjalan dengan normal.
kubectl get all -n ingress-nginx
Create Pods
Disini saya akan membuat 2 pods, 2 ingress dengan aplikasi nginx dan httpd.
Berikut adalah manifest yamlnya, buat file baru dengan nama deployment.yaml :
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx-qa
spec:
replicas: 1
selector:
matchLabels:
run: nginx-qa
template:
metadata:
labels:
run: nginx-qa
spec:
containers:
- image: nginx
name: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-qa
spec:
type: ClusterIP
ports:
- port: 8022
targetPort: 80
selector:
run: nginx-qa
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: httpd
name: httpd-qa
spec:
replicas: 1
selector:
matchLabels:
run: httpd-qa
template:
metadata:
labels:
run: httpd-qa
spec:
containers:
- image: httpd
name: httpd
---
apiVersion: v1
kind: Service
metadata:
name: httpd-qa
spec:
type: ClusterIP
ports:
- port: 8023
targetPort: 80
selector:
run: httpd-qa
Selanjutnya membuat manifest yaml untuk ingress dengan nama file ingress-qa.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: ingress-service-qa
spec:
rules:
-
host: httpd.thelazy.engineer
http:
paths:
-
backend:
service:
name: httpd-qa
port:
number: 80
path: /
pathType: Prefix
-
host: nginx.thelazy.engineer
http:
paths:
-
backend:
service:
name: nginx-qa
port:
number: 80
path: /
pathType: Prefix
Apply manifest yaml deployment.yaml.
kubectl apply -f deployment.yaml
kubectl get all
Pastikan pods, dan service sudah berjalan dengan normal.
Apply manifest yaml untuk ingress-qa.yaml.
kubectl apply -f ingress-qa.yaml
kubectl get ingress
Apabila sudah selesai, jalankan perintah berikut untuk memverifikasi bahwa hostname dengan backend sudah sesuai.
kubectl describe ingress ingress-service-qa
Pada titik ini, apabila aplikasi sudah berjalan dengan normal seperti diatas. Anda telah berhasil mengonfigurasi penyeimbang beban internal dengan nginx ingress controller.
Cheers !