---
title: "Kubernetes Load Balancer with MetalLB - Rancher"
description: "Bu yazıda kubernetes cluster üzerinde metallb ile loadbalancer işlemi dökümante edilmiştir"
image: "https://sezer.in/wp-content/uploads/2022/01/metallb.png"
url: "https://sezer.in/kubernetes-load-balancer-with-metallb-rancher/"
date: "2022-01-19T21:16:03+03:00"
updated: "2022-08-12T22:49:47+03:00"
author: "Sezer Şanlıkan"
lang: "tr"
source: "https://sezer.in/kubernetes-load-balancer-with-metallb-rancher/"
---

# Kubernetes Load Balancer with MetalLB - Rancher

Daha önceki konumuzda tüm worker'lar üzerinde kaldırdığımız podların Kubernetes service - ingress tarafından hangi worker ip adresine istek giderse gitsin yük dengelediğini gördük.

Çok fazla Worker sunucumuz olabilir veya bunların ip adreslerini değiştirmek durumunda kalabiliriz. Bazı uygulamalar sadece tek bir ip adresi üzerinden request göndermek isteyebilir. DNS tarafında round-robin yapmayıp Kubernetes cluster içerisinde bunu yapmak isteyebiliriz gibi gibi... Bir çok sebep bu işlemi yapmak için bir neden olabilir.

İşte tam bu noktada biz [MetalLB](https://github.com/metallb/metallb) ile Load-Balancer'a atayacağımız ip adresini Pod'un label'ı ile eşleştirip ardından o ip adresine gelen isteği Worker'lara ilettirebiliriz.

Şimdi Rancher makinemizden kubectl yardımı ile işlemlere devam ediyoruz.

Öncelikle HELM paket yöneticisi kurulu değilse kuruyoruz.

https://sezer.in/ubuntu-uzerine-helm-kurulumu/

Bitnami reposunu ekliyoruz

```
helm repo add bitnami https://charts.bitnami.com/bitnami
```

Namespace oluşturuyoruz

```
kubectl create ns metal-lb
```

Helm ile MetalLB'yi kubernetes üzerine kuruyoruz.

```
helm install -n metal-lb metal-lb bitnami/metallb
```

Kurulum bittikten sonra aşağıdaki yaml dosyasını kubectl üzerinden kaldırıyoruz. MetalLB 4 versiyonundan sonra ip pool'u ayrı bir şekilde belirtiyoruz.

> IP adreslerini kendinize göre düzenlemeyi unutmayın.

```
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.10.0/24
  - 192.168.9.1-192.168.9.5
  - fc00:f853:0ccd:e799::/124
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2
  namespace: metal-lb
```

Yukarıdaki işlemlerden sonra uygulamamızı yayına vermek için nginx ingress controller kuruyoruz

```
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
```

Artık kaldırdığınız uygulamanın ingress'inde spec kısmını aşağıdaki gibi matchlemeniz gerekiyor

```
spec:
  ingressClassName: nginx
```

Eğer ikincil bir ağ kaldırmak isterseniz aşağıdaki yaml komutlarını baz alabilirsiniz

```
---
# https://kubernetes.github.io/ingress-nginx/user-guide/cli-arguments/
#
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ingress-rancher-controller
  namespace: "ingress-nginx"
  #labels:
spec:
  selector:
    matchLabels:
      name: nginx-ingress-rancher
  template:
    metadata:
      labels:
        name: nginx-ingress-rancher
    spec:
      terminationGracePeriodSeconds: 60
      serviceAccountName: ingress-nginx
      containers:
      - image: k8s.gcr.io/ingress-nginx/controller:v0.35.0
        name: nginx-ingress
        livenessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 3
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 3
          timeoutSeconds: 5
        lifecycle:
          preStop:
            exec:
              command:
                - /wait-shutdown
        securityContext:
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - ALL
          runAsUser: 101 # www-data
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        ports:
        - name: http
          containerPort: 80
          hostPort: 90
        - name: https
          containerPort: 443
          hostPort: 453
        - name: health
          containerPort: 10254
          hostPort: 10264
        args:
        - /nginx-ingress-controller
        #- --configmap=$(POD_NAMESPACE)/nginx-load-balancer-microk8s-conf
        #- --tcp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-tcp-microk8s-conf
        #- --udp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-udp-microk8s-conf
        - --ingress-class=rancher
        - --publish-status-address=127.0.0.1
```

Aşağıdaki 10.0.0.155 kısmı servisi bağlayacağınız ingress'in hangi ip adresi ile çalışacağını belirttiğiniz kısım.

```
---
apiVersion: v1
kind: Service
metadata:
  name: ingress-rancher
  namespace: "ingress-nginx"
spec:
  selector:
    name: nginx-ingress-rancher
  type: LoadBalancer
  # loadBalancerIP is optional. MetalLB will automatically allocate an IP
  # from its pool if not specified. You can also specify one manually.
  loadBalancerIP: 10.0.0.155
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
    - name: https
      protocol: TCP
      port: 443
      targetPort: 443
```

Bu ikincil yamlları kaldırdıktan sonra kaldırdığınız podun ingressi için matchlemeniz gereken değer aşağıdaki gibi olacaktır

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  ingressClassName: nginx
  ...
```
