Kubernetes Job ve CronJob: Görev Yönetimi Detayları

Tek seferlik ve zamanlanmış görevlerin Kubernetes'te nasıl yönetildiğini öğrenin.

Giriş: Kubernetes'te Batch İş Yükleri

Kubernetes, genellikle sürekli çalışan, uzun ömürlü uygulamaları (örneğin web sunucuları, API'ler) yönetmek için kullanılır. Ancak, birçok senaryoda, bir kez çalışıp biten veya belirli aralıklarla çalışan görevlere (batch jobs) ihtiyaç duyulur. Örnek olarak, veri yedekleme, rapor oluşturma, veri analizi veya veritabanı temizliği gibi işlemler verilebilir.

Kubernetes, bu tür batch iş yüklerini yönetmek için iki ana kaynak sağlar:

Bu belgede, bu iki kaynağı detaylı bir şekilde inceleyeceğiz ve kullanım durumlarını, çalışma prensiplerini ve aralarındaki farkları görseller ve YAML örnekleriyle açıklayacağız.

1. Job

Bir **Job**, Kubernetes'te bir görevin başarılı bir şekilde tamamlandığını garanti eden bir denetleyicidir. Bir Job oluşturduğunuzda, Kubernetes bir veya daha fazla Pod başlatır ve bu Pod'ların görevi tamamlamasını bekler. Eğer bir Pod başarısız olursa (örneğin uygulama bir hata koduyla çıkar veya bir düğüm çökerse), Job denetleyicisi varsayılan olarak bu Pod'u yeniden başlatır veya başka bir düğüme yeniden planlar. Job, belirtilen sayıda Pod'un başarıyla tamamlanmasını sağlayana kadar Pod'ları oluşturmaya devam eder.

Neden ve Ne İşe Yarar?

  • **Tek Seferlik Görevler:** Uzun süreli çalışması gerekmeyen, bir kez çalışıp biten görevler için kullanılır.
  • **Hata Toleransı:** Bir Pod'un başarısız olması durumunda otomatik yeniden deneme ve yeniden planlama yeteneği sunar.
  • **Paralel Çalıştırma:** Aynı görevin birden fazla kopyasını paralel olarak çalıştırma yeteneği sağlar (örneğin, büyük bir veri setini parçalar halinde işleme).

Temel Özellikleri:

  • `spec.completions`: İşin kaç kez başarılı bir şekilde tamamlanması gerektiğini belirtir.
  • `spec.parallelism`: Aynı anda kaç Pod'un çalışmasına izin verileceğini belirtir.
  • `spec.backoffLimit`: Bir Job'un başarısız denemelerden sonra kaç kez yeniden denenmesi gerektiğini belirtir.
  • `spec.activeDeadlineSeconds`: İşin tamamlanması için izin verilen maksimum süreyi belirtir. Bu süreyi aşarsa, iş ve tüm çalışan Pod'ları sonlandırılır.

Örnek YAML:


apiVersion: batch/v1
kind: Job
metadata:
  name: tek-seferlik-gorev
spec:
  template:
    metadata:
      name: tek-seferlik-gorev-pod
    spec:
      containers:
      - name: batch-container
        image: alpine/git:latest # Örnek bir imaj
        command: ["sh", "-c", "echo 'Görev başlatıldı!'; sleep 10; echo 'Görev tamamlandı!';"]
      restartPolicy: OnFailure # Pod başarısız olursa yeniden başlat
  completions: 1 # Görevin bir kez başarıyla tamamlanmasını bekle
  backoffLimit: 4 # Başarısızlık durumunda 4 defaya kadar yeniden dene
                

Job Çalışma Akışı

⚙️
Job Tanımı
📦
Pod Başlat
🔁
Hata/Çökme
Görev Başarılı

Job, Pod'ları başlatır, başarısızlık durumunda yeniden dener ve görev tamamlanana kadar çalışır.

2. CronJob

Bir **CronJob**, belirli bir zaman çizelgesine (cron formatında) göre `Job` nesnelerini otomatik olarak oluşturan bir Kubernetes kaynağıdır. Tıpkı Linux/Unix sistemlerindeki `cron` işlevine benzer şekilde çalışır, ancak Kubernetes kümeleri içinde konteynerize edilmiş görevler için tasarlanmıştır. CronJob'lar, düzenli olarak tekrarlanan, zamanlanmış iş yükleri için idealdir.

Neden ve Ne İşe Yarar?

  • **Zamanlanmış Görevler:** Günlük yedeklemeler, haftalık rapor oluşturma, veri senkronizasyonu gibi düzenli aralıklarla çalışması gereken görevler için kullanılır.
  • **Otomatik Tetikleme:** Belirtilen zaman çizelgesine göre Job'ları otomatik olarak tetikler.
  • **Merkezi Yönetim:** Tüm zamanlanmış görevleri Kubernetes kümesi içinde tek bir yerden yönetmenizi sağlar.

Temel Özellikleri:

  • `spec.schedule`: İşin ne zaman çalışacağını belirten cron formatındaki ifade (örneğin `"0 0 * * *"` her gece yarısı).
  • `spec.jobTemplate`: CronJob'un her tetiklendiğinde oluşturacağı Job'un şablonu.
  • `spec.concurrencyPolicy`: Aynı anda birden fazla Job'un çalışmasına izin verilip verilmeyeceğini belirler (`Allow`, `Forbid`, `Replace`).
  • `spec.successfulJobsHistoryLimit`: Tamamlanmış Job'lardan kaç tanesinin saklanacağını belirtir.
  • `spec.failedJobsHistoryLimit`: Başarısız Job'lardan kaç tanesinin saklanacağını belirtir.

Örnek YAML:


apiVersion: batch/v1
kind: CronJob
metadata:
  name: veritabani-yedekleme
spec:
  schedule: "0 0 * * *" # Her gün gece yarısı (00:00) çalıştır
  jobTemplate: # Bu CronJob'un oluşturacağı Job'un şablonu
    spec:
      template:
        spec:
          containers:
          - name: yedekleme-container
            image: postgres:latest # Örnek bir veritabanı imajı
            command: ["pg_dump", "-h", "postgres-service", "-U", "admin", "-Fc", "-f", "/backup/db.bak", "mydb"]
            volumeMounts:
            - name: yedekleme-depolama
              mountPath: /backup
          restartPolicy: OnFailure
          volumes:
          - name: yedekleme-depolama
            persistentVolumeClaim:
              claimName: yedekleme-pvc # Kalıcı depolama talebi
  concurrencyPolicy: Forbid # Bir önceki Job hala çalışıyorsa yeni Job'u başlatma
  successfulJobsHistoryLimit: 3 # Son 3 başarılı Job'u sakla
  failedJobsHistoryLimit: 1 # Son 1 başarısız Job'u sakla
                

CronJob Çalışma Akışı

CronJob Tanımı

(* * * * *)

⚙️
Job Oluştur
Job Çalışır/Biter
🔁 (Zamanlanmış)

CronJob, belirlenen zaman aralıklarında Job'ları otomatik olarak oluşturur.

Job ve CronJob Karşılaştırması

`Job` ve `CronJob` birbirini tamamlayan iki Kubernetes kaynağıdır. `Job` tek bir görevin tamamlanmasını sağlarken, `CronJob` bu Job'ların düzenli olarak çalıştırılmasını zamanlar.

Özellik Job CronJob
**Ana Amaç** Bir görevin başarıyla tamamlandığını garanti etmek (tek seferlik). Belirli bir zaman çizelgesine göre Job'ları çalıştırmak (zamanlanmış).
**Çalışma Sıklığı** Bir kez çalışır ve tamamlandığında durur. Cron formatında belirtilen aralıklarla (örneğin her saat, her gün) tekrar tekrar çalışır.
**Yaşam Döngüsü** Pod'lar başarılı bir şekilde tamamlandığında kendiliğinden sona erer. Sürekli çalışır ve zaman çizelgesine göre Job'lar oluşturur. Silinene kadar varlığını sürdürür.
**Hata Yönetimi** İçindeki Pod'ların hatalı çıkışında yeniden deneme yapar. Job'ların oluşturulması ve zamanlamasıyla ilgilenir. Job'un kendi hata yönetimi mekanizması vardır.
**Kontrol Edilen Birim** Pod'ları kontrol eder ve yönetir. Job'ları kontrol eder ve yönetir.
**Uygulama Alanı** Veri dönüştürme, tek seferlik komut çalıştırma, kısa süreli hesaplamalar. Veritabanı yedekleme, rapor oluşturma, periyodik temizlik, sistem izleme kontrolleri.
**Örnek Komut** `kubectl create -f my-job.yaml` `kubectl create -f my-cronjob.yaml`

Sonuç

Kubernetes'teki `Job` ve `CronJob` kaynakları, küme içinde batch iş yüklerini yönetmek için temel araçlardır. `Job`, bir görevin başarıyla tamamlanmasını garanti eden tek seferlik işlemler için idealdir ve Pod hatalarına karşı dayanıklılık sağlar. Öte yandan, `CronJob`, bu Job'ları belirli bir zaman çizelgesine göre düzenli olarak çalıştırma yeteneği sunar, böylece otomasyon ve bakım görevleri kolayca yönetilebilir. Bu iki kaynağı doğru bir şekilde kullanarak, Kubernetes kümelerinizde hem uzun süreli uygulamaları hem de tek seferlik veya periyodik görevleri verimli bir şekilde çalıştırabilirsiniz, bu da operasyonel esnekliği ve verimliliği önemli ölçüde artırır.