OpenShift 4.18 MetalLB ile LoadBalancer Servisi
- Giriş
OpenShift, bilindiği üzere, Kubernetes tabanlı güçlü bir container orkestrasyon platformudur. Modern mikroservis uygulamaları genellikle dış dünyaya servis sunmak zorundadır. Özellikle bare-metal veya özel ağ topolojisine (platform agnostic vb) sahip ortamlarda, bu tür servislerin arkasında fiziksel bir load balancer bulunmadığından “LoadBalancer” tipi servisler doğal olarak çalışmaz. MetalLB Operatörü, bu açığı kapatarak, kurumların OpenShift ortamlarına dışarıdan erişim ihtiyaçlarını kolayca çözmesini sağlar.
Bu yazıda, OpenShift 4.18 sürümü üzerinde MetalLB Operatörü’nün ne işe yaradığını, nasıl kurulduğunu ve işletim sürecine katkılarını ele alıyoruz.
OpenShift bu durumda genellikle Route veya Ingress Controller’ı önerir. Ancak bazı senaryolarda (örneğin; route veya ingress kullanılmadığı durumlar, farklı DNS ve IP üzerinden erişim ihtiyacı, NodePort servisin uygun olmadığı durumlar, Openshift’te çalışan ftp benzeri özel uygulamalara güvenlik sebebiyle farklı yöntemlerle erişim vb.) doğrudan LoadBalancer tipi hizmete ihtiyaç duyulur.
İşte tam bu noktada MetalLB Operatörü, OpenShift’in kabiliyetlerini tamamlar.
- MetalLB Nedir ve Neden Önemli?
MetalLB, standart yönlendirme protokollerini kullanan bare metal Kubernetes kümeleri için bir Load Balancer uygulamasıdır. Amacı, Kubernetes ve OpenShift ortamlarına “network düzeyinde LoadBalancer işlevi” kazandırmaktır.
Kubernetes, bare metal cluster’lar için bir load balancer uygulaması sunmaz. Bare-metal cluster veya benzer bir altyapınız olduğunda ve harici bir IP adresi aracılığıyla bir uygulamaya erişim istediğinizde MetalLB'yi kullanmak değerlidir.
Kubernetes'in sunduğu Network Load Balancer uygulamalarının tamamı, çeşitli IaaS platformlarını (GCP, AWS, Azure…) çağıran birleştirici koddur. Desteklenen bir IaaS platformunda (GCP, AWS, Azure…) çalışmıyorsanız, ilgili servisler oluşturulduklarında süresiz olarak "Pending" durumunda kalır.
Bare metal cluster operatörleri, kullanıcı trafiğini cluster’a getirmek için iki yetersiz araçla baş başa kalır: "NodePort" ve "externalIPs" servisleri. Bu seçeneklerin her ikisinin de production ortamlarında kullanımı için önemli dezavantajları vardır.
MetalLB, standart network ekipmanlarıyla entegre olan bir Network Load Balancer uygulaması sunarak bu dengesizliği gidermeyi amaçlamaktadır; böylece bare metal cluster’lardaki harici servisler de mümkün olduğunca çalışır durumda olacaktır.
- MetalLB Custom Resource ve Bileşenler
MetalLB operatörü, aşağıdaki custom resource'lar için kendi namespace'ini monitor eder. Bu crd ler:
- MetalLB: MetalLB crd si eklendiğinde operatör, bir MetalLB deploy eder (deployment).
- IPAddressPool: MetalLB, bir veya daha fazla IP address pool'a ihtiyaç duyar. Bu pool'dan IP'leri servislere assign eder.
- BGPPeer: BGP router'ı tanımlar. Bu sayede MetalLB AS router, AS metallb ve route advertisement ile iletişim kurar.
- BFDProfile: Bgppeer için Bidirectional Forwarding Detection (BFD) 'yi yapılandırır.
- L2Advertisement: L2 protocolü kullanarak "IPAddressPool" dan gelen bir IP'yi tanımlar.
- BGPAdvertisement: BGP protocolü kullanarak "IPAddressPool" dan gelen bir IP'yi tanımlar.
MetalLB crd tanımı cluster'a eklendikten sonra operatör; "MetalLB" deploy eder ve "controller" deployment’ı ile "speaker" daemonset’i çalışmaya başlar.
- controller: Controller, "LoadBalancer" tipinde bir servis oluşturulduğunda, bir pool'dan bir IP adresi ayırır ve bu servise tahsis edilmesini sağlar.
- speaker: Controller’ın, bir servise IP ayırıp tahsis etmesine yardımcı olur. LoadBalancer IP adresinin hangi node üzerinde olacağının belirlenmesi için L2 protokolünde speaker podu bir algoritma kullanır. BGP protokolü için de durum benzerdir, controller servis için IP ayırdığında speaker podu bu LB Ip sini ilgili BGP peer'lara duyurur. Loadbalancer'ın IP'sine gelen requestler, IP adresini anons eden speaker podunun bulunduğu node'a, daha sonra da ilgili servis için endpoint’e yönlendirilir.
.jpg)
- Operatör Kurulumu
MetalLB Operatörünün kurulumu için, Openshift Web arayüzüne bağlanıp Operator Hub’tan faydalanabiliriz. Arama bölümüne “metallb” yazarak operatörü bulup üzerine tıklıyoruz:
.png)
Gelen ekranda stable channel ve versiyonu seçip “Install” düğmesine basıyoruz:
.png)
Sonra “Installation mode: All namespaces (default)” ve “Installed Namespace: metallb-system” seçiyoruz. “Update approval” ’ı ise kurumumuzun çalışma prensiplerine göre belirleyip “install” ile kurulumu başlatıyoruz:
.png)
.png)
.png)
Operatör kurulumu tamamlanınca “All Instance” veya “MetalLB” sekmesinden bir “MetalLB” nesnesini seçip “create”’e basarak oluşturuyoruz:
.png)
.png)
Ardından “metallb-system” namespace’indeki daemonset ve deployment pod’larının oluşmasını bekliyoruz.
.png)
Tüm ilgili pod’lar çalışır duruma geçtikten sonra operatör artık hazır demektir:
.png)
- Uygulama Örneği: Basit Web Server
MetalLB hizmetinden nasıl faydalanacağımızı örneklendirmek için; “test-project” projesi içerisinde basit bir apache web server deploy ediyoruz. Daha sonra servis olarak Load Balancer kullanmasını sağlayacağız.
Container imajı olarak “registry.access.redhat.com/ubi9/httpd-24:latest” imajı kullanılabilir..:
.png)
Oluşturduğumuz servis şimdilik ClusterIP türünde:
.png)
- IP AddressPool Tanımı
Operatör kurulduktan ve MetalLB instance oluştuktan sonra, hangi IP aralıklarının LoadBalancer servislerinde kullanılacağını tanımlamamız gerekir. IPAddressPool nesnesini yine operatör içerisindeki “IPAddressPool” oluşturarak yaml veya form view’den yapabiliriz:
.png)
Yukarıda web arayüzünden; oluşturulan IPAddressPool nesnesini, yaml dosyası ile de oluşturabiliriz. Yaml’da belirtildiği üzere, 192.168.1.55 – 192.168.1.60 IP aralığından “test-project” projesindeki servislere IP assign edilebilecektir.
IPAddressPool yaml örneği aşağıdaki gibi olabilir:
.png)
- L2Advertisement Yapılandırması
L2 protokolü kullanarak "IPAddressPool" dan gelen bir IP'yi tanımlayan L2Advertisement nesnesini yine Openshift Web arayüzünde MetalLB operatörü içerisinden “L2Advertisement” bölümünden oluşturabiliriz. Burada IPAddressPool adı olarak önceki bölümde oluşturulan IPAddressPool adını yazabiliriz:
.png)
Aşağıda ise yaml örneği yer almaktadır:
.png)
Bu yapılandırmalardan sonra “test-project” projesinde yer alan LoadBalancer türündeki servisler belirtilen IP aralığından IP alabilecektir.
- Web Uygulaması – Load Balancer Service Yapılandırması
Yukarıdaki bölümde, basit bir web server deploy etmiştik ve bu uygulamaya ait servis ise ClusterIP türünde idi. Şimdi bu servisin MetalLB’den IP alabilmesi için servis türünü “LoadBalancer” olarak değiştirelim.
Openshift web arayüzünden “Networking – Services” bölümüne gelip “Project: test-project” seçiyoruz ve servis’i editlemek için tıklıyoruz:
.png)
“Yaml” ekranından servisin “type” alanını ClusterIP yerine “LoadBalancer” olarak değiştirip dosyayı kaydediyoruz.
.png)
.png)
Servise tekrar baktığımızda “ClusterIP” adresi yerine “LoadBalancer” türüne geçtiği ve MetalLB tarafından bizim belirlediğimiz bir IP’nin assign edildiğini görebiliriz.
.png)
Artık bu IP (bu örnekte 192.168.1.55) kullanılarak bir DNS A Record oluşturulduğunda bu web uygulamasına dışarıdan erişilebilecektir, örneğin; http://web1.test.local gibi:
.png)
- Linkler
https://operatorhub.io/operator/metallb-operator
https://github.com/openshift/metallb-operator
Alpay Polat - Kasım 2025
