## Chapter 6 : Workload Management
### 6.1 Daemon Set
Kita tahu, Saat menggunakan Replica Set atau Replication Controller, Pod akan dijalankan di Node secara random oleh si Kubernetes.
Ternyata, misal kita ingin menjalankan Pod di setiap Node yang ada di Kubernetes, dan tiap Pod hanya boleh jalan 1 di Node, kita bisa menggunakan Daemon Set. Secara default Daemon Set akan menjalankan Pod di setiap Node yang ada di Kubernetes Cluster, kecuali jika kita meminta hanya jalan di Node tertentu.
Kurang lebih untuk Daemon Set, seperti di bawah :

Daemon Set pada gamabr diatur untuk menjalankan 1 Pod di setiap Node.
Contoh kasus penggunaan Daemon Set :
- Aplikasi untuk monitoring Node
- Aplikasi untuk mengambil log di Node
- Dan sejenisnya
Untuk memuat Daemon Set bisa gunakan template ini :
6.1.1-template-daemonset.yaml
```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemon-set-name
labels:
label-key1: label-value1
annotations:
annotation-key1: annotation-value1
spec:
selector:
matchLabels:
label-key1: label-value1
matchExpressions:
- key: label-key1
operator: In
values:
- label-value1
template:
metadata:
name: pod-name
labels:
label-key1: label-value1
spec:
containers:
- name: container-name
image: image-name
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 0
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
```
Sebagai contoh dari template di atas kita coba di nginx :
6.1.2-nginx-daemonset.yaml
```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemon-nginx
labels:
name: daemon-nginx
spec:
selector:
matchLabels:
name: daemon-nginx
template:
metadata:
name: daemon-nginx
labels:
name: daemon-nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 0
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
```
Untuk perintahnya kurang lebih sama seperti sebelumnya :
- Membuat Daemon Set
```
$ kubectl create -f (filename.yaml)
```
- Melihat Semua Daemon Set
```
$ kubectl get daemonsets
```
- Menghapus Daemon Set
```
$ kubectl delete daemonsets (daemonsetname)
```
> *Untuk (filename.yaml), dan (daemonsetname) disesuaikan dengan penamaan file dan konfigurasi*
Disini akan dicoba untuk Daemon Set dengan perintah 6.1.2-nginx-daemonset.yaml :
```
$ kubectl create -f 6.1.2-nginx-daemonset.yaml
daemonset.apps/daemon-nginx created
$ kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemon-nginx 1 1 1 1 1 <none> 17s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
daemon-nginx-hzwlc 1/1 Running 0 30s
```
Mungkin tak berpengaruh untuk kasus 1 node saja, tetapi jika ternyata banyak node atau diartu banyak node kita akan melihat banyak Pod yang berjalan di setiap Node yang ada.
### 6.2 Job
Sebelumnya, kita telah belajar Pod, tetapi kalian sadar tidak? Pod yang kalian jalankan adalah Pod yang berjalan terus tanpa henti atau tidak akan berhenti jika ada kendala atau perintah.
Tapi nyatanya, kasus di Pod terkadang membutuhkan 1 kali run saja lalu berhenti. Nah untuk melakukan hal tersebut, cukup menggunakan Job.
Job adalah resource di Kubernetes yang digunakan untuk menjalankan Pod yang hanya butuh berjalan sekali, lalu berhenti.
Mungkin jika sadar, pada Replication Controller, Replica Set dan Daemon Set, jika Pod mati, maka secara otomatis Pod akan dijalankan ulang
Berbeda dengan Job. Pada Job justru Pod akan mati jika pekerjaannya selesai dilakukan.
Contoh Penggunaan Job :
- Aplikasi untuk backup atau restore database
- Aplikasi untuk import atau export data
- Aplikasi untuk menjalankan proses batch
- Dan sejenisnya
Untuk membuat Job bisa menggunakan konfigurasi file dengan template seperti di bawah :
6.2.1-template-job.yaml
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-name
labels:
label-key1: label-value1
annotations:
annotation-key1: annotation-value1
spec:
completions: 5
parallelism: 2
selector:
matchLabels:
abel-key1: label-value1
template:
metadata:
name: pod-name
labels:
label-key1: label-value1
spec:
restartPolicy: Never
containers:
- name: container-name
image: image-name
ports:
- containerPort: 80
```
Dan contohnya seperti ini :
6.2.2-nodejs-job.yaml
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: nodejs-job
spec:
completions: 4
parallelism: 2
template:
spec:
restartPolicy: Never
containers:
- name: nodejs-job
image: khannedy/nodejs-job
```
Perintah-perintah di Job kurang lebih juga sama seperti sebelumnya :
- Membuat Job
```
$ kubectl create -f (filename.yaml)
```
- Melihat Semua Job
```
$ kubectl get jobs
```
- Menghapus Job
```
$ kubectl delete job (jobname)
```
> *Untuk (filename.yaml), dan (jobname) disesuaikan dengan penamaan file dan konfigurasi*
Seperti biasa, akan dicoba lakukan di percobaan dengan contoh 6.2.2-nodejs-job.yaml :
```
$ kubectl create -f 6.2.2-nodejs-job.yaml
job.batch/nodejs-job created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nodejs-job-7gxlf 0/1 ContainerCreating 0 16s
nodejs-job-xwr6w 0/1 ContainerCreating 0 16s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nodejs-job-7gxlf 0/1 ContainerCreating 0 39s
nodejs-job-jpsmn 0/1 ContainerCreating 0 2s
nodejs-job-xwr6w 0/1 Completed 0 39s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nodejs-job-7gxlf 0/1 Completed 0 55s
nodejs-job-gj426 0/1 Completed 0 13s
nodejs-job-jpsmn 0/1 Completed 0 18s
nodejs-job-xwr6w 0/1 Completed 0 55s
```
Jika kalian lihat tahap dari Job akan membuat 4 Pod, dan setelah aplikasi berjalan (yang dimana node.js tersebut mengeluarkan keluaran) maka Pod akan langsung mati dengan mengeluarkan status completed.
### 6.3 Cron Job
Cron Job adalah aplikasi untuk penjadwalan yang biasanya ada di Sistem Operasi Unix, dengan menggunakan Cron Job kita bisa menjadwalkan aplikasi berjalan sesuai jadwal yang kita inginkan
Kubernetes mendukung resource Cron Job, dimana cara kerjanya mirip Job, hanya saja kalo Job berjalan sekali, tapi Cron Job bisa berjalan berulang kali sesuai dengan jadwal yang kita inginkan. Cron Job juga bisa memungkinkan kita untuk menjalankan aplikasi dengan waktu yang telah ditentukan
Contoh Penggunaan Cron Job :
- Aplikasi untuk membuat laporan harian
- Aplikasi untuk membackup data secara berkala
- Aplikasi untuk mengirim data tagihan tiap bulan ke pihak lain
- Aplikasi untuk menarik dana pinjaman yang jatuh tempo bulanan
- Dan sejenisnya
Untuk membuat Cron Job bisa dengan template :
6.3.1-template-cronjob.yaml
```yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cron-job-name
labels:
label-key: label-value
annotations:
annotation-key1: annotation-value1
spec:
schedule: "* * * * *"
jobTemplate:
spec:
selector:
matchLabels:
label-key1: label-value1
template:
metadata:
name: pod-name
labels:
app: pod-la
spec:
restartPolicy: Never
containers:
- name: container-name
image: image-name
ports:
- containerPort: 80
```
Untuk mempelajari konfigurasi dari schedule anda bisa membuka website [CronTab].(https://crontab.guru/)
Dengan contoh seperti dari template :
6.3.2-nodejs-cronjob.yaml
```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: nodejs-cronjob
labels:
name: nodejs-cronjob
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
metadata:
name: nodejs-cronjob
labels:
name: nodejs-cronjob
spec:
restartPolicy: Never
containers:
- name: nodejs-cronjob
image: khannedy/nodejs-job
```
Untuk perintahnya kurang lebih sama seperti sebelumnya :
- Membuat Cron Job
```
$ kubectl create -f (filename.yaml)
```
- Melihat Semua Cron Job
```
$ kubectl get cronjobs
```
- Menghapus Cron Job
```
$ kubectl delete cronjobs (cronjobname)
```
Seperti biasa, melakukan percobaan cron job dengan file 6.3.2-nodejs-cronjob.yaml :
```
$ kubectl create -f 6.3.2-nodejs-cronjob.yaml
cronjob.batch/nodejs-cronjob created
hilmi@minkube:~/kubernetes/Chapter 6 - Workload Management$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nodejs-cronjob-28745477-jc8bx 0/1 Completed 0 33s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d12h
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/nodejs-cronjob * * * * * <none> False 0 33s 36s
NAME STATUS COMPLETIONS DURATION AGE
job.batch/nodejs-cronjob-28745477 Complete 1/1 8s 33s
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nodejs-cronjob-28745477-jc8bx 0/1 Completed 0 61s
pod/nodejs-cronjob-28745478-zxl7p 0/1 ContainerCreating 0 1s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d12h
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/nodejs-cronjob * * * * * <none> False 1 1s 64s
NAME STATUS COMPLETIONS DURATION AGE
job.batch/nodejs-cronjob-28745477 Complete 1/1 8s 61s
job.batch/nodejs-cronjob-28745478 Running 0/1 1s 1s
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nodejs-cronjob-28745477-jc8bx 0/1 Completed 0 2m4s
pod/nodejs-cronjob-28745478-zxl7p 0/1 Completed 0 64s
pod/nodejs-cronjob-28745479-zvvdv 0/1 ContainerCreating 0 4s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d12h
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/nodejs-cronjob * * * * * <none> False 1 4s 2m7s
NAME STATUS COMPLETIONS DURATION AGE
job.batch/nodejs-cronjob-28745477 Complete 1/1 8s 2m4s
job.batch/nodejs-cronjob-28745478 Complete 1/1 7s 64s
job.batch/nodejs-cronjob-28745479 Running 0/1 4s 4s
```
Bisa dilihat bahwa setiap 1 menit Pod akan bertambah, cronjob sendiri sudah mengatur sesuai yang ada di konmfigurasi file.