Daemon Service 能夠向目標(biāo)節(jié)點(diǎn)放置和運(yùn)行有優(yōu)先級的、面向基礎(chǔ)設(shè)施的 Pod,通常被管理員用來部署與節(jié)點(diǎn)相關(guān)聯(lián)的 Pod 以增強(qiáng) Kubernetes 平臺的功能。
從操作系統(tǒng)層面來看,daemon 是一類長時間運(yùn)行、能夠自行恢復(fù)的后臺進(jìn)程,通常在計算機(jī)啟動時即自動加載,不會與前臺進(jìn)行任何交互。
這類概念也存在于應(yīng)用層面。比如運(yùn)行在后臺的 JVM deamon 線程為用戶線程提供支持服務(wù),有著較低的優(yōu)先級,執(zhí)行諸如 GC 等任務(wù)。
與上述場景類似,Kubernetes 也提供了 DaemonSet 功能。
DaemonSet 與 ReplicaSet 有一個相同點(diǎn),都是負(fù)責(zé)確保特定數(shù)量的 Pod 是一直運(yùn)行著的。不同點(diǎn)在于,ReplicaSet 的具體配置通常取決于應(yīng)用對于高可用和工作負(fù)載的需求,與節(jié)點(diǎn)數(shù)量無關(guān);DaemonSet 則并不關(guān)注負(fù)載方面的因素,它的主要目的是在每一個節(jié)點(diǎn)(或部分特定的節(jié)點(diǎn))上保持運(yùn)行一個 Pod。
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: random-refresher
spec:
selector:
matchLabels:
app: random-refresher
template:
metadata:
labels:
app: random-refresher
spec:
nodeSelector:
feature: hw-rng
containers:
- image: k8spatterns/random-generator:1.0
name: random-generator
command:
- sh
- -c
- >-
"while true; do
java -cp / RandomRunner /host_dev/random 100000;
sleep 30; done"
volumeMounts:
- mountPath: /host_dev
name: devices
volumes:
- name: devices
hostPath:
path: /dev
DaemonSet 的適用場景比如日志收集、監(jiān)控數(shù)據(jù)導(dǎo)出甚至 kube-proxy 等。其與 ReplicaSet 的主要區(qū)別如下:
- 默認(rèn)情況下,DaemonSet 會向每一個節(jié)點(diǎn)都部署一個 Pod 實(shí)例,可以通過
nodeSelector
字段只選取部分節(jié)點(diǎn) - DaemonSet 創(chuàng)建的 Pod 能夠在 Scheduler 啟動之前運(yùn)行,因此,節(jié)點(diǎn)上還沒有任何其他 Pod 被部署時,DaemonSet 創(chuàng)建的 Pod 就已經(jīng)可以運(yùn)行
- 由于 Scheduler 并沒有參與 DaemonSet 的部署,節(jié)點(diǎn)上的
unschedulable
字段對 DaemonSet 控制器不起作用 - DaemonSet 管理的 Pod 通常只運(yùn)行在特定的節(jié)點(diǎn)上,因而很多控制器會對這些 Pod 區(qū)別對待,給與更高的優(yōu)先級。比如 descheduler 會避免銷毀這類 Pod,cluster autoscaler 會對它們獨(dú)立地進(jìn)行管理
DaemonSet 和 CronJob 是兩個非常優(yōu)秀的例子,Kubernetes 將單節(jié)點(diǎn)的概念比如 Crontab 和 daemon 腳本,轉(zhuǎn)換成多節(jié)點(diǎn)的、集群化的原語,應(yīng)用到分布式系統(tǒng)的管理中。