Kubernetes Label Nedir?

Kubernetes label, bir Kubernetes nesnesine (pod, replica set veya service gibi) tanımlamalar eklemek için kullanılan bir etiketleme mekanizmasıdır. Bir label, nesneleri tanımlayan bir key-value çiftidir. Bu labellar, nesneleri gruplamak, belirli özelliklere göre sıralamak ve diğer nesnelerle ilişkilendirmek için kullanılabilir.

Örneğin, microservice mimarisi kullandığınız bir uygulamanızda onlarca microservice ve bu microservicelere ait birçok farklı versiyon ve release (beta, canary, stable vs) eş zamanlı çalışıyor olabilir. Bu da yüzlerce pod'un mevcut olduğu büyük bir cluster ortamını yönetmeniz anlamına gelir.

Böyle büyük bir cluster'da nesnelerinizi yönetebilmek için belirli gruplamalar oluşturmalı ve nesnelerinizi ilgili gruplara dağıtarak micro management uygulamalısınız. Bu gruplara ayırma ve filtreler oluşturma kısmında ise size yardımcı olacak Kubernetes özelliği label'lardır.

Kubernetes label'lar basit ve bir o kadar da güçlü bir özelliktir. Tüm Kubernetes nesnelerini dilediğiniz key:value çiftleriyle sınıflandırabilir ve ayırabilirsiniz. Üstelik bir nesneye birden fazla label ekleyip sonradan düzenleyebilirsiniz.

İlk resimdeki örneğe dönersek, bu pod'ları daha yönetilebilir bir hale getirmek için herbirine app ve rel label'ları ekleyeceğiz.

  • app, Pod'un hangi uygulamaya, bileşene veya microservice'e ait olduğunu belirtecek.
  • rel, çalışan uygulamanın hangi release'e (beta, canary, stable vs) sahip olduğunu belirtecek.

Tüm pod'lara bu iki label'ı ekledikten sonra son görüntümüz şu şekilde olmuş olacak:

Artık Kubernetes cluster'ınız daha anlaşılır ve yönetilebilir bir hale geldi. İşte Kubernetes label'lar bu kadar önemli ve güçlü bir özelliktir.

1. Label Nasıl Oluşturulur?

Tüm Kubernetes objeleri gibi label'ları da iki yöntemle oluşturabiliriz:

  1. Bir JSON veya YAML manifest dosyası içerisinde labels parametresi ile tanımlayarak.
  2. kubectl aracını kullanarak CLI üzerinden komutlarla kullanarak.

1.1. Manifest Dosyası İçinde Label Tanımlamak

Kubernetes nesnelerini oluştururken kullandığımız JSON veya YAML dosyalarında labels parametresini kullanarak o nesneye ait label'ları tanımlayabiliriz.

Örneğin aşağıdaki örnekte bir pod oluştururken nasıl label'lar eklediğimizi görebilirsiniz.

apiVersion: v1
kind: Pod
metadata:
 name: pod-with-labels
 labels:
  creation_method: manual
  env: prod
spec:
 containers:
 - image: nginx
   name: fe

Artık oluşturacağımız bu pod creation_method ve env isimli iki label'a sahip olacak.

1.2. CLI Aracılığıyla Label Tanımlamak

kubectl kullanarak yeni bir pod oluştururken --labels veya -l parametresini kullanarak etiketler ekleyebilirsiniz. Örneğin, aşağıdaki komutla bir pod oluşturabilirsiniz ve pod'a app=nginx ve env=prod etiketlerini ekleyebilirsiniz:

kubectl run my-nginx --image=nginx --labels=app=nginx,env=prod

Mevcut bir pod'a label eklemek için ise kubectl label komutunu kullanabilirsiniz. Örneğin aşağıdaki komut mevcut bir pod'a env=test label'ını ekler.

 kubectl label pod fe env=test

2. Label Nasıl Güncellenir?

Bir Kubernetes nesnesinin label'larını güncellemek için kubectl label komutunu --overwrite parametresi ile birlikte kullanabilirsiniz.

Örneğin, bir pod'un label'ını değiştirmek için aşağıdaki komutu kullanabilirsiniz:

kubectl label pod fe env=performance --overwrite

Diğer bir yöntem ise manifest dosyanızda düzenlemenizi yaparak kubectl apply -f file komutunu çalıştırmaktır.

3. Label Nasıl Silinir?

