Kubernetes 101: Jobs dan CronJobs

Udah tau jobs dan cronjobs di kubernetes? Artikel ini bahas semua yang perlu lo tau, termasuk sintaks cron, hingga cronjob dan jobs manifest!

Kubernetes 101: Jobs dan CronJobs
Kubernetes 101: Jobs dan CronJobs - onxp blog

Cron itu fitur lama di sistem operasi mirip Unix, yang memungkinkan lo buat jadwalin eksekusi skrip atau perintah di waktu-waktu tertentu.

Pendahuluan

Cron itu fitur lama di sistem operasi mirip Unix, yang memungkinkan lo buat jadwalin eksekusi skrip atau perintah di waktu-waktu tertentu. Cron pake file konfigurasi sederhana berbasis teks buat ngatur job yang terjadwal, dan sering dipake di lingkungan server buat tugas kayak rotasi log dan pemeliharaan sistem.

Sebagai platform modern dan bisa diperluas, Kubernetes punya fitur serupa tapi diadaptasi buat skenario sistem terdistribusi. CronJobs itu salah satu tipe resource di Kubernetes yang ngatur job berbasis waktu dan jalanin mereka secara teratur sesuai jadwal yang lo tentuin.

Sintaks Cron

Sintaks cron jadi dasar gimana kita nentuin jadwal di CronJobs di Kubernetes.  Biar lo bisa bikin jadwal sesuai kebutuhan, lo harus paham cara kerja sintaks cron. Ada ekspresi cron dasar yang terdiri dari lima kolom yang dipisahin sama spasi yang ngegambarin:

  1. Menit dalam jam (0 - 59)
  2. Jam dalam hari (0 - 23)
  3. Hari dalam bulan (1 - 31)
  4. Bulan dalam tahun (1 - 12)
  5. Hari dalam minggu (0 - 7) di mana 0 dan 7 sama-sama ngegambarin hari Minggu

Masing-masing kolom ini bisa punya specific value, range, set of values, atau asterisk yang ngegambarin semua kemungkinan nilai. Yuk kita bahas satu-satu:

  1. Specific Value: Kalo lo mau job lo jalan di menit ke-30 tiap jam, ekspresi cron lo bakal jadi 30 * * * *.
  2. Range: Kalo lo mau job lo jalan di menit pertama tiap jam dari jam 8 pagi sampai jam 5 sore, ekspresi cron lo bakal jadi 0 8-17 * * *.
  3. Set of Values: Kalo lo mau job lo jalan di menit pertama tiap jam pada jam 8 pagi, 12 siang, dan 5 sore, ekspresi cron lo bakal jadi 0 8,12,17 * * *.
  4. All Values (asterisk): Kalo lo mau job lo jalan tiap menit, ekspresi cron lo bakal jadi * * * * *.

Selain itu, ada juga karakter spesial yang bisa dipake:

  1. Comma (,): Biar lo bisa nentuin daftar nilai atau range. Contohnya, 1,2,5 * * * * artinya “di menit ke-1, 2, dan 5”.
  2. Hyphen (-): Biar lo bisa nentuin rentang nilai. Contohnya, 1-5 * * * * artinya “setiap menit dari menit ke-1 sampai ke-5”.
  3. Asterisk (*): Ngegambarin semua nilai yang mungkin buat suatu kolom. Contohnya, * * * * * artinya “setiap menit, setiap jam, setiap hari, setiap bulan”
  4. Slash (/): Biar lo bisa nentuin nilai yang diambil setiap beberapa langkah tertentu. Contohnya, */15 * * * * artinya “setiap 15 menit”.

Lo harus inget juga kalo aturan sintaks ini bisa digabungin ke satu kolom buat bikin ekspresi yang lebih kompleks. Misalnya, 1-5,*/15,30-45 * * * * artinya “setiap menit dari menit ke-1 sampai ke-5, setiap 15 menit, dan setiap menit dari menit ke-30 sampai ke-45”.

Peran CronJobs di Kubernetes

Peran CronJobs di Kubernetes - onxp blog

CronJobs di Kubernetes bikin Jobs (jenis resource di Kubernetes yang dipake buat jalanin tugas yang harus selesai, kayak batch processing) berdasarkan jadwal waktu. Jadwalnya diatur pake format Cron, jadi lo bisa sefleksibel mungkin buat nentuin kapan job-nya harus jalan.

CronJobs bisa dipake buat jalanin tugas pemeliharaan rutin, backup, kirim notifikasi, pemrosesan data, dan lain-lain. Intinya, tugas apapun yang perlu lo jalanin secara teratur bisa dikemas dalam bentuk Docker container dan dijalanin sebagai CronJob di Kubernetes.

Kapan Harus Pake CronJobs

  1. Tugas Terjadwal Rutin: CronJobs paling cocok buat job yang harus jalan secara teratur dan bisa diprediksi. CronJobs bisa mulai dari tugas pemeliharaan sistem kayak pembersihan dan backup sampai tugas pemrosesan data yang perlu dijalankan pas trafik lagi sepi.

