Skip to content

Commit 7a4d1c5

Browse files
authored
Merge pull request #20472 from mufti1/id-cronjob-task
ID /docs/tasks/job/automated-tasks-with-cron-jobs/
2 parents fd6ba2c + d33071d commit 7a4d1c5

File tree

2 files changed

+232
-0
lines changed

2 files changed

+232
-0
lines changed
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
---
2+
title: Menjalankan Tugas-Tugas Otomatis dengan CronJob
3+
min-kubernetes-server-version: v1.8
4+
content_template: templates/task
5+
weight: 10
6+
---
7+
8+
{{% capture overview %}}
9+
10+
Kamu dapat menggunakan {{< glossary_tooltip text="CronJob" term_id="cronjob" >}} untuk menjalankan {{< glossary_tooltip text="Job" term_id="job" >}} yang dijadwalkan berbasis waktu. Job akan berjalan seperti pekerjaan-pekerjaan [Cron](https://en.wikipedia.org/wiki/Cron) di Linux atau sistem UNIX.
11+
12+
CronJob sangat berguna untuk membuat pekerjaan yang berjalan secara periodik dan berulang, misalnya menjalankan (_backup_) atau mengirim email.
13+
CronJob juga dapat menjalankan pekerjaan individu pada waktu tertentu, misalnya jika kamu ingin menjadwalkan sebuah pekerjaan dengan periode aktivitas yang rendah.
14+
15+
CronJob memiliki keterbatasan dan kekhasan.
16+
Misalnya, dalam keadaan tertentu, sebuah CronJob dapat membuat banyak Job.
17+
Karena itu, Job haruslah _idempotent._
18+
19+
Untuk informasi lanjut mengenai keterbatasan, lihat [CronJob](/docs/concepts/workloads/controllers/cron-jobs).
20+
21+
{{% /capture %}}
22+
23+
{{% capture prerequisites %}}
24+
25+
* {{< include "task-tutorial-prereqs.md" >}}
26+
27+
{{% /capture %}}
28+
29+
{{% capture steps %}}
30+
31+
## Membuat Sebuah CronJob
32+
33+
CronJob membutuhkan sebuah berkas konfigurasi.
34+
Ini adalah contoh dari berkas konfigurasi CronJob `.spec` yang akan mencetak waktu sekarang dan pesan "hello" setiap menit:
35+
36+
{{< codenew file="application/job/cronjob.yaml" >}}
37+
38+
Jalankan contoh CronJob menggunakan perintah berikut:
39+
40+
```shell
41+
kubectl create -f https://k8s.io/examples/application/job/cronjob.yaml
42+
```
43+
Keluaran akan mirip dengan ini:
44+
45+
```
46+
cronjob.batch/hello created
47+
```
48+
49+
Kamu juga dapat menggunakan `kubectl run` untuk membuat sebuah CronJob tanpa menulis sebuah konfigurasi yang lengkap:
50+
51+
```shell
52+
kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
53+
```
54+
55+
Setelah membuat sebuah CronJob, untuk mengecek statusnya kamu dapat menggunakan perintah berikut:
56+
57+
```shell
58+
kubectl get cronjob hello
59+
```
60+
Keluaran akan mirip dengan ini:
61+
62+
```
63+
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
64+
hello */1 * * * * False 0 <none> 10s
65+
```
66+
67+
Seperti yang kamu lihat dari hasil perintah di atas, CronJob belum menjadwalkan atau menjalankan pekerjaan apa pun.
68+
Waktu yang biasanya dibutuhkan untuk mengamati Job hingga Job tersebut dibuat akan membutuhkan sekitar satu menit:
69+
70+
```shell
71+
kubectl get jobs --watch
72+
```
73+
74+
Keluaran akan mirip dengan ini:
75+
76+
```
77+
NAME COMPLETIONS DURATION AGE
78+
hello-4111706356 0/1 0s
79+
hello-4111706356 0/1 0s 0s
80+
hello-4111706356 1/1 5s 5s
81+
```
82+
83+
Sekarang kamu telah melihat satu Job berjalan yang dijadwalkan oleh "hello" CronJob.
84+
Kamu dapat berhenti mengamati Job dan melihat CronJob lagi untuk melihat CronJob menjadwalkan sebuah Job:
85+
86+
```shell
87+
kubectl get cronjob hello
88+
```
89+
Keluaran akan mirip dengan ini:
90+
91+
```
92+
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
93+
hello */1 * * * * False 0 50s 75s
94+
```
95+
96+
Kamu dapat melihat bahwa CronJob `hello` berhasil menjadwalkan sebuah Job pada waktu yang ditentukan dalam `LAST SCHEDULE`. Saat ini ada 0 Job yang aktif, berarti sebuah Job telah selesai atau gagal.
97+
98+
Sekarang, temukan Pod yang dibuat oleh jadwal Job terakhir dan melihat keluaran bawaan dari salah satu Pod.
99+
100+
{{< note >}}
101+
Nama Job dan nama Pod itu berbeda.
102+
{{< /note >}}
103+
104+
```shell
105+
# Ganti "hello-4111706356" dengan nama Job di sistem kamu
106+
pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items[*].metadata.name})
107+
```
108+
Menampilkan log sebuah Pod:
109+
110+
```shell
111+
kubectl logs $pods
112+
```
113+
Keluaran akan mirip dengan ini:
114+
115+
```
116+
Fri Feb 22 11:02:09 UTC 2019
117+
Hello from the Kubernetes cluster
118+
```
119+
120+
## Menghapus sebuah CronJob
121+
122+
Ketika kamu tidak membutuhkan sebuah CronJob lagi, kamu dapat megnhapusnya dengan perintah `kubectl delete cronjob <cronjob name>`:
123+
124+
```shell
125+
kubectl delete cronjob hello
126+
```
127+
128+
Menghapus CronJob akan menghapus semua Job dan Pod yang telah terbuat dan menghentikanya dari pembuatan Job tambahan.
129+
Kamu dapat membaca lebih lanjut tentang menghapus Job di [_garbage collection_](/docs/concepts/workloads/controllers/garbage-collection/).
130+
131+
## Menulis Speifikasi Sebuah Cron
132+
133+
Seperti semua konfigurasi Kubernetes, sebuah CronJob membutuhkan _field_ `apiVersion`, `kind`, dan `metadata`. Untuk informasi
134+
umum tentang bekerja dengan berkas konfigurasi, lihat dokumentasi [men-_deploy_ aplikasi](/docs/user-guide/deploying-applications),
135+
dan [mengunakan kubectl untuk manajemen sumber daya](/docs/user-guide/working-with-resources).
136+
137+
Sebuah konfigurasi CronJob juga membutuhkan sebuah [bagian `.spec`](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status).
138+
139+
{{< note >}}
140+
Semua modifikasi pada sebuah CronJob, terutama `.spec`, akan diterapkan pada proses berikut.
141+
{{< /note >}}
142+
143+
### Penjadwalan
144+
145+
`.spec.schedule` adalah _field_ yang wajib diisi dari sebuah `.spec`
146+
Dibutuhkan sebuah format string [Cron](https://en.wikipedia.org/wiki/Cron), misalnya `0 * * * *` atau `@hourly`, sebagai jadwal Job untuk dibuat dan dieksekusi.
147+
148+
Format ini juga mencakup nilai langkah `Vixie cron`. Seperti penjelasan di [FreeBSD manual](https://www.freebsd.org/cgi/man.cgi?crontab%285%29):
149+
150+
> Nilai langkah dapat digunakan bersama dengan rentang. Sebuah rentang diikuti dengan
151+
> `/<number>` menentukan lompatan angka melalui rentang.
152+
> Misalnya, `0-23/2` dapat digunakan dalam jam untuk menentukan
153+
> perintah akan dieksekusi setiap jam (alternatif dalam bawaan v7 adalah
154+
> `0,2,4,6,8,10,12,14,16,18,20,22`). Langkah-langkah juga diizinkan setelah
155+
> tanda bintang, jadi jika kamu menginginkan "setiap dua jam", gunakan saja `*/2`.
156+
157+
{{< note >}}
158+
Sebuah tanda tanya (`?`) dalam penjadwalan memiliki makna yang sama dengan tanda bintang `*`, yaitu, singkatan dari nilai apa pun yang tersedia untuk _field_ tertentu.
159+
{{< /note >}}
160+
161+
### Templat Job
162+
163+
`.spec.JobTemplate` adalah templat untuk sebuah Job, dan itu wajib.
164+
Templat Job memiliki skema yang sama dengan [Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/), kecuali jika bersarang dan tidak memiliki sebuah `apiVersion` atau `kind`.
165+
Untuk informasi lebih lanjut tentang menulis sebuah Job `.spec` lihat [Menulis spesifikasi Job](/docs/concepts/workloads/controllers/jobs-run-to-completion/#writing-a-job-spec).
166+
167+
### _Starting Deadline_
168+
169+
_Field_ `.spec.startingDeadlineSeconds` adalah _field_ opsional.
170+
_Field_ tersebut berarti batas waktu dalam satuan detik untuk memulai sebuah Job jika Job melewatkan waktu yang telah dijadwalkan karena alasan apapun.
171+
Setelah mencapai batas waktu, CronJob tidak akan memulai sebuah Job.
172+
Job yang tidak memenuhi batas waktu, dengan cara ini dianggap sebagai Job yang gagal.
173+
Jika _field_ ini tidak ditentukan, maka Job tidak memiliki batas waktu.
174+
175+
_Controller_ CronJob menghitung berapa banyak jadwal yang terlewat untuk sebuah CronJob. jika lebih dari 100 jadwal yang terlewat, maka tidak ada lagi CronJob yang akan dijadwalkan. Ketika `.spec.startingDeadlineSeconds` tidak disetel, CronJob Controller menghitung jadwal yang terlewat dari `status.lastScheduleTime` hingga sekarang.
176+
177+
Misalnya, sebuah CronJob seharusnya berjalan setiap menit, `status.lastScheduleTime` CronJob adalah pukul 5:00am, tetapi sekarang pukul 07:00am. Itu berarti ada 120 jadwal yang terlewat, maka tidak ada lagi CronJob yang akan dijadwalkan.
178+
179+
Jika _field_ `.spec.startingDeadlineSeconds` disetel (tidak kosong), CronJob Controller akah menghitung berapa banyak Job yang terlewat dari nilai `.spec.startingDeadlineSeconds` hingga sekarang.
180+
181+
Misalnya, jika disetel ke `200`, CronJob Controller akan menghitung jadwal yang terlewat dalam 200 detik terakhir. Pada kasus ini, jika terdapat lebih dari 100 jadwal yang terlewat dalam 200 detik terakhir, maka tidak ada lagi CronJob yang akan dijadwalkan.
182+
183+
### Kebijakan _Concurrency_
184+
185+
_Field_ `.spec.concurrencyPolicy` juga opsional.
186+
_Field_ tersebut menentukan bagaimana memperlakukan eksekusi _concurrent_ dari sebuah Job yang dibuat oleh CronJob.
187+
Kamu dapat menetapkan hanya satu dari kebijakan _concurrency_:
188+
189+
* `Allow` (bawaan): CronJob mengizinkan Job berjalan secara _concurrent_
190+
* `Forbid` : Job tidak mengizinkan Job berjalan secara _concurrent_; jika sudah saatnya untuk menjalankan Job baru dan Job sebelumnya belum selesai, maka CronJob akan melewatkan Job baru yang akan berjalan
191+
* `Replace`: Jika sudah saatnya untuk menjalankan Job baru dan Job sebelumnya belum selesai, maka CronJob akan mengganti Job yang sedang berjalan dengan Job baru.
192+
193+
Perhatikan bahwa kebijakan _concurrency_ hanya berlaku untuk Job yang dibuat dengan CronJob yang sama.
194+
Jika terdapat banyak CronJob, Job akan selalu diizinkan untuk berjalan secara _concurrent_.
195+
196+
### Penangguhan
197+
198+
_Field_ `.spec.suspend` juga opsional.
199+
Jika _field_ tersebut disetel `true`, semua eksekusi selanjutnya akan ditangguhkan.
200+
Konfigurasi ini tidak dapat berlaku untuk eksekusi yang sudah dimulai.
201+
Secara bawaan _false_.
202+
203+
{{< caution >}}
204+
Eksekusi yang ditangguhkan selama waktu yang dijadwalkan dihitung sebagai Job yang terlewat.
205+
Ketika `.spec.suspend` diubah dari `true` ke `false` pada CronJob yang memiliki konfigurasi tanpa [batas waktu](#starting-deadline), Job yang terlewat akan dijadwalkan segera.
206+
{{< /caution >}}
207+
208+
### Batas Riwayat Pekerjaan
209+
210+
_Field_ `.spec.successfulJobHistoryLimit` dan `.spec.failedJobHistoryLimit` juga opsional.
211+
_Field_ tersebut menentukan berapa banyak Job yang sudah selesai dan gagal yang harus disimpan.
212+
Secara bawaan, masing-masing _field_ tersebut disetel 3 dan 1. Mensetel batas ke `0` untuk menjaga tidak ada Job yang sesuai setelah Job tersebut selesai.
213+
214+
{{% /capture %}}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: batch/v1beta1
2+
kind: CronJob
3+
metadata:
4+
name: hello
5+
spec:
6+
schedule: "*/1 * * * *"
7+
jobTemplate:
8+
spec:
9+
template:
10+
spec:
11+
containers:
12+
- name: hello
13+
image: busybox
14+
args:
15+
- /bin/sh
16+
- -c
17+
- date; echo Hello from the Kubernetes cluster
18+
restartPolicy: OnFailure

0 commit comments

Comments
 (0)