Bir Kubernetes nesnesinden label silmek için, kubectl label komutunda silmek istediğiniz label key'inin sonuna - koyarak  ilgili label'ı silebilirsiniz.

Örneğin, bir pod'dan env ve type adlı label'ları kaldırmak istediğinizi varsayalım. Aşağıdaki komutu kullanarak bu etiketleri kaldırabilirsiniz:

kubectl label pod fe env- type-

4. Kubernetes Nesnelerini Label Kullanarak Listelemek

Kubernetes nesnelerine label'lar ekledikten sonra artık onları ilgili label'ları kullanarak arayabilir, filtreleyebilir ve listeyebilirsiniz.

Kubernetes nesnelerinin hangi label'larını içerdiğini görmek için --show-labels parametresini kullanabilirsiniz. Örneğin podları label'ları ile birlikte listeleyelim.

$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
fe 1/1 Running 0 16m <none>
be 1/1 Running 0 2m creat_method=manual,env=prod
db 1/1 Running 0 1d type=postgresql

Tüm label'ları listelemek yerine belirli label'ları sütun halinde görmek istiyorsak -L parametresi kullanabiliriz.

$ kubectl get pod -L creation_method,env
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
fe 1/1 Running 0 16m <none> <none>
be 1/1 Running 0 2m manual prod
db 1/1 Running 0 1d <none> <none>

Label'lar aracılığıyla daha detaylı listeleme yapabilmek için dört farklı filtreleme yöntemimiz bulunuyor. Bunlar:

  • Kubernetes nesnesinin bir label key'i içerip içermemesine göre
  • Kubernetes nesnesinin bir label key-value çiftini içerip içermemesine göre
  • Kubernetes nesnesinin bir label key'i içerip, value'sunun eşit olmamasına göre
  • Kubernetes nesnesinin bir label key'i içerip, value'sunun verilen değerlerden biri olup olmamasına göre

Şimdi bu dört filtreleme seçeneğine de örneklerle bakalım.

İlk olarak bir label key'i içeren nesneleri listelemek için -l parametresiyle birlikte direkt label key'ini aramalısınız:

$ kubectl get pod -l env
NAME READY STATUS RESTARTS AGE
be 1/1 Running 0 37m

Label key-value çiftiyle eşleşen nesneleri aramak içinse -l parametresiyle birlikte label key=value araması yapmalısınız:

$ kubectl get pod -l creation_method=manual
NAME READY STATUS RESTARTS AGE
fe 1/1 Running 0 16m

Belirtilen key'e sahip olmayan nesneleri aramak içinse -l parametresiyle birlikte label key'i ararken ! işareti kullanmalısınız:

$ kubectl get pod -l !env
NAME READY STATUS RESTARTS AGE
fe 1/1 Running 0 37m
db 1/1 Running 0 6m
💡
Bash shell kullanıyorsanız '!env' şeklinde tek tırnak ' işareti ile kullandığınızdan emin olunuz. Aksi halde bash shell ünlem işaretini ! anlamayacaktır.

Benzer şekilde belirtilen key'in değerinden farklı değerlere sahip olan nesneleri aramak için -l parametresiyle birlikte label key!=value araması yapmalısınız:

$ kubectl get pod -l creation_method!=manual
NAME READY STATUS RESTARTS AGE
fe 1/1 Running 0 37m
db 1/1 Running 0 6m

Belirli bir key'in verilen değerler listesinden birisi olup olmadığını is in parametresi ile kontrol edebilirsiniz.

$ kubectl get pod -l "env in (prod,test)"
NAME READY STATUS RESTARTS AGE
be 1/1 Running 0 13m

Yine benzer şekilde bu listeden bir değere sahip olmayanları da rahatlıkla notin parametresi ile filtreleyebiliriz.

$ kubectl get pod -l "env notin (prod)"
NAME READY STATUS RESTARTS AGE
fe 1/1 Running 0 26m

Son olarak tüm bu kullanım şekillerini tek bir sorguda virgül ile ayırarak bir arada kullanabilirsiniz.

$ kubectl get pod -l creation_method=manual,env=test
NAME READY STATUS RESTARTS AGE
db 1/1 Running 0 16m

Sıradaki yazı ile eğitim serisine devam edebilirsiniz.

Kubernetes Replication Controller Nedir?
Replication Controller, pod’ları sürekli izleyerek belirlenen sayıda pod’un çalışır olduğunu garantiler.