Kubernetes CronJob nedir?
Kubernetes CronJob, belirli bir sıklıkla çalıştırılması gereken görevleri otomatik olarak yürütmek için kullanılan bir Kubernetes nesnesidir. Bu görevler, belirli bir tarih ve saat veya bir CRON ifadesi ile belirlenir.
Bir önceki yazıda gördüğümüz Job nesnesi, oluşturulduğunda Pod'larını hızlıca çalıştırır ve başarılıyla tamamlandığında tekrar başlayamayacak şekilde kapatır. Fakat belirli aralıklarla çalıştırmak istediğiniz işler olduğunda Job nesnesi yerine CronJob nesnesini tercih etmeniz gerekir.
CronJob nesnesi, belirlenen zaman geldiğinde, bir Job oluşturur ve geri kalan işlemleri tıpkı bir önceki yazıda gördüğümüz gibi tamamen Job devralır.
Kubernetes CronJob, sistem bakımı veya yedekleme işlemleri gibi periyodik işlerin otomatik olarak yürütülmesi üzerine kurulu birçok farklı senaryoda kullanılabilir.
1. CronJob Nesnesi Oluşturmak
Kubernetes CronJob 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: CronJob
metadata:
name: batch-job-every-minutes
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 15
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
Manifest dosyasında gördüğünüz gibi, bir CronJob nesnesini Job nesnesinden ayıran en önemli ve tek özellik schedule
parametresidir.
schedule
parametresi cron ifadesi alır. Ayrıca Kubernetes tarafından tanımlanan bazı hazır cron ifadelerini de kullanabilirsiniz.
İfade | Tanım | CRON karşılığı |
---|---|---|
@yearly (or @annually) | Run once a year at midnight of 1 January | 0 0 1 1 * |
@monthly | Run once a month at midnight of the first day of the month | 0 0 1 * * |
@weekly | Run once a week at midnight on Sunday morning | 0 0 * * 0 |
@daily (or @midnight) | Run once a day at midnight | 0 0 * * * |
@hourly | Run once an hour at the beginning of the hour | 0 * * * * |
startingDeadlineSeconds
parametresi ise Job'ın başlaması için gereken üst limiti belirtir. Eğer bir Job bu belirlenen sürede herhangi bir sebeple başlayamazsa başarısız olarak işaretlenir ve Job'un başlatılması sıradaki cron zamanına kalır.
Manifest dosyası hazır olduktan sonra kubectl create
veya kubectl apply
komutlarından birisi ile Replication Controller'ı oluşturabilirsiniz.
kubectl create -f file-cronjob.yaml
Ardından pod'lara baktığınızda CronJob'unuzun gerekli pod'ları her dakika oluşturduğunu göreceksiniz.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
batch-job-every-minutes-28058161-xsdng 0/1 Completed 0 2m37s
batch-job-every-minutes-28058162-6jrsw 0/1 Completed 0 97s
batch-job-every-minutes-28058163-tq859 0/1 Completed 0 37s
2. Oluşturulan CronJob Hakkında Bilgi Almak
Oluşturduğunuz CronJob'ları görmek için kubectl get cronjobs
komutunu kullanabilirsiniz.
kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hebatch-job-every-minutes * * * * * False 0 4m37s 57m
kubectl get
komutunda uzunca cronjobs
yazmak yerine kısaca cj
yazabilirsiniz.Her CronJob, çalışma zamanı geldiğinde bir Job oluşturacağı için kubectl get job
komutunun çıktısında da son oluşturulan 3 Job'u görebilirsiniz.
PS D:\K8S> kubectl get jobs
NAME COMPLETIONS DURATION AGE
batch-job-every-minutes-28058129 1/1 5s 2m17s
batch-job-every-minutes-28058130 1/1 5s 77s
batch-job-every-minutes-28058131 1/1 5s 17s
Bir CronJob tamamlanıp pod Completed
durumuna çekilse bile son 3 adet Pod listeden silinmez. Çünkü ilgili Job'un loglarına bakmak isteyebilirsiniz. Bir CronJob'un loglarına bakmak için kubectl logs
komutunu Job'un oluşturduğu Pod adı ile kullanabilirsiniz.
$ kubectl logs batch-job-every-minutes-28058129
Sun May 7 20:06:02 UTC 2023
Hello from the Kubernetes cluster
3. CronJob Schedule Parametresi
Cron formatına aşina değilseniz, çevrimiçi olarak harika öğreticiler ve açıklamalar bulacaksınız, ancak hızlı bir giriş olarak, program soldan sağa aşağıdaki beş girişi içerir:
- Dakika
- Saat
- Ayın günü
- Ay
- Haftanın günü
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │ OR sun, mon, tue, wed, thu, fri, sat
# │ │ │ │ │
# * * * * *
Örneğin, bir job'u 15 dakikada bir çalıştırmak istiyorsunuz, cronun "0,15,30,45 * * * *" olması gerekiyor. Yani her saatin 0, 15, 30 ve 45. dakikasında (birinci yıldız), ayın her günü (ikinci yıldız), her ayın (üçüncü yıldız) ve haftanın her günü (dördüncü yıldız).
Ayrıca Kubernetes tarafından tanımlanan bazı hazır cron ifadelerini de kullanabilirsiniz.
İfade | Tanım | CRON karşılığı |
---|---|---|
@yearly (or @annually) | Run once a year at midnight of 1 January | 0 0 1 1 * |
@monthly | Run once a month at midnight of the first day of the month | 0 0 1 * * |
@weekly | Run once a week at midnight on Sunday morning | 0 0 * * 0 |
@daily (or @midnight) | Run once a day at midnight | 0 0 * * * |
@hourly | Run once an hour at the beginning of the hour | 0 * * * * |
Cron formatları hakkında daha fazla bilgi alıp anlık deneme yapabileceğiniz güzel bir site için aşağıdaki bağlantıyı ziyaret edebilirsiniz.
Sıradaki yazı ile eğitim serisine devam edebilirsiniz.