一. 簡(jiǎn)介
DaemonSet 的主要作用,是在 Kubernetes 集群里矮固,運(yùn)行一個(gè) Daemon Pod
评雌。 DaemonSet 只管理 Pod 對(duì)象,然后通過(guò) nodeAffinity 和 Toleration 這兩個(gè)調(diào)度器的小功能螟加,保證了每個(gè)節(jié)點(diǎn)上有且只有一個(gè) Pod徘溢。
所以,這個(gè) Pod 有如下三個(gè)特征:
- 這個(gè) Pod 運(yùn)行在 Kubernetes 集群里的每一個(gè)節(jié)點(diǎn)(Node)上捆探。
- 每個(gè)節(jié)點(diǎn)上只有一個(gè)這樣的 Pod 實(shí)例然爆。
- 當(dāng)有新的節(jié)點(diǎn)加入 Kubernetes 集群后,該 Pod 會(huì)自動(dòng)地在新節(jié)點(diǎn)上被創(chuàng)建出來(lái)徐许。
- 當(dāng)舊節(jié)點(diǎn)被刪除后施蜜,它上面的 Pod 也相應(yīng)地會(huì)被回收掉。
Daemon Pod
的意義確實(shí)是非常重要的雌隅。比如的作用:
- 網(wǎng)絡(luò)插件的 Agent 組件翻默,都必須運(yùn)行在每一個(gè)節(jié)點(diǎn)上,用來(lái)處理這個(gè)節(jié)點(diǎn)上的容器網(wǎng)絡(luò)恰起。
- 存儲(chǔ)插件的 Agent 組件修械,也必須運(yùn)行在每一個(gè)節(jié)點(diǎn)上,用來(lái)在這個(gè)節(jié)點(diǎn)上掛載遠(yuǎn)程存儲(chǔ)目錄检盼,操作容器的 Volume 目錄肯污。
- 監(jiān)控組件和日志組件,也必須運(yùn)行在每一個(gè)節(jié)點(diǎn)上吨枉,負(fù)責(zé)這個(gè)節(jié)點(diǎn)上的監(jiān)控信息和日志搜集蹦渣。
二. nodeAffinity
我們的 DaemonSet Controller 會(huì)在創(chuàng)建 Pod 的時(shí)候,自動(dòng)在這個(gè) Pod 的 API 對(duì)象里貌亭,加上這樣一個(gè) nodeAffinity 定義柬唯。
2.1 場(chǎng)景
在這個(gè) Pod 里,聲明了一個(gè) spec.affinity
字段圃庭,然后定義了一個(gè) nodeAffinity
锄奢。其中,spec.affinity
字段剧腻,是 Pod 里跟調(diào)度相關(guān)的一個(gè)字段拘央。
2.2 案例
比如我們創(chuàng)建如下的一個(gè)YAML文件:
apiVersion: v1
kind: Pod
metadata:
name: demo-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: metadata.name
operator: In
values:
- demo-node
關(guān)于上面參數(shù)的具體含義:
- requiredDuringSchedulingIgnoredDuringExecution
這個(gè)代表nodeAffinity
必須在每次調(diào)度的時(shí)候予以考慮,同時(shí)书在,這也意味著可以設(shè)置在某些情況下不考慮這個(gè) nodeAffinity灰伟; - 這個(gè) Pod,將來(lái)只允許運(yùn)行在“metadata.name”是“demo-node”的節(jié)點(diǎn)上儒旬。
2.3 作用
在 nodeAffinity 的定義處袱箱,可以支持更加豐富的語(yǔ)法遏乔,比如operator: In
(即:部分匹配)。
我們的 DaemonSet Controller
會(huì)在創(chuàng)建 Pod 的時(shí)候发笔,自動(dòng)在這個(gè) Pod 的 API 對(duì)象里盟萨,加上這樣一個(gè) nodeAffinity
定義。
三. Toleration
3.1 場(chǎng)景
DaemonSet 還會(huì)給這個(gè) Pod 自動(dòng)加上另外一個(gè)與調(diào)度相關(guān)的字段了讨,叫作 tolerations
捻激。這個(gè)字段意味著這個(gè) Pod,會(huì)“容忍”(Toleration)某些 Node 的“污點(diǎn)”(Taint)前计。
3.2 案例
apiVersion: v1
kind: Pod
metadata:
name: with-toleration
spec:
tolerations:
- key: node.kubernetes.io/unschedulable
operator: Exists
effect: NoSchedule
在正常情況下胞谭,被標(biāo)記了 unschedulable
“污點(diǎn)”的 Node,是不會(huì)有任何 Pod 被調(diào)度上去的(effect: NoSchedule)
男杈≌梢伲可是,DaemonSet
自動(dòng)地給被管理的 Pod 加上了這個(gè)特殊的 Toleration伶棒,就使得這些 Pod 可以忽略這個(gè)限制旺垒,繼而保證每個(gè)節(jié)點(diǎn)上都會(huì)被調(diào)度一個(gè) Pod。
當(dāng)然肤无,如果這個(gè)節(jié)點(diǎn)有故障的話先蒋,這個(gè) Pod 可能會(huì)啟動(dòng)失敗,而 DaemonSet 則會(huì)始終嘗試下去宛渐,直到 Pod 啟動(dòng)成功竞漾。
3.3 作用
通過(guò)這樣一個(gè) Toleration,調(diào)度器在調(diào)度這個(gè) Pod 的時(shí)候窥翩,就會(huì)忽略當(dāng)前節(jié)點(diǎn)上的“污點(diǎn)”业岁,從而成功地將網(wǎng)絡(luò)插件的 Agent 組件調(diào)度到這臺(tái)機(jī)器上啟動(dòng)起來(lái)。
這種機(jī)制寇蚊,正是我們?cè)诓渴?Kubernetes 集群的時(shí)候笔时,能夠先部署 Kubernetes 本身、再部署網(wǎng)絡(luò)插件的根本原因:因?yàn)楫?dāng)時(shí)我們所創(chuàng)建的 Weave
的 YAML幔荒,實(shí)際上就是一個(gè) DaemonSet。
四. ControllerRevision
DaemonSet 使用 ControllerRevision梳玫,來(lái)保存和管理自己對(duì)應(yīng)的“版本”爹梁。在 Kubernetes 項(xiàng)目里,ControllerRevision
其實(shí)是一個(gè)通用的版本管理對(duì)象提澎。這樣姚垃,Kubernetes 項(xiàng)目就巧妙地避免了每種控制器都要維護(hù)一套冗余的代碼和邏輯的問(wèn)題。
4.1 概念
Kubernetes v1.7
之后添加了一個(gè) API 對(duì)象盼忌,名叫 ControllerRevision
积糯,專門用來(lái)記錄某種 Controller 對(duì)象的版本掂墓。
ControllerRevision 對(duì)象,實(shí)際上是在 Data 字段保存了該版本對(duì)應(yīng)的完整的 DaemonSet 的 API 對(duì)象看成。并且君编,在 Annotation 字段保存了創(chuàng)建這個(gè)對(duì)象所使用的 kubectl 命令。
4.2 回滾原理
現(xiàn)在 DaemonSet Controller
就可以使用這個(gè)歷史 API 對(duì)象川慌,對(duì)現(xiàn)有的 DaemonSet 做一次 PATCH 操作(等價(jià)于執(zhí)行一次 kubectl apply -f “舊的 DaemonSet 對(duì)象”
)吃嘿,從而把這個(gè) DaemonSet“更新”到一個(gè)舊版本。
這也是為什么梦重,在執(zhí)行完這次回滾完成后兑燥,會(huì)發(fā)現(xiàn),DaemonSet 的 Revision 并不會(huì)從 Revision=2 退回到 1琴拧,而是會(huì)增加成 Revision=3降瞳。這是因?yàn)椋粋€(gè)新的 ControllerRevision
被創(chuàng)建了出來(lái)蚓胸。
五. 總結(jié)
DaemonSet其實(shí)就是依靠nodeAffinity和Toleration 實(shí)現(xiàn)的挣饥。這是一種不需要增加設(shè)計(jì)結(jié)構(gòu),而直接使用標(biāo)簽等方式完成的Daemon進(jìn)程赢织。這樣的結(jié)構(gòu)非常符合Kubernetes的控制器模式亮靴,一切皆對(duì)象。
個(gè)人博客: Wyatt's Blog
Reference
https://time.geekbang.org/column/article/41366?utm_campaign=guanwang&utm_source=baidu-ad&utm_medium=ppzq-pc&utm_content=title&utm_term=baidu-ad-ppzq-title
https://medium.com/kubernetes-tutorials/a-guide-to-kubernetes-daemonsets-6db7920ad140