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.completionsPod yang berhasil diselesaikan.
- Completion Mode: Job dianggap selesai ketika ada sebanyak
- Indexed Parallel Jobs: Menyediakan pengidentifikasi unik (
JOB_COMPLETION_INDEXdi 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: manualApply 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> 18dCreate 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: NeverapiVersion: batch/v1: Memberi tahu Kubernetes untuk menggunakan APIbatch/v1, yang mengelola Job.kind: Job: Tipe resource.metadata.name: Memberi nama Jobpostgres-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 PostgreSQLv17resmi, yang sudah termasuk utilitaspg_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_dumpdengan host yang mengarah ke service postgres kita dan database namemydb. - Script akan menggunakan
PGUSERdanPGPASSWORDyang 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 14sKita 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
- https://kubernetes.io/docs/concepts/workloads/controllers/job/
- https://kubernetes.io/docs/concepts/workloads/controllers/ttlafterfinished/
- https://www.postgresql.org/docs/current/app-pgdump.html
Last updated on