Kubernetes Endpoints Nedir?
Kubernetes Endpoints, bir Service'in selector içinde belirtilen label'a sahip tüm Pod'lara veya manual yapılandırılan adreslere yönlendirme yapmak için kullanılan bir Kubernetes nesnesidir.
Bir Service'in bir Pod'a yönlendirme yapabilmesi için, ilgili Pod'un bir Endpoint olarak belirtilmesi gerekir. Endpoints nesnesi, Service tarafından hedeflenen Pod'lara yönlendirme yapmak için kullanılan IP adresleri ve port numaralarını içerir.
1. Endpoints Nesnesinin Otomatik Oluşturulması
Bir önceki Service yazımızda, bir Service'in doğrudan Pod'lara bağlantı vermediğini, kendi kontrol ettiği Endpoints nesnesinden ilgili Pod IP ve port listesini alıp kullandığını söylemiştik.
Bir Service oluşturduğunuzda, aynı isimli Endpoints nesnesi de otomatik olarak oluşturulur. Ardından Endpoints nesnesi, Service manifestinde belirttiğiniz selector ile eşleşen tüm Pod'ları bularak listesine ekler.
Örneğin my-service isimli bir Service oluşturursanız, my-service isimli bir Endpoints de oluşturulur. Service detaylarına baktığınızda ise Endpoints nesnesinin oluşturduğu IP adresi ve port listesini görebilirsiniz.
$ kubectl describe service my-service
Name: my-service
Namespace: default
Labels: <none>
Selector: app=my-app
Type: ClusterIP
IP: 10.111.249.153
Port: <unset> 80/TCP
Endpoints: 10.244.2.118:80,10.244.2.122:80,10.244.2.123:80
Session Affinity: NoneEndpoints, bir Kubernetes nesnesi olduğu için de kubectl get endpoints ile görüntülenebilir ve kubectl describe endpoints komutu ile detaylarına bakabilirsiniz.
$ kubectl get endpoints
NAME ENDPOINTS AGE
my-service 10.244.2.118:80,10.244.2.122:80,10.244.2.123:80 50s$ kubectl describe endpoints my-service
Name: my-service
Namespace: default
Labels: <none>
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2023-05-10T13:13:19Z
Subsets:
Addresses: 10.244.2.118,10.244.2.122,10.244.2.123
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
<unset> 80 TCP
Events: <none>selector, Service ile birlikte otomatik oluşturulan Endpoint nesnesinin IP adres ve port listesini oluşturulurken kullanılır. Service için bir etkisi yoktur.2. Endpoints Nesnesinin Manual Oluşturulması
Muhtemelen bunu yukarıdaki başlıkta fark etmiş olabilirsiniz, ancak Service nesnesinin trafiği yönlendireceği hedeflerin Ednpoints nesnesi ile Service'den bağımsızlaşması, bunların manuel olarak yapılandırılmasına ve güncellenmesine olanak tanır.
Pod selector olmadan bir Service oluşturursanız, Kubernetes, Endpoints nesnesini oluşturamaz çünkü bir selector olmadan hangi Pod'ların Service'e dahil edileceğini bilemez. Böyle bir durumda Service için yönlendirme hedeflerinin listesini belirtecek Endpoints nesnesini oluşturmakta size kalır.
Manual yönetilen hedeflere sahip bir Service oluşturmak için hem Service hem de Endpoints nesnelerini ayrı ayrı oluşturmanız gerekir.
2.1. Service Nesnesinin Oluşturulması
Bir önceki Service konusunu anlattığımız yazıda göreceğiniz üzere, Service'leri oluştururken bir selector seçiyorduk. Şimdi ise herhangi bir selector seçmeden Service nesnemizi oluşturacağız.
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
ports:
- port: 80Bu örnekte 80 portuna gelen bağlantıları kabul edecek external-service adlı bir Service tanımlıyoruz. Service için herhangi bir Pod selector tanımlamadık.
Service konusunda daha fazla detay almak için aşağıdaki bağlantıda yer alan yazımızı okuyabilirsiniz.
2.2. Endpoints Nesnesinin Oluşturulması
Bir Service nesnesini selector olmadan oluşturduktan sonra Endpoints nesnesini oluşturmak için aşağıdaki YAML manifestini kullanacağınız.
apiVersion: v1
kind: Endpoints
metadata:
name: external-service
subsets:
- addresses:
- ip: 11.11.11.11
- ip: 22.22.22.22
ports:
- port: 80Endpoints nesnesinin Service ile aynı ada sahip olması ve Service için hedef IP adresleri ve portların listesini içermesi gerekir. Üstelik bu adresler Kubernetes cluster dışındaki hedeflere ait olabilir. Ardından Service, kendisine gelen istekleri bu listede yer alan IP adres ve portlarına yönlendirecektir.

Eğer daha sonra harici adresleri Kubernetes içinde çalışan Pod'lara taşımaya karar verirseniz, Service'e bir selector ekleyebilir, böylece hedef adreslerin otomatik olarak yönetilmesini sağlayabilirsiniz.
Sıradaki yazı ile eğitim serisine devam edebilirsiniz.
