Yeni Başlayanlar için Kubernetes Kavramları : Service

Bir önceki makalemde ile ilk adımı attığımız Kubernetes kavramlarında sizlere pod’lardan bahsetmiştim. Pod’lar için aklınızda tutmanız gereken ilk şeylerden birisi de fani olduklarıdır. Herhangi bir problem kaynaklı olarak ya da kaynak kısıtlarından dolayı her an tahliye edilebilirler. Pod’lar tahliyeleri adından yeniden ayağa kalktıklarında ise farklı bir ip adresi ve hostname atanacaktır. Bu durumda aklınıza pod’lara Cluster dışından stabil olarak nasıl erişebileceğiniz sorusu gelecektir. İşte tam bu noktada sahneye Service kavramı çıkmakta.

Kubernetes Service kavramı pod’ların faniliği karşısında konumlandırılmıştır. Servisler bir ya da daha fazla port’un bir ya da bir grup pod’a yönlendirilmesinden sorumlu bileşenlerdir. Açılan servis portlarına sadece cluster içerisinden erişelebileceği gibi aynı zamanda node üzerinden ya da load balancer üzerinden de erişim sunulabilir. Bu özellikleri sayesinden servisler podların erişim açısından grupladıkları gibi dışarıya açılabilmelerini de sağlamaktadırlar.

Pod’larla kıyaslandıklarında oldukça ucuz kaynak olan servislerden Kubernetes Cluster’ınızda istediğiniz kadar oluşturabilmeniz mümkündür.  Pod’ların faniliğinin aksine, sabit bir ip adresine sahip olan servisler aksi istenmediği sürece kalıcıdırlar. Sahip oldukları yük dengeleme, servis bulunurluğu, sabitlik ve zero down-time özellikleri sayesinde Kubernetes mimarinin önemli taşlarından birisidir. Arkaplanda verilen etiketlere sahip pod’lara erişimi soyutlaşarak hayat herkes için daha yaşanabilir hale gelmektedir Smile

Kubernetes-Service

Bir Kubernetes Servisi ClusterIP, NodePort, LoadBalacer ve ExternalName olmak üzere 4 farklı tür olabilir. Seçilen servis türü aynı zamanda servisin erişim ve davranışını da belirlemektedir. Bu türleri ve servis davranışlarını aşağıda bulabilirsiniz;

ClusterIP

ClusterIP türü ile tanımlanan bir Kubernetes Service’i cluster dışından erişilebilir değildir. ClusterIP türü için servise sanal bir cluster ip adresi oluşturularak atanır. Erişimler atanan bu ip adresi üzerinden gerçekleştirilir.

ClusterIp

NodePort

NodePort türü ile tanımlanan bir Kubernetes Service’i cluster dışından da erişilebilir olacaktır. Tanımlama sırasında verilen NodePort değeri ile her bir Cluster Node’u üzerinde port açılarak servise yönlendirilir. Bu haliyle, aksi belirtilmediği sürece, herhangi bir node üzerinden servise erişilebilir.

NodePort

Yukarıda yer alan şema için aşağıdaki yaml dosyası kullanılabilir;

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: enterprisecoding-app
  ports:
  - port: 80
    targetPort: 80
	nodePort: 30006

Yukarıda sıralanan port, nodePort ve targetPort değerlerinden sadece port değeri zorunludur. targetPort değeri belirtilmemiş ise port ile aynı değere sahip olduğu varsayılmaktadır. nodePort değeri belirtilmemiş ise varsayılan olarak 30000-32767 aralığındaki boş bir değer otomatik olarak atanacaktır.

Kubernetes 1.5 itibari ile NodePort olarak tanımlanan Servislerde varsayılan olarak Source NAT uygulamaktadır. Yani talebin yapıldığı node’dan farklı bir node’da yer alan pod’a yönlendirilen hedef paket içerisindeki istemci ip’si talebin yapıldığı node ip’si ile değiştirilmektedir. Bu durumda hedef pod içerisindeki uygulama gerçek istemci ip adresini göremeyecektir.

LoadBalancer

LoadBalancer türü ile tanımlanan bir Kubernetes Service’i aynı NodePort türünde olduğu gibi dışarıdan erişilebilir olacaktır. NodePort’tan farklı olarak LoadBalancer türünde Kubernetes Node’larının önünde önceden konumlanmış yük dengeleyiciler bulunmaktadır. Dışarıdan load balancer’a gelen trafik arkaplandaki pod’lara yönledirilecektir. LoadBalancer türü daha çok bulut tabanlı hizmet sağlayıcılarında görülmekle birlikte MetalLB gibi çözümler sayesinde on-premise sistemlerde de kullanılabilmektedir.

ExternalName

ExternalName türü ile tanımlanan bir Kubernetes Service’i önceki türlerde olduğu gibi selector kullanmak yerine DNS adını kullanacaktır. Bu türde, önceki türlerde olan proxy ya da forward işlemleri kullanılmamaktadır. Yönlendirme işlemi DNS seviyesinde gerçekleşmektedir. Konuyu daha net anlamak için aşağıdaki örneği inceleyelim;

apiVersion: v1
kind: Service
metadata:
  name: test-service
  namespace: prod
spec:
  type: ExternalName
  externalName: database.enterprisecoding.com

Örnekteki service test-service.prod.svc.cluster.local adresi üzerinden yapılan isteklerde DNS servisi CNAME düzeyinde yer alan database.enterprisecoding.com değerini dönecektir. Bu yanıtı alan istemciler taleplerini bu adrese yapacaklardır.

Fatih Boy

Ankara'da yaşayan Fatih, kendi şirketinde özellikle bankacılık, sigortacılık ve otomotiv sektörlerinde IT danışmanlıkları vermektedir. Devops, ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

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