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:
- Bir JSON veya YAML manifest dosyası içerisinde
labels
parametresi ile tanımlayarak. - 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
'!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.