Try โ€‚โ€‰HackMD

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 :

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More โ†’

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

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

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

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

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

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

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.