Kubernetes Job nedir?
5 min read

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.
Kubernetes Job nedir?
Photo by Andrew Leu / Unsplash

Kubernetes Job, belirli bir işlemi tamamlamak için bir veya daha fazla Pod'u başlatıp sonlandıran ve yöneten bir Kubernetes nesnesidir. Genellikle, bir Job, birden fazla Pod'un belirli bir sayıda çalıştırılmasını gerektiren iş yüklerini yürütmek için kullanılır.

Daha önceki başlıklarda gördüğümüz ReplicationController, ReplicaSet ve DaemonSet nesneleri, pod'ların başlayıp sürekli çalışmalarını sağlarlar. Fakat Job nesnesi, bir işlemi tamamlamak için bir pod başlatır ve işlem tamamlandığında pod'u tekrar başlatmayarak görevini tamamlamış sayar.

Örneğin, bir veritabanı yedekleme işlemi, bir Job olarak tanımlanabilir. Bu Job, belirli bir sayıda Pod başlatır ve her bir Pod, yedekleme işlemini tamamlamak için veritabanı sunucusuna bağlanır. İşlem tamamlandığında, Pod'lar sonlandırılır ve Job tamamlanır.

1. Job Önemli Özellikler

  • Bir Job başarılı bir şekilde tamamlandığında, çalıştırdığı pod tekrar çalıştırılmaz.
  • Job'un başlattığı pod'larda çalışan işlemlerin çökmesi veya ölmesi durumunda Job başarısız sayılıp yeniden başlatılabilir. Bu özellik sayesinde, bir işlem hatalı veya beklenmedik şekilde sonlandığında, Job'un otomatik olarak yeniden denenmesi sağlanabilir.
  • Job'un çalıştığı node, job başarılı bir şekilde tamamlanmadan node çökerse, Job'lar otomatik olarak farklı bir sağlıklı node üzerinde tekrar başlatılır.

2. Job Nesnesi Oluşturmak

Kubernetes Job 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: batch/v1
kind: Job
metadata:
  name: batch-job
spec:
  template:
    metadata:
      name: my-job-pod
    spec:
      containers:
        - name: greet-user
          image: busybox
          command: ["echo", "Hello Kubernetes!"]
      restartPolicy: Never

Bu YAML dosyası, "batch-job" adında bir Job nesnesi oluşturur. Bu Job, "busybox" imajından çalıştırdığı container ile ekrana "echo" komutunu kullanarak "Hello Kubernetes!" mesajını yazdırır ve sonlanır.

RestartPolicy özelliği "Never" olarak ayarlandığından, konteyner bir kez çalıştırılır ve tamamlandıktan sonra yeniden başlatılmaz.

🚧
Job'lar tek sefer çalışacağı için RestartPolicy parametresine Always değerini alamazlar. Sadece OnFailure ve Never seçeneklerinden birisini kullanabilirsiniz.

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

 kubectl create -f file-job.yaml

Ardından pod'lara baktığınızda Job'unuzun gerekli pod'u oluşturduğunu göreceksiniz.

$ kubectl get pod
NAME READY STATUS RESTARTS AGE
batch-job-28qf4 1/1 Running 0 4s

Job başarıyla tamamlandıktan sonra pod listesine --show-all veya -a parametresiyle bakarsanız durumunun Completed olarak işaretlendiğini görürsünüz.

kubectl get pod -a
NAME READY STATUS RESTARTS AGE
batch-job-28qf4 0/1 Completed 0 2m

3. Oluşturulan Job Hakkında Bilgi Almak

Oluşturduğunuz Job'ları görmek için kubectl get jobs komutunu kullanabilirsiniz.

$ kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
batch-job 1 0 2s

Bir Job tamamlanıp pod Completed durumuna çekilse bile listeden silinmez. Çünkü ilgili Job'un loglarına bakmak isteyebilirsiniz. Bir Job'un loglarına bakmak için kubectl logs komutunu Job'un oluşturduğu Pod adı ile kullanabilirsiniz.

$ kubectl logs batch-job-28qf4
Hello Kubernetes!

4. Job İle Birden Fazla Pod Çalıştırmak

Kubernetes Job nesnesi ile ihtiyaç duymanız halinde birden fazla Pod çalıştırabilirsiniz. Job altında çalışacak Pod'lar completions veya parallelism özelliklerinden hangisinin seçildiğine göre seri veya paralel bir şekilde çalışabilir.

