Pada artikel sebelumnya, kita telah membahas tentang Secret yang digunakan untuk menyimpan data sensitif di Kubernetes. Kali ini, kita akan membahas tentang DaemonSet, sebuah kontroler yang memastikan Pod berjalan pada semua (atau beberapa) node dalam klaster.

Apa itu DaemonSet?

DaemonSet adalah kontroler yang memastikan bahwa salinan Pod berjalan pada setiap node (atau subset node) dalam klaster Kubernetes. Ketika node baru ditambahkan ke klaster, Pod akan otomatis ditambahkan ke node tersebut. Ketika node dihapus dari klaster, Pod tersebut akan dibersihkan oleh garbage collector.

Berbeda dengan Deployment atau ReplicaSet yang fokus pada jumlah replika Pod yang berjalan, DaemonSet fokus pada memastikan Pod berjalan pada setiap node. Ini sangat berguna untuk layanan yang perlu berjalan pada setiap node, seperti agen monitoring, agen logging, atau plugin jaringan.

Kapan Menggunakan DaemonSet?

Ada beberapa kasus penggunaan umum untuk DaemonSet:

  1. Agen Logging: Mengumpulkan log dari setiap node, seperti Fluentd atau Logstash.
  2. Agen Monitoring: Memantau kinerja dan kesehatan node, seperti Prometheus Node Exporter atau collectd.
  3. Plugin Jaringan: Menjalankan plugin jaringan pada setiap node, seperti Calico, Flannel, atau Weave.
  4. Penyimpanan: Menjalankan agen penyimpanan pada setiap node, seperti Ceph atau GlusterFS.

Membuat DaemonSet

Mari kita lihat contoh YAML untuk membuat DaemonSet:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

Pada contoh di atas, kita membuat DaemonSet bernama fluentd-elasticsearch yang akan menjalankan Pod Fluentd pada setiap node dalam klaster. Pod ini akan mengumpulkan log dari /var/log dan /var/lib/docker/containers pada setiap node.

Penjadwalan DaemonSet

DaemonSet akan menjadwalkan Pod pada setiap node dalam klaster secara default. Namun, kita bisa mengontrol node mana yang akan menjalankan Pod DaemonSet dengan beberapa cara:

1. Node Selector

Kita bisa menggunakan nodeSelector untuk menjalankan DaemonSet hanya pada node dengan label tertentu:

spec:
  template:
    spec:
      nodeSelector:
        disk: ssd

Dengan konfigurasi di atas, DaemonSet hanya akan berjalan pada node dengan label disk=ssd.

2. Node Affinity

Untuk kontrol yang lebih fleksibel, kita bisa menggunakan nodeAffinity:

spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux

Dengan konfigurasi di atas, DaemonSet hanya akan berjalan pada node dengan sistem operasi Linux.

3. Tolerations

Tolerations memungkinkan DaemonSet untuk dijadwalkan pada node dengan taint tertentu:

spec:
  template:
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

Dengan konfigurasi di atas, DaemonSet bisa berjalan pada node master yang biasanya memiliki taint node-role.kubernetes.io/master:NoSchedule.

Strategi Update DaemonSet

Kubernetes mendukung dua strategi update untuk DaemonSet:

1. OnDelete

Dengan strategi ini, Pod DaemonSet hanya akan diperbarui ketika Pod dihapus secara manual. Ini adalah strategi default untuk DaemonSet sebelum Kubernetes 1.6.

spec:
  updateStrategy:
    type: OnDelete

2. RollingUpdate

Dengan strategi ini, Pod DaemonSet akan diperbarui secara otomatis dengan cara rolling update ketika spesifikasi template Pod berubah. Ini adalah strategi default untuk DaemonSet sejak Kubernetes 1.6.

spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1

Parameter maxUnavailable menentukan jumlah maksimum Pod yang bisa tidak tersedia selama proses update.

Contoh Lengkap: Agen Monitoring

Mari kita lihat contoh lengkap untuk menjalankan agen monitoring Prometheus Node Exporter pada setiap node:

  1. Buat file node-exporter-daemonset.yaml:
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
  labels:
    app: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      hostNetwork: true
      hostPID: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:v1.3.1
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host/root
        - --web.listen-address=:9100
        ports:
        - containerPort: 9100
          protocol: TCP
          name: http
        volumeMounts:
        - name: proc
          mountPath: /host/proc
          readOnly: true
        - name: sys
          mountPath: /host/sys
          readOnly: true
        - name: root
          mountPath: /host/root
          readOnly: true
      tolerations:
      - operator: Exists
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys
      - name: root
        hostPath:
          path: /
  1. Terapkan DaemonSet:
kubectl apply -f node-exporter-daemonset.yaml
  1. Verifikasi bahwa DaemonSet telah dibuat:
kubectl get daemonset -n monitoring

Output akan terlihat seperti ini:

NAME           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
node-exporter  3         3         3       3            3           <none>          1m
  1. Verifikasi bahwa Pod berjalan pada setiap node:
kubectl get pods -n monitoring -o wide

Output akan menunjukkan bahwa Pod berjalan pada setiap node dalam klaster:

NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE
node-exporter-abc12  1/1     Running   0          1m    192.168.1.1   node1
node-exporter-def34  1/1     Running   0          1m    192.168.1.2   node2
node-exporter-ghi56  1/1     Running   0          1m    192.168.1.3   node3

Batasan dan Pertimbangan

Beberapa hal yang perlu diperhatikan saat menggunakan DaemonSet:

  1. Pod DaemonSet tidak bisa dipindahkan ke node lain: Jika node mati, Pod DaemonSet pada node tersebut tidak akan dipindahkan ke node lain.

  2. Penghapusan DaemonSet akan menghapus semua Pod: Ketika DaemonSet dihapus, semua Pod yang dibuat oleh DaemonSet tersebut juga akan dihapus.

  3. Sumber Daya: Pastikan node memiliki sumber daya yang cukup untuk menjalankan Pod DaemonSet, terutama jika Pod membutuhkan banyak CPU atau memori.

  4. Jaringan: Jika Pod DaemonSet perlu mengakses port pada host, pastikan tidak ada konflik port dengan aplikasi lain.

Kesimpulan

DaemonSet adalah kontroler yang sangat berguna untuk menjalankan Pod pada setiap node dalam klaster Kubernetes. Ini sangat cocok untuk layanan infrastruktur seperti logging, monitoring, dan networking yang perlu berjalan pada setiap node.

Dengan memahami cara kerja DaemonSet dan kapan menggunakannya, kita bisa merancang aplikasi yang lebih tangguh dan mudah dikelola di Kubernetes.

Pada artikel berikutnya, kita akan membahas tentang Job - kontroler yang menjalankan Pod sampai tugasnya selesai. Jangan lupa untuk mencoba contoh-contoh di atas di klaster Minikube Anda!

Cappy Hoding! ๐Ÿ––๐Ÿพ