Portal/Notes πŸ“
Cka

Job

Versi Bahasa Indonesia. Baca dalam Bahasa Inggris

Job merepresentasikan tugas satu kali (one-off) yang berjalan hingga selesai dan kemudian berhenti.

Job di Kubernetes adalah resource workload yang digunakan untuk menjalankan tugas hingga selesai. Tidak seperti Deployment atau StatefulSet, yang dirancang untuk aplikasi yang berjalan lama (long-running), Job digunakan untuk tugas satu kali atau batch yang perlu dimulai, berjalan, dan selesai dengan sukses.

  • Task Completion -> Memastikan tugas tertentu berjalan dan selesai dengan sukses.
  • Pod Management -> Membuat dan mengelola Pod hingga berhasil diselesaikan.
  • Retry Mechanism -> Jika sebuah Pod gagal, Job secara otomatis mencoba ulang berdasarkan kebijakan yang ditentukan.
  • Parallel Execution -> Mendukung tugas paralel menggunakan beberapa Pod.

Types

  • Single Job (Default): Menjalankan satu Pod hingga selesai. Ideal untuk tugas instance tunggal yang sederhana.
  • Parallel Jobs: Menjalankan beberapa Pod secara paralel untuk mempercepat tugas besar.
    • Completion Mode: Job dianggap selesai ketika ada sebanyak .spec.completions Pod yang berhasil diselesaikan.
  • Indexed Parallel Jobs: Menyediakan pengidentifikasi unik (JOB_COMPLETION_INDEX di environment variables) untuk setiap pod β€” berguna untuk partisi tugas.

Job to Backup Database

Mari buat job yang melakukan backup database PostgreSQL kita. Kamu seharusnya sudah memiliki service database PostgreSQL yang berjalan di cluster kamu. Jika belum, kamu bisa mengikuti instruksi di sini: Persistent Volume.

Create PV and PVC

Pertama mari buat Persistent Volume (PV) dan Persistent Volume Claim (PVC) untuk menyimpan data backup. Di sini saya letakkan keduanya dalam satu file bernama postgres-backup-pv-pvc.yaml.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-backup-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: /mnt/data/postgres-backup

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-backup-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: manual

Apply file yaml tersebut dan validasi, kita akan melihat PV dan PVC yang baru saja kita buat.

➜ kubectl apply -f postgres-backup-pv-pvc.yaml
persistentvolume/postgres-backup-pv created
persistentvolumeclaim/postgres-backup-pvc created
➜ kubectl get pv                              
NAME                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
postgres-backup-pv   1Gi        RWO            Retain           Bound    default/postgres-backup-pvc   manual         <unset>                          3s
postgres-pv          1Gi        RWO            Retain           Bound    default/postgres-pvc          manual         <unset>                          18d
➜ kubectl get pvc
NAME                  STATUS   VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
postgres-backup-pvc   Bound    postgres-backup-pv   1Gi        RWO            manual         <unset>                 87s
postgres-pvc          Bound    postgres-pv          1Gi        RWO            manual         <unset>                 18d

Create Job to Dump Database

Sekarang mari buat job untuk menjalankan perintah pg_dump. Perintah ini digunakan untuk membuat backup yang konsisten bahkan ketika database sedang digunakan secara bersamaan.

Kita akan menggunakan image postgres karena image ini sudah memiliki pg_dump terpasang. Jadi kita tidak perlu menginstalnya secara manual setiap kali job ini berjalan. Kita akan menggunakan kredensial yang tersedia di secrets kita. Jika service postgres kamu belum menggunakan secrets, kamu bisa mengikuti instruksi ini: Secret.

Mari buat file bernama postgres-backup-job.yaml dan masukkan definisi di bawah ini.

apiVersion: batch/v1
kind: Job
metadata:
  name: postgres-backup