Contoh: Misalnya lo punya situs e-commerce dan pengen bikin laporan semua transaksi di akhir hari pas trafik lagi sepi. Lo bisa pake CronJob buat jadwalin job pelaporan ini biar jalan tiap malam setiap hari.

  1. Polling: Kalo lo perlu ngecek layanan eksternal secara berkala buat update, CronJobs bisa jadi pilihan bagus.

Contoh: Di arsitektur microservices, kalo ada layanan yang perlu verifikasi status endpoint API jarak jauh secara periodik, lo bisa ngatur CronJob buat nge-hit endpoint itu di interval tetap.

  1. Notifikasi dan Pengingat: Kalo lo perlu kirim notifikasi atau pengingat di waktu tertentu tiap hari atau minggu, lo bisa pake CronJobs buat jadwalin tugas-tugas ini.

Contoh: Kalo lo punya layanan yang ngirim newsletter mingguan ke pengguna, lo bisa ngatur CronJob buat jalanin layanan ini tiap minggu di waktu yang udah ditentuin.

Kapan Nggak Pake CronJobs

  1. Pekerjaan Singkat dan Sering Dilakukan: Kubernetes punya overhead buat ngejadwalin dan ngejalanin job, jadi kalo lo punya job yang harus banget sering dijalanin (kayak setiap beberapa detik), kayaknya CronJob bukan pilihan terbaik. Layanan yang jalan terus-menerus dan ngatur timing internalnya sendiri bisa lebih cocok di kasus ini.
  2. Pekerjaan Non-Periodik dan Trigger-based: Kalo job lo harus jalan berdasarkan event atau trigger tertentu (misalnya ada file baru di folder atau pesan masuk di antrian), CronJobs kayaknya nggak cocok. Arsitektur berbasis event atau workflow lebih pas buat situasi ini.
  3. Pekerjaan Jangka Panjang atau Berkelanjutan: CronJobs itu diciptain buat job yang punya akhir yang jelas. Buat tugas yang jalan lama atau terus-menerus tanpa akhir yang jelas, kayak server web, CronJobs nggak cocok. Buat kasus kayak gini, lo bisa pake resource Kubernetes lain kayak Deployments atau StatefulSets.
  4. Jobs dengan Dependensi Kompleks: Kalo lo punya job dengan dependensi kompleks, kayak satu job harus selesai sebelum job lain dimulai, hubungan ini agak susah diekspresiin pake sintaks Cron, lo mungkin butuh sistem manajemen workflow yang lebih canggih. Alat kayak Apache Airflow atau Argo didesain buat tipe workflow kayak gini.

Inget, ya, pake CronJobs (atau teknologi lain) selalu tergantung sama kebutuhan spesifik aplikasi dan infrastruktur lo. Jadi, lo harus paham detailnya sebelum pake apa pun buat dipake.

Contoh CronJob Manifest

Coba lihat contoh manifest CronJob yang simpel ini:

---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: example-cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: example-container
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

Nih, penjelasan tiap bagian dari manifest CronJob:

  • apiVersion: Ini nge-definisiin versi API Kubernetes yang dipake buat bikin objek ini. batch/v1beta1 itu versi API yang sekarang dipake buat nge-definisiin CronJobs.
  • kind: Ini jenis resource Kubernetes yang mau kita bikin. Dalam kasus ini, jenisnya adalah CronJob.
  • metadata: Bagian ini dipake buat ngasih nama CronJob kita dan bisa juga include metadata lain kayak label dan anotasi.
  • spec: Bagian ini dipake buat nge-definisiin perilaku CronJob kita.

schedule: Di sini kita pake sintaks cron buat nentuin kapan job harus jalan. Dalam kasus ini, "*/1 * * * *" berarti job bakal jalan setiap menit.

jobTemplate: CronJob bikin resource Job, dan ini tuh template buat Job tersebut. `spec` di bawah jobTemplate jelasin gimana job itu jalan.

  • spec.template: Ini tuh template pod, yang ngegambarin state yang lo mau buat pod yang dibuat sama job ini.

spec.containers: Ini tuh array container yang bakal jalan di dalam pod. Dalam kasus ini, kita cuma punya satu container.

name: Ini nama yang dikasih ke container.

image: Docker image yang dipake buat bikin container ini. Dalam kasus ini, imagenya `busybox`, sistem operasi minimal mirip Unix.

args: Ini tuh argumen yang dikasih ke container pas runtime. Di sini kita kasih perintah shell buat nampilin tanggal dan pesan.

  • restartPolicy: Kebijakan restart buat semua container di dalam pod. Nilai yang mungkin itu Always, OnFailure, dan Never. Di sini, kalo container gagal karena alasan apapun, Kubernetes bakal coba restart.

Jadi, manifest ini ngegambarin sebuah CronJob yang jalan tiap menit, ngejalanin container busybox yang nampilin tanggal dan pesan, dan bakal di-restart Kubernetes kalo gagal.

Terus inget ya, isi spesifik dari spec bakal tergantung sama kebutuhan khusus job lo. Contoh di atas itu cukup simpel, dan job di dunia nyata mungkin punya spesifikasi container yang lebih kompleks, beberapa container, atau elemen tambahan kayak volumes.

