Pada artikel sebelumnya, kita telah membahas tentang DaemonSet yang memastikan Pod berjalan pada setiap node dalam klaster. Kali ini, kita akan membahas tentang Job, sebuah kontroler yang menjalankan Pod sampai tugasnya selesai dengan sukses.

Apa itu Job?

Job adalah kontroler di Kubernetes yang membuat satu atau lebih Pod dan memastikan bahwa sejumlah tertentu Pod berhasil menyelesaikan tugasnya. Berbeda dengan Deployment atau ReplicaSet yang dirancang untuk menjalankan aplikasi yang berjalan terus-menerus (long-running), Job dirancang untuk tugas yang memiliki titik akhir yang jelas, seperti batch processing, komputasi paralel, atau tugas pemeliharaan.

Ketika Pod yang dibuat oleh Job selesai menjalankan tugasnya, Job akan menandai tugas tersebut sebagai selesai. Ketika jumlah Pod yang berhasil menyelesaikan tugas mencapai jumlah yang ditentukan, Job dianggap selesai.

Kapan Menggunakan Job?

Job sangat berguna untuk kasus-kasus berikut:

  1. Batch Processing: Menjalankan tugas pemrosesan data batch seperti ETL (Extract, Transform, Load).
  2. Komputasi Paralel: Menjalankan tugas komputasi yang bisa diparalelkan.
  3. Migrasi Database: Menjalankan skrip migrasi database.
  4. Tugas Pemeliharaan: Menjalankan tugas pemeliharaan seperti backup atau pembersihan data.
  5. Pengujian: Menjalankan suite pengujian.

Membuat Job

Mari kita lihat contoh sederhana Job untuk menjalankan tugas batch:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-calculator
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

Pada contoh di atas, kita membuat Job bernama pi-calculator yang akan menghitung nilai Pi hingga 2000 digit menggunakan Perl. Beberapa hal penting dalam konfigurasi Job:

  • restartPolicy: Harus diatur ke Never atau OnFailure. Tidak bisa diatur ke Always karena Job dirancang untuk tugas yang memiliki titik akhir.
  • backoffLimit: Jumlah maksimum percobaan ulang jika Pod gagal. Default-nya adalah 6.

Pola Job

Kubernetes mendukung beberapa pola Job yang bisa digunakan sesuai kebutuhan:

1. Job Non-Paralel

Ini adalah pola paling sederhana di mana hanya satu Pod yang dibuat dan Job dianggap selesai ketika Pod tersebut selesai dengan sukses.

spec:
  completions: 1
  parallelism: 1

2. Job dengan Jumlah Penyelesaian Tetap

Dalam pola ini, Job akan membuat Pod secara berurutan atau paralel sampai jumlah Pod yang berhasil mencapai nilai completions.

spec:
  completions: 5
  parallelism: 2

Dengan konfigurasi di atas, Job akan membuat maksimal 2 Pod secara bersamaan dan akan terus membuat Pod baru sampai 5 Pod berhasil menyelesaikan tugasnya.

3. Job Paralel dengan Antrian Kerja

Dalam pola ini, Job membuat beberapa Pod yang bekerja secara independen untuk memproses item dari antrian kerja.

spec:
  parallelism: 3

Dengan konfigurasi di atas, Job akan membuat 3 Pod secara bersamaan. Pod-Pod tersebut akan mengambil item dari antrian kerja (misalnya dari database atau message queue) dan memprosesnya.

Parameter Job

Berikut adalah beberapa parameter penting dalam konfigurasi Job:

1. completions

Jumlah Pod yang harus berhasil menyelesaikan tugasnya agar Job dianggap selesai. Default-nya adalah 1.

spec:
  completions: 5

2. parallelism

Jumlah maksimum Pod yang bisa berjalan secara bersamaan. Default-nya adalah 1.

spec:
  parallelism: 3

3. backoffLimit

Jumlah maksimum percobaan ulang jika Pod gagal. Default-nya adalah 6.

