CronJobs


CronJobs tersedia secara umum di Google Kubernetes Engine (GKE) versi 1.21 dan yang lebih baru. Dokumen ini menjelaskan cara menjalankan CronJobs di GKE. CronJobs merupakan fitur bawaan Kubernetes. Untuk mengetahui detail selengkapnya, baca dokumentasi Kubernetes tentang CronJobs.

Ringkasan

CronJobs membuat Tugas Kubernetes dengan jadwal yang berulang. Dengan CronJobs, Anda dapat mengotomatiskan tugas rutin, seperti membuat pencadangan, membuat laporan, mengirim email, atau tugas pembersihan.

CronJobs dibuat, dikelola, diskalakan, dan dihapus dengan cara yang sama seperti Tugas. Jumlah objek Tugas secara pasti yang dibuat bergantung pada beberapa faktor. Untuk informasi selengkapnya, lihat Batasan CronJob.

Untuk mengetahui informasi Tugas selengkapnya, lihat Menjalankan Tugas.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Membuat CronJob

Anda dapat membuat CronJob menggunakan file manifes. Misalnya, manifes YAML berikut mencetak waktu saat ini dan string satu kali setiap menit sembari tetap mempertahankan nilai default untuk parameter CronJob:

# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Allow
  startingDeadlineSeconds: 100
  suspend: false
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello, World!"
          restartPolicy: OnFailure

Untuk membuat CronJob ini, simpan manifes YAML ke file lalu terapkan ke cluster:

kubectl apply -f PATH_TO_FILE

Ganti PATH_TO_FILE dengan jalur ke manifes YAML.

Mengonfigurasi CronJob

Anda dapat menentukan parameter berikut saat membuat CronJob:

Menentukan waktu eksekusi CronJob

Kolom spec.schedule menentukan waktu dan frekuensi eksekusi CronJob menggunakan format crontab standar Unix. Semua waktu CronJob menggunakan zona waktu UTC. Ada lima kolom yang dipisahkan oleh spasi. Kolom ini mewakili unit berikut:

  1. Menit (antara 0 dan 59)
  2. Jam (antara 0 dan 23)
  3. Hari dalam sebulan (antara 1 dan 31)
  4. Bulan (antara 1 dan 12)
  5. Hari dalam seminggu (antara 0 dan 6 mulai hari Minggu)

Anda dapat menggunakan karakter khusus berikut di salah satu kolom spec.schedule:

  • ? adalah nilai karakter pengganti yang cocok dengan satu karakter.
  • * adalah nilai karakter pengganti yang cocok dengan nol atau beberapa karakter.
  • / memungkinkan Anda menentukan interval untuk suatu kolom. Misalnya, jika kolom pertama (kolom menit) memiliki nilai */5, artinya "setiap 5 menit". Jika kolom kelima (kolom hari dalam seminggu) ditetapkan ke 0/5, artinya "setiap hari Minggu kelima".

Menentukan apa yang dijalankan CronJob

spec.jobTemplate menjelaskan fungsi CronJob, seperti image container-nya, perintah yang dijalankan container, dan kebijakan mulai ulang untuk CronJob. Untuk mengetahui detail selengkapnya tentang apa saja yang harus disertakan dalam spec.jobTemplate, lihat dokumentasi Kubernetes CronJob.

Menentukan tenggat waktu

Kolom startingDeadlineSeconds opsional menunjukkan jumlah detik maksimum yang diperlukan CronJob untuk memulai jika melewatkan waktu yang dijadwalkan karena alasan apa pun. CronJobs yang terlewat dianggap gagal.

Untuk menentukan batas waktu, tambahkan nilai startingDeadlineSeconds ke kolom spec CronJob dalam file manifes. Misalnya, manifes berikut menetapkan bahwa CronJob memiliki waktu 100 detik untuk memulai:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  jobTemplate:
    spec:
    ...

Menentukan kebijakan serentak