Pengenalan tentang Jobs

Jobs di Kubernetes itu jenis controller yang dipake buat manajemen tugas yang lo mau sampe bener-bener selesai. Beda sama Pods atau Deployments yang dirancang buat jalan terus-menerus, Jobs itu dirancang buat jalan sampe selesai. Jadi, Jobs cocok banget buat tugas yang perlu jalan sekali atau beberapa kali, tapi bukan yang terus-menerus.

Use Case buat Kubernetes Jobs

Kubernetes Jobs bener-bener berguna buat jalanin tugas yang diharapkan selesai begitu kerjanya beres. Ini beberapa contohnya:

  • Batch Processing: Jobs cocok banget buat tugas batch processing. Misalnya, kalo lo perlu proses dataset besar, lo bisa bikin Job buat ngurus sebagian data. Terus, lo bisa bikin beberapa Job buat memproses seluruh dataset secara paralel.
  • Tugas Terjadwal: Meskipun buat tugas yang perlu dijalanin secara teratur, biasanya CronJob (yang bikin Jobs berdasarkan jadwal) lebih cocok, Job bisa dipake bareng mekanisme penjadwalan eksternal.
  • Pemeliharaan Sistem: Kalo ada case di mana lo perlu jalanin tugas pemeliharaan sistem kayak migrasi database, bersihin log atau data lama, atau ngambil backup Jobs bisa jadi pilihan bagus buat tugas-tugas ini, soalnya mereka bakal jalan sampe selesai dan berhenti kalo udah selesai.

CronJobs dan Jobs

Job di Kubernetes itu controller yang dirancang buat jalanin tugas sampe bener-bener selesai. Kalo sejumlah tugas yang ditentuin udah selesai, berarti Job-nya juga selesai. Intinya, Job bikin satu atau lebih Pod dan mastiin beberapa Pod itu bener-bener berhenti. Saat Pod selesai, Job ngelacak penyelesaian yang berhasil.

CronJob itu dasarnya Job yang punya jadwal. Controller CronJob di Kubernetes bikin Job sesuai jadwal berulang, kayak sekali setiap jam atau sekali sehari, dan lainnya.

Dinamain dari utilitas Unix 'cron' yang ngelakuin tugas yang sama. Jadi, CronJob ngatur Job berdasarkan jadwal waktu. Dia bikin objek Job, dan objek Job ini yang nge-spawn Pod buat ngejalanin tugas sebenarnya.

Gampangnya, Job jalan sampe selesai (sampe tugasnya beres), sementara CronJob itu penjadwal Job berbasis waktu, bikin Job sesuai jadwal. Keduanya dirancang buat nyelesain tugas, tapi CronJob lakuin ini berdasarkan jadwal, sedangkan Job ngelakuin ini sampe tugasnya selesai. Hubungannya adalah CronJob bikin resource Job, dan resource Job ini yang bener-bener ngejalanin tugas di Pod.

Job Manifests

Job di Kubernetes didefinisiin pake manifest, yaitu dokumen YAML yang ngegambarin state yang lo mau buat objek Kubernetes. Ini contoh dasar dari manifest Job:

---
apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    spec:
      containers:
      - name: example-container
        image: busybox
        command: ["echo", "Hello from Kubernetes Job"]
      restartPolicy: Never

Yuk kita bahas bagian-bagian manifest ini:

  • apiVersion: Ini nge-definisiin versi API Kubernetes yang dipake buat bikin objek ini. batch/v1 itu versi API yang saat ini dipake buat nge-definisiin Jobs.
  • kind: Ini jenis resource Kubernetes yang mau kita bikin. Dalam kasus ini, jenisnya adalah Job.
  • metadata: Bagian ini dipake buat ngasih nama Job kita dan bisa juga include metadata lain kayak label dan anotasi.
  • spec: Ini tuh spesifikasi dari Job kita.

spec.template: Template yang bakal dipake buat bikin pod yang di-manage sama job ini. Tipe-nya PodTemplateSpec dan strukturnya sama kayak spesifikasi pod.

spec.containers: Ini tuh array container yang bakal berjalan di dalam pod. Dalam kasus ini, kita cuma punya satu container.

name: Ini nama yang dikasih ke container.

image: Docker image yang dipake buat bikin container ini. Dalam kasus ini, imagenya busybox, sistem operasi minimal mirip Unix.

command: Perintah yang bakal dijalanin pas container mulai. Di sini kita cuma nge-echo string sederhana.

restartPolicy: Ini tuh kebijakan restart buat semua container di dalam pod. Buat Jobs, nilai yang diizinkan itu OnFailure dan Never. Di sini, kalo container gagal karena alasan apapun, Kubernetes nggak bakal coba restart.

Jadi, manifest ini ngegambarin Job yang namanya `example-job`, yang ngejalanin container `busybox` buat nampilin pesan sederhana, dan nggak bakal di-restart kalo gagal.

Ada banyak yang menarik dari kubernetes, misalnya statefulset.

Yuk cari tahu!

Read more