Kubernetes Servisleri Pending Hatası Nasıl Çözülür ? MetalLB

Merhabalar, bu yazımda sizlere kendiniz kubernetes kurduğunuzda karşılaşabileceğiniz muhtemel sorunlardan bir tanesi olan Pending issue (bekleme hatasını) anlatacağım. Kubernetes kendiniz kurup yönetiyorsanız ve büyük bir projeye sahipseniz bu hata ile karşılaşmış olmalısınız.

Kubernetes Nasıl kurulur Öğrenmek icin yazımı okuyabilirsiniz.

Stackoverflow linki

Yukarıdaki resim Stackoverflow’dan pending issue ile ilgili bir sorudan alınmıştır. Cevaplara bakıldığında bizim durumumuz içinse yarar bir şey görmek çok mümkün değil 🙂

Pending İssue Niye Karşımıza Çıkıyor ?

Development ortamı için 3 node’umuz olduğunu düşünelim. Projemizde 1 backend, 1 frontend, 2 adette veritabanına sahip olduğumuzu düşünelim. Bu yapılara dışarıdan erişmek istediğimizi ve her biri için loadbalancer servisi yazdığımızı düşünelim. 3 node’umuz olduğundan, 3 servisin başarılı bir şekilde dışarıya açıldığını göreceğiz. 4. servisi incelediğimizde pending issue ile karşılaştığını göreceğiz. Bunun sebebi yeterli node’umuzun olmaması ve kubernetes’in direkt bir loadbalancer çözümü sunmamasından dolayı.

Eğer benim uygulamalarım farklı portlar kullanıyor diye bir soru kafanıza takıldıysa, kubernetes’in sizin uygulamalarınızın hangi portları kullandığına bakmıyor. Sadece elinde olan makinelere LoadBalancer servislerini dağıtıyor. LoadBalancer yerine NodePort kullanırsanız tüm her şey çözülmüş olacak fakat production ve bazı durumlar için NodePort önerilmez. Çözüm olarak tüm uygulama servislerinin makineler arasında dağıtılması ve tek bir makinede farklı portlarda birden fazla servis ayağa kalkabilmesi sağlanacaktır.

Pending İssue Çözümü Nedir ?

Benim biraz yardım alarak ve bir kaç saat (belki de bir gün :)) araştırmam sonucu bulduğum çözüm -> METALLB

Servis Sağlayıcıların LoadBalancer Çözümleri Var Mı ?

Evet. Her servis sağlayıcı kendi LoadBalancer Çözümüne sahip.(AWS, Google,…)

METALLB Nedir ?

MetalLB is a load-balancer implementation for bare metal Kubernetes clusters, using standard routing protocols.
METALLB

Sitelerinde yazan cümleyi açıklayacak olursak:

METALLB, Kubernetes için LoadBalancer çözümüdür, standart yönlendirme protokollerini kullanır.

Neden METALLB Kullanmalıyız ?

Kubernetes does not offer an implementation of network load balancers (Services of type LoadBalancer) for bare-metal clusters. The implementations of network load balancers that Kubernetes does ship with are all glue code that calls out to various IaaS platforms (GCP, AWS, Azure…). If you’re not running on a supported IaaS platform (GCP, AWS, Azure…), LoadBalancers will remain in the “pending” state indefinitely when created.
METALLB

Sitede yazan açıklamanın bir kısmını açıklayacak olursak:

Kubernetes’in LoadBalancer çözümüne sahip olmadığını ve eğer Aws, Azure vb.) sistemler kullanmıyorsanız Loadbalancer servislerinizin pending’de kalacağından bahsediyor.

METALLB Kurulum ve Pending İssue Çözümü

MetalLB’yi Helm ile yüklemeden bahsedeceğim diğer seçenekler ve daha fazlası için sitelerini ziyaret edebilirsiniz.

# metallb helm reposu ekleme 
helm repo add metallb https://metallb.github.io/metallb

Kurulum aşmasına geçmeden önce MetalLB’nin kullanacağı ayarları içeren values yaml dosyamızı düzenlemeliyiz.

configInline:
  address-pools:
   - name: default
     protocol: layer2
     addresses:
     - 198.51.100.0/24  # node ip
     - 198.51.100.0/24  # node ip

Addresses, kısmında olan IP’leri kendi node IP’lerinizle değiştirmeniz gerekiyor. İstediğiniz node’ları ekleyebilirsiniz. MetalLB Bu ipleri kullanarak sizin uygulamalarınızı dışarıya açacak.

helm install metallb metallb/metallb -f values.yaml

Yukarıdaki komutu koştuğumuzda MetalLB istediğimiz ayarlar ile yüklenmiş olacak peki bitti mi ?

tabi ki hayır bizim hangi servislerin birlikte ayağa kalkabileceğini belirtmemiz lazım.

MetalLB Kullanımı ?

metallb.universe.tf/allow-shared-ip: paylas  # istediğiniz herhangi bir kelime

Yukarıda bulunan annotation’ı servislerinizin annotation kısmına eklediğinizde, eklediğiniz servisler birlikte aynı makine üzerinden ayağa kalkacaktır. Kelimenizi değiştirerek başka servislerin birlikte ayağa kalkmasını sağlayabilirsiniz.

apiVersion: v1
kind: Service
metadata:
  name: ornek
  annotations:
    metallb.universe.tf/allow-shared-ip: paylas
spec:
  selector:
    ...

Bu yazımda Kubernetes Servislerinde ortaya çıkan pending İssue çözümünü anlattım.

Diğer yazılarda görüşmek üzere 🙂

Add a Comment

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir