MetalLB Load Balancer for Bare Metal Kubernetes Cluster

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 !

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.