Kubernetes Job nedir?
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.
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, parallelism
2 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.