## 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 : ![13](https://hackmd.io/_uploads/rytDthKiC.png) 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.