Kolom spec.concurrencyPolicy opsional menentukan cara menangani eksekusi serentak Tugas yang dibuat oleh pengontrol CronJob. Jika Anda tidak menetapkan nilai, beberapa Tugas serentak akan diizinkan secara default.

concurrencyPolicy menerima nilai berikut:

Nilai Arti
Allow Tugas Serentak diizinkan. Ini adalah setelan default-nya.
Forbid Tugas Serentak dilarang, dan Tugas baru tidak dapat dimulai hingga Tugas sebelumnya selesai atau waktu habis.
Replace Tugas Serentak dilarang, dan Tugas lama dibatalkan dan diganti dengan Tugas baru.

Menangguhkan eksekusi berikutnya

Kolom spec.suspend opsional, jika ditetapkan ke true, akan mencegah Tugas baru dijalankan, tetapi memungkinkan eksekusi saat ini selesai.

Menentukan batas histori

CronJob membuat Pod setiap kali dijalankan. Informasi melihat status penghentian eksekusi terbaru CronJob dan log setiap Pod dibahas dalam Melihat histori CronJob.

Anda dapat mengonfigurasi jumlah eksekusi CronJob yang berhasil dan gagal yang disimpan dengan menentukan nilai spec.successfulJobsHistoryLimit dan spec.failedJobsHistoryLimit. Secara default, successfulJobsHistoryLimit ditetapkan ke 3 dan failedJobsHistoryLimit ditetapkan ke 1.

Misalnya, manifes berikut memerintahkan GKE untuk menyimpan maksimum lima eksekusi CronJob yang berhasil dan maksimum 10 eksekusi CronJob yang gagal:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

Anda dapat menonaktifkan retensi histori eksekusi CronJob yang berhasil atau gagal dengan menetapkan nilai masing-masing ke 0. Menonaktifkan retensi histori dapat makin mempersulit kegagalan proses debug. Misalnya, manifes berikut memerintahkan GKE untuk hanya menyimpan eksekusi CronJob yang gagal:

kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 100
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
    ...

Memeriksa CronJob

Untuk memeriksa konfigurasi CronJob, gunakan kubectl describe:

kubectl describe cronjob CRONJOB_NAME

Ganti CRONJOB_NAME dengan nama CronJob yang akan diperiksa.

Melihat histori CronJob

CronJob berjalan di dalam Pod. Secara default, Kubernetes menyimpan log untuk Pod yang dihentikan dan mewakili tiga peristiwa terakhir yang berhasil dijalankan dari CronJob dan Tugas terakhir yang gagal. Anda dapat mengubah atau menonaktifkan setelan default ini dengan mengubah batas histori CronJob.

Untuk melihat histori CronJob, buat daftar semua Pod terlebih dahulu. CronJobs yang sudah selesai ditampilkan dengan status Completed, dan Tugas yang gagal memiliki status RunContainerError, CrashLoopBackOff, atau status lain yang menunjukkan kegagalan.

NAME                                READY   STATUS              RESTARTS   AGE
hello-1556555640-9bc5r              0/1     Completed           0          3m6s
hello-1556555700-cm6wk              0/1     Completed           0          2m6s
hello-1556555760-62wf5              0/1     Completed           0          66s
hello-1556555820-rl8kl              0/1     Completed           0          5s
hello-failed-1556555820-wrvt2       0/1     RunContainerError   1          5s

Untuk melihat log CronJob tertentu, jalankan perintah berikut:

kubectl logs POD_NAME

Ganti POD_NAME dengan nama Pod yang ingin Anda periksa.

Output-nya mirip dengan hal berikut ini:

container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"

Menghapus CronJob

Untuk menghapus CronJob, jalankan perintah berikut:

kubectl delete cronjob CRONJOB_NAME

Saat Anda menghapus CronJob, pembersih sampah memori Kubernetes akan menghapus Tugas terkait dan mencegah Tugas baru dimulai.

Langkah berikutnya