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:
- Agen Logging: Mengumpulkan log dari setiap node, seperti Fluentd atau Logstash.
- Agen Monitoring: Memantau kinerja dan kesehatan node, seperti Prometheus Node Exporter atau collectd.
- Plugin Jaringan: Menjalankan plugin jaringan pada setiap node, seperti Calico, Flannel, atau Weave.
- 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:
- 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: /
- Terapkan DaemonSet:
kubectl apply -f node-exporter-daemonset.yaml
- 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
- 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:
-
Pod DaemonSet tidak bisa dipindahkan ke node lain: Jika node mati, Pod DaemonSet pada node tersebut tidak akan dipindahkan ke node lain.
-
Penghapusan DaemonSet akan menghapus semua Pod: Ketika DaemonSet dihapus, semua Pod yang dibuat oleh DaemonSet tersebut juga akan dihapus.
-
Sumber Daya: Pastikan node memiliki sumber daya yang cukup untuk menjalankan Pod DaemonSet, terutama jika Pod membutuhkan banyak CPU atau memori.
-
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! ๐๐พ