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:
- **Job:** Bir veya daha fazla Pod'un başarılı bir şekilde tamamlanmasını sağlayan tek seferlik görevler için kullanılır.
- **CronJob:** Belirli bir zaman çizelgesine (cron formatında) göre Job'ları düzenli olarak çalıştıran zamanlanmış görevler için kullanılır.
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, 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, 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.