Kubernetes 設(shè)計模式筆記 —— Daemon Service

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)的管理中。

參考資料

Kubernetes Patterns

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容