Kubernetes DaemonSet Nedir?

Kubernetes DaemonSet, cluster'daki her bir node üzerinde belirli bir pod'un bir replikasını çalıştıran sistemdir. DaemonSet ile cluster'daki her bir node üzerinde belirli bir görevi yerine getirmesi gereken pod'lar otomatik olarak çalıştırılabilir ve yönetilebilir.

ReplicationController ve ReplicaSet nesneleri, bir pod'un belirlenen sayı kadar replikasının çalışmasını garanti ederler. Fakat hangi node üzerinde kaç tanesinin yer alacağına dair herhangi bir garanti sunmazlar. DaemonSet ise her bir node üzerinde bir replikanın çalışacağının garantisini size sunar.

Kubernetes DaemonSet'in kullanılabileceği senaryolar şunlar olabilir:

  1. Log toplama: Her bir node üzerinde çalışması gereken log toplama pod'ları DaemonSet ile otomatik olarak dağıtılabilir ve yönetilebilir.
  2. Güvenlik: Her bir node üzerinde çalışması gereken güvenlik pod'ları DaemonSet ile otomatik olarak dağıtılabilir ve yönetilebilir.
  3. Monitoring: Her bir node üzerinde çalışması gereken monitoring pod'ları DaemonSet ile otomatik olarak dağıtılabilir ve yönetilebilir.
  4. İzolasyon: Özel bir gereksinim için bir DaemonSet kullanarak, belirli bir node üzerinde çalışması gereken podlar diğer node'larda çalışmayacak şekilde izole edilebilir.
  5. Network policy: DaemonSet kullanarak, ağ politikalarının uygulanması için her bir node üzerinde belirli bir pod çalıştırılabilir.

1. DaemonSet Önemli Özellikler

  • Kubernetes DaemonSet nesnesinin amacı her node üzerinde bir pod çalıştırmak olduğu için Scheduler bileşenine ihtiyaç duymaz. Bu nedenle unschedulable olarak işaretlenmiş node'larınız varsa bile DaemonSet bunu önemsemeden pod'u ilgili node üzerinde çalıştırır.
  • DaemonSet ile ilgili diğer bir önemli yetenekte, nodeSelector parametresini yapılandırarak her node yerine belirli koşulları sağlayan tüm node'larda pod oluşturma işlemini sağlayabilmenizdir. Tabi eğer bu parametreyi yapılandırmazsanız, varsayılan davranış tüm node'lar üzerinde pod oluşturulmasıdır.
  • Cluster'a yeni bir node eklendiğinde, DaemonSet, o yeni node üzerinde ilgili pod'u oluşturur. Node silindiğinde ise yine ilgili pod'u kaldırır.
  • Son olarak ise ReplicationController ve ReplicaSet nesnelerinin aksine, DaemonSet herhangi bir replica sayısı parametresi içermez. Çünkü DaemonSet nesnesinin amacı tüm node'lar üzerinde ilgili pod'un bir replikasını çalıştırmaktır.

2. DaemonSet Oluşturmak

Replication Set oluşturmak için JSON veya YAML formatında bir manifest dosyası hazırlayarak Kubernetes API Server'a göndermemiz gerekiyor. Bunun için ilk olarak manifest dosyamızı görelim:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ssd-monitor
spec:
  selector:
    matchLabels:
      app: ssd-monitor
  template:
    metadata:
      labels:
        app: ssd-monitor    
    spec:
      nodeSelector:
	    disk: ssd
      containers:
      - name: web
        image: nginx:latest

Buradaki nodeSelector parametresi opsiyoneldir. Bu parametreyi yapılandırarak tüm node'lar yerine belirli label'larla işaretlenmiş tüm node'lar üzerinde pod'ları çalıştırmış olursunuz. Eğer nodeSelector parametresini kullanmazsanız tüm node'lar üzerinde pod'lar çalıştırılır.

Manifest dosyası hazır olduktan sonra kubectl create veya kubectl apply komutlarından birisi ile Replication Controller'ı oluşturabilirsiniz.

 kubectl create -f file-ds.yaml

Ardından pod'lara baktığınızda belirttiğiniz node sayısı kadar pod'un oluşturuluduğunu göreceksiniz.

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ssd-monitor-53thy 0/1 ContainerCreating 0 2s
💡
Eğer yukarıdaki manifesti kullandığınızda pod sayısını 0 olarak görüyorsanız nodeSelector ile belirttiğimiz disk: ssd label'ını node'unuza eklememişsiniz demektir. kubectl label node minikube disk=ssd komutu ile ilgili node'unuza label ekleyebilirsiniz. Ardından pod ilgili node üzerinde çalıştırılacaktır.

Kubernetes Label konusu hakkında daha fazla detay almak için şu yazımızı ziyaret edebilirsiniz:

Kubernetes Label Nedir?
Kubernetes label, Kubernetes nesnelerinizi sınıflandırmak, tanımlamak, filtrelemek için kullanılan key-value çiftleridir.

3. Oluşturulan DaemonSet Hakkında Bilgi Almak

Oluşturduğunuz DaemonSet'leri görmek için kubectl get ds komutunu kullanabilirsiniz.

$ kubectl get ds
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ssd-monitor   1         1         1       1            1           disk=ssd        48s
💡
kubectl get komutunda uzunca daemonset yazmak yerine kısaca ds yazabilirsiniz.

DaemonSet hakkında daha fazla bilgi almak için kubectl describe komutunu kullanabilirsiniz.

$ kubectl describe ds ssd-monitor
Name:           ssd-monitor
Selector:       app=ssd-monitor
Node-Selector:  disk=ssd
Labels:         <none>
Annotations:    deprecated.daemonset.template.generation: 1 
Desired Number of Nodes Scheduled: 1
Current Number of Nodes Scheduled: 1
Number of Nodes Scheduled with Up-to-date Pods: 1
Number of Nodes Scheduled with Available Pods: 1
Number of Nodes Misscheduled: 0
Pods Status:  1 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=ssd-monitor
  Containers:
   web:
    Image:        nginx:latest
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                  Message
  ----    ------            ----  ----                  -------
  Normal  SuccessfulCreate  82s   daemonset-controller  Created pod: ssd-monitor-pp6cm

4. DaemonSet Silmek

DaemonSet silindiğinde yönettiği tüm podlarda silinir. DS'yi silmek için kubectl delete komutunu çalıştırabiliriz.

kubectl delete ds ssd-monitor

DaemonSet'i sildiğinizde, bu DS'nin takip ettiği podlarda silinir. Eğer silinmemesini istiyorsanız --cascade=false parametresini kullanabilirsiniz.

kubectl delete ds ssd-monitor --cascade=false

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

Kubernetes Job nedir?
Kubernetes Job, belirli bir işlemi tamamlamak için bir veya daha fazla Pod’u başlatan ve yöneten bir Kubernetes nesnesidir.