spec:
  backoffLimit: 4

4. activeDeadlineSeconds

Batas waktu maksimum (dalam detik) untuk Job. Jika Job berjalan lebih lama dari waktu ini, semua Pod akan dihentikan dan Job dianggap gagal.

spec:
  activeDeadlineSeconds: 100

5. ttlSecondsAfterFinished

Waktu (dalam detik) setelah Job selesai sebelum Job dihapus secara otomatis. Fitur ini berguna untuk membersihkan Job yang sudah selesai.

spec:
  ttlSecondsAfterFinished: 100

Contoh Lengkap: Job Paralel

Mari kita lihat contoh lengkap Job paralel untuk memproses data:

apiVersion: batch/v1
kind: Job
metadata:
  name: data-processor
spec:
  completions: 10
  parallelism: 3
  backoffLimit: 4
  template:
    spec:
      containers:
      - name: processor
        image: data-processor:v1
        env:
        - name: BATCH_SIZE
          value: "100"
        - name: REDIS_HOST
          value: "redis-service"
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"
      restartPolicy: OnFailure

Pada contoh di atas, kita membuat Job bernama data-processor yang akan memproses data dalam batch. Job akan membuat maksimal 3 Pod secara bersamaan dan akan terus membuat Pod baru sampai 10 Pod berhasil menyelesaikan tugasnya.

Menangani Kegagalan

Job menyediakan beberapa mekanisme untuk menangani kegagalan:

1. restartPolicy

Kebijakan restart untuk Pod. Bisa diatur ke Never atau OnFailure.

  • Never: Pod yang gagal tidak akan di-restart. Job akan membuat Pod baru sebagai gantinya.
  • OnFailure: Pod yang gagal akan di-restart di node yang sama.
spec:
  template:
    spec:
      restartPolicy: OnFailure

2. backoffLimit

Jumlah maksimum percobaan ulang jika Pod gagal. Setelah mencapai batas ini, Job dianggap gagal.

spec:
  backoffLimit: 4

3. activeDeadlineSeconds

Batas waktu maksimum untuk Job. Jika Job berjalan lebih lama dari waktu ini, Job dianggap gagal.

spec:
  activeDeadlineSeconds: 100

Contoh Kasus: Migrasi Database

Mari kita lihat contoh Job untuk menjalankan migrasi database:

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migration
spec:
  template:
    spec:
      containers:
      - name: migration
        image: flyway:latest
        env:
        - name: FLYWAY_URL
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: url
        - name: FLYWAY_USER
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: username
        - name: FLYWAY_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password
        command: ["flyway", "migrate"]
      restartPolicy: OnFailure
  backoffLimit: 2

Pada contoh di atas, kita membuat Job bernama db-migration yang akan menjalankan migrasi database menggunakan Flyway. Job akan mencoba ulang maksimal 2 kali jika migrasi gagal.

Membersihkan Job yang Sudah Selesai

Job yang sudah selesai tidak akan dihapus secara otomatis. Ini berguna untuk melihat log dan status Job setelah selesai. Namun, jika kita ingin Job dihapus secara otomatis setelah selesai, kita bisa menggunakan parameter ttlSecondsAfterFinished:

spec:
  ttlSecondsAfterFinished: 100

Dengan konfigurasi di atas, Job akan dihapus secara otomatis 100 detik setelah selesai.

Kesimpulan

Job adalah kontroler yang sangat berguna untuk menjalankan tugas batch atau tugas yang memiliki titik akhir yang jelas di Kubernetes. Dengan Job, kita bisa memastikan bahwa tugas tersebut berjalan sampai selesai dengan sukses, dengan mekanisme retry yang otomatis jika terjadi kegagalan.

Pada artikel berikutnya, kita akan membahas tentang CronJob - kontroler yang mengatur Job untuk berjalan secara terjadwal. Jangan lupa untuk mencoba contoh-contoh di atas di klaster Minikube Anda!

Cappy Hoding! ๐Ÿ––๐Ÿพ