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: None
Endpoints, 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: 80
Bu ö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: 80
Endpoints 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.