spec:
  template:
    spec:
      containers:
      - name: postgres-backup
        image: postgres:17
        command: ["/bin/sh", "-c"]
        args:
        - |
          echo "Starting PostgreSQL backup..."
          pg_dump -h postgres.default.svc.cluster.local -d mydb > /backup/postgres_backup_$(date +%Y%m%d%H%M%S).sql
          echo "Backup completed!"
        env:
        - name: PGUSER
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: POSTGRES_USER
        - name: PGPASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: POSTGRES_PASSWORD
        volumeMounts:
        - mountPath: /backup
          name: backup-storage
      volumes:
      - name: backup-storage
        persistentVolumeClaim:
          claimName: postgres-backup-pvc
      restartPolicy: Never
  • apiVersion: batch/v1: Memberi tahu Kubernetes untuk menggunakan API batch/v1, yang mengelola Job.
  • kind: Job: Tipe resource.
  • metadata.name: Memberi nama Job postgres-backup.
  • spec: Mendefinisikan spesifikasi job.
  • template.spec: Spesifikasi Pod (seperti cetak biru untuk Pod yang akan dibuat oleh Job).
    • containers: Mendefinisikan daftar container di dalam pod.
    • name: postgres-backup: Nama container ini.
    • image: postgres:17: Menggunakan image Docker PostgreSQL v17 resmi, yang sudah termasuk utilitas pg_dump.
    • command: Mengganti entrypoint default container.
      • ["/bin/sh", "-c"]: Menjalankan shell (sh) untuk mengeksekusi script multi-baris.
    • args: Mendefinisikan script yang akan dijalankan di dalam container.

Backup Script:

echo "Starting PostgreSQL backup..."
pg_dump -h postgres.default.svc.cluster.local -d mydb > /backup/postgres_backup_$(date +%Y%m%d%H%M%S).sql
echo "Backup completed!"
  • Script ini akan menjalankan pg_dump dengan host yang mengarah ke service postgres kita dan database name mydb.
  • Script akan menggunakan PGUSER dan PGPASSWORD yang disediakan di environment variables.
  • /backup/postgres_backup_$(date +%Y%m%d%H%M%S).sql: Menyimpan backup ke file dengan timestamp di direktori /backup (untuk nama yang unik).

Mari apply file ini menggunakan kubectl apply dan kamu akan melihat job dengan status Running atau bahkan sudah Complete.

➜ kubectl apply -f postgres-backup-job.yaml
job.batch/postgres-backup created
➜ kubectl get jobs
NAME              STATUS     COMPLETIONS   DURATION   AGE
postgres-backup   Complete   1/1           3s         14s

Kita bisa mengecek log untuk memastikan bahwa script berjalan dengan baik menggunakan perintah kubectl logs.

➜ kubectl logs jobs/postgres-backup        
Starting PostgreSQL backup...
Backup completed!

Check Persistent Volume in Minikube

Di minikube kita bisa dengan mudah mengecek isi Persistent Volume menggunakan minikube ssh untuk memastikan bahwa script backup kita berjalan dengan benar.

minikube ssh
docker@minikube:~$ cd /mnt/data/postgres-backup
docker@minikube:/mnt/data/postgres-backup$  ls
postgres_backup_20250227101839.sql  postgres_backup_20250227104217.sql
docker@minikube:/mnt/data/postgres-backup$ more postgres_backup_20250227101839.sql     
--
-- PostgreSQL database dump
--

-- Dumped from database version 15.10 (Debian 15.10-1.pgdg120+1)
-- Dumped by pg_dump version 16.8 (Debian 16.8-1.pgdg120+1)
...

Automatic Cleanup for Finished Jobs

Ketika Job kamu selesai, Kubernetes tidak akan menghapus job tersebut. Ini berguna untuk menyimpan Job agar kita bisa tahu apakah Job berhasil atau gagal.

Tapi setelah beberapa waktu, kita mungkin ingin membersihkan job tersebut. Kubernetes menyediakan cara untuk melakukan ini menggunakan .spec.ttlSecondsAfterFinished. Tentukan field ini di manifest/konfigurasi Job, sehingga Job dapat dibersihkan secara otomatis beberapa waktu setelah selesai.

Mari coba tambahkan konfigurasi TTL ke job postgres-backup kita. Edit file yaml, masukkan perubahan ini di bawah (kita set TTL ke 60).

...
spec:
  ttlSecondsAfterFinished: 60
...

Dengan konfigurasi ini, job akan dihapus 1 menit setelah selesai. Apply ulang konfigurasinya, dan setelah itu job postgres-backup akan hilang dari daftar job.

➜ kubectl apply -f postgres-backup-job.yaml
job.batch/postgres-backup configured
➜ kubectl get jobs                         
No resources found in default namespace.

References


Edit on GitHub

Last updated on

Job | Faisal Affan