Bir Job'un birden fazla çalıştırılmasına ihtiyacınız varsa, completions parametresini, Job'un kaç kez çalışmasını istediğinize göre ayarlarsınız.

apiVersion: batch/v1
kind: Job
metadata:
 name: multi-completion-batch-job
spec:
 completions: 5
 template:
 ****

Bu Job, birbiri ardına beş Pod çalıştıracaktır. Job, başlangıçta bir Pod oluşturur ve Pod'un container'ı tamamlandığında ardından ikinci Pod'u oluşturur. İşlemler beş Pod başarıyla tamamlanana kadar bu şekilde devam eder. Eğer Pod'lardan biri hata verirse, Job yeni bir Pod oluşturur. Böylece Job toplamda beşten fazla Pod'da oluşturabilir.

Bir Job, Pod'ları arka arkaya seri bir şekilde çalıştırmak yerine, Job'un birden çok Pod'u paralel olarak çalıştırmasını da sağlayabilirsiniz. Aşağıdaki örnekte gösterildiği gibi, parallelism parametresiyle kaç Pod'un paralel çalışmasına izin verileceğini belirlersiniz.

apiVersion: batch/v1
kind: Job
metadata:
 name: multi-completion-batch-job
spec:
 completions: 5
 parallelism: 2
 template:
 ***

Job, parallelism2 olarak ayarlandığı için aynı anda iki Pod oluşturur ve bunları paralel olarak çalıştırır:

$ kubectl get po
NAME READY STATUS RESTARTS AGE
multi-completion-batch-job-lmmnk 1/1 Running 0 21s
multi-completion-batch-job-qx4nq 1/1 Running 0 21s

Bu Pod'lardan biri biter bitmez Job, beş Pod başarıyla bitene kadar bir sonraki Pod'u çalıştırmaya devam eder. Yani, aynı anda iki adet Pod çalışacak şekilde Pod'ları çalıştırmaya devam eder.

Bir Job çalışırken, parallelism değerini artırabilir ve azaltabilirsiniz. Bu sayede Job'u hızlandırabilir veya yavaşlatabilirsiniz. Job'un parallelism değerini değiştirmek için scale komutunu kullanabilirsiniz.

$ kubectl scale job multi-completion-batch-job --replicas 3
job "multi-completion-batch-job" scaled

Komutu çalıştırdığınız anda Job, paralel çalışan pod sayısını 3'e çıkarmak için hemen bir tane daha Pod çalıştıracaktır.

5. Job İle Pod'lara Limit Koymak

Job'un çalıştırdığı Pod'lar kimi zaman işlettiği logic veya meydana gelen hatalar sebebiyle takılı kalıp sonsuz döngüye girebilir. Veya yapmak istediğiniz işin çok hızlı yapılması gerekip belirli bir sürenin üstünü tolere edemiyor olabilirsiniz. Bu gibi durumlarda limit kullanmak çok önemlidir.

Bir Pod'un çalışma süresi, activeDeadlineSeconds parametresi ayarlanarak sınırlandırılabilir. Pod, eğer bundan daha uzun süre çalışırsa, sistem onu ​​sonlandırmayı dener ve Job'u başarısız olarak işaretler.

Ayrıca bir backoffLimit değeri belirterek, bir Job'un başarısız olarak işaretlenmeden önce kaç kez yeniden denenebileceğini yapılandırabilirsiniz. Eğer bu parametreyi belirtmezseniz, varsayılan olarak 6 değeri kullanılır.

apiVersion: batch/v1
kind: Job
metadata:
  name: batch-job
spec:
  activeDeadlineSeconds: 600
  backoffLimit: 3
  template:
    metadata:
      name: my-job-pod
    spec:
      containers:
        - name: greet-user
          image: busybox
          command: ["echo", "Hello Kubernetes!"]
      restartPolicy: Never
  • activeDeadlineSeconds, Job'un en fazla 10 dakika (600 saniye) çalışmasına izin verir.
  • backoffLimit parametresi ise, hata vermesi durumunda container'ın üç kez yeniden başlatılmasına izin verir.

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

Kubernetes CronJob nedir?
Kubernetes CronJob, periyodik görevlerin otomatik olarak çalıştırılmasını sağlayan bir Kubernetes nesnesidir.