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.
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 ?
METALLBMetalLB is a load-balancer implementation for bare metal Kubernetes clusters, using standard routing protocols.
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 ?
METALLBKubernetes 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.
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 🙂