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.

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.

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
💡
Farkettiğiniz üzere bir CronJob her cron zamanı geldiğinde Job oluşturur. Fakat sadece son 3 Job listede tutulur. Aksi halde Job listeniz çok uzun olurdu.

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.

Crontab.guru - The cron schedule expression editor
An easy to use editor for crontab schedules.

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

Kubernetes Service Nedir?
Kubernetes Service, bir Pod grubuna sabit bir adresten erişmek için kullanılan bir Kubernetes nesnesidir.