新聞中心
DaemonSet
DaemonSet 確保全部(或者某些)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 的副本。 當(dāng)有節(jié)點(diǎn)加入集群時(shí), 也會(huì)為他們新增一個(gè) Pod 。 當(dāng)有節(jié)點(diǎn)從集群移除時(shí),這些 Pod 也會(huì)被回收。刪除 DaemonSet 將會(huì)刪除它創(chuàng)建的所有 Pod。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出湛河免費(fèi)做網(wǎng)站回饋大家。
DaemonSet 的一些典型用法:
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行集群守護(hù)進(jìn)程
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行日志收集守護(hù)進(jìn)程
- 在每個(gè)節(jié)點(diǎn)上運(yùn)行監(jiān)控守護(hù)進(jìn)程
一種簡(jiǎn)單的用法是為每種類型的守護(hù)進(jìn)程在所有的節(jié)點(diǎn)上都啟動(dòng)一個(gè) DaemonSet。 一個(gè)稍微復(fù)雜的用法是為同一種守護(hù)進(jìn)程部署多個(gè) DaemonSet;每個(gè)具有不同的標(biāo)志, 并且對(duì)不同硬件類型具有不同的內(nèi)存、CPU 要求。
編寫 DaemonSet Spec
創(chuàng)建 DaemonSet
你可以在 YAML 文件中描述 DaemonSet。 例如,下面的 daemonset.yaml 文件描述了一個(gè)運(yùn)行 fluentd-elasticsearch Docker 鏡像的 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:
# 這些容忍度設(shè)置是為了讓守護(hù)進(jìn)程在控制平面節(jié)點(diǎn)上運(yùn)行
# 如果你不希望控制平面節(jié)點(diǎn)運(yùn)行 Pod,可以刪除它們
- key: node-role.Kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
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
基于 YAML 文件創(chuàng)建 DaemonSet:
kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml
必需字段
和所有其他 Kubernetes 配置一樣,DaemonSet 需要 ?apiVersion?、?kind ?和 ?metadata ?字段。 有關(guān)配置文件的基本信息,參見 部署應(yīng)用、 配置容器和 使用 kubectl 進(jìn)行對(duì)象管理 文檔。
DaemonSet 對(duì)象的名稱必須是一個(gè)合法的 DNS 子域名。
DaemonSet 也需要一個(gè) ?.spec? 配置段。
Pod 模板
?.spec? 中唯一必需的字段是 ?.spec.template?。
?.spec.template? 是一個(gè) Pod 模板。 除了它是嵌套的,因而不具有 ?apiVersion ?或 ?kind ?字段之外,它與 Pod 具有相同的 schema。
除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必須指定合理的標(biāo)簽(查看 Pod 選擇算符)。
在 DaemonSet 中的 Pod 模板必須具有一個(gè)值為 ?Always ?的 ?RestartPolicy?。 當(dāng)該值未指定時(shí),默認(rèn)是 ?Always?。
Pod 選擇算符
?.spec.selector? 字段表示 Pod 選擇算符,它與 Job 的 ?.spec.selector? 的作用是相同的。
你必須指定與 ?.spec.template? 的標(biāo)簽匹配的 Pod 選擇算符。 此外,一旦創(chuàng)建了 DaemonSet,它的 ?.spec.selector? 就不能修改。 修改 Pod 選擇算符可能導(dǎo)致 Pod 意外懸浮,并且這對(duì)用戶來說是費(fèi)解的。
?spec.selector? 是一個(gè)對(duì)象,如下兩個(gè)字段組成:
- ?
matchLabels?- 與 ReplicationController 的 ?.spec.selector? 的作用相同。 - ?
matchExpressions?- 允許構(gòu)建更加復(fù)雜的選擇器,可以通過指定 key、value 列表以及將 key 和 value 列表關(guān)聯(lián)起來的 operator。
當(dāng)上述兩個(gè)字段都指定時(shí),結(jié)果會(huì)按邏輯與(AND)操作處理。
?.spec.selector? 必須與 ?.spec.template.metadata.labels? 相匹配。 如果配置中這兩個(gè)字段不匹配,則會(huì)被 API 拒絕。
僅在某些節(jié)點(diǎn)上運(yùn)行 Pod
如果指定了 ?.spec.template.spec.nodeSelector?,DaemonSet 控制器將在能夠與 Node 選擇算符 匹配的節(jié)點(diǎn)上創(chuàng)建 Pod。 類似這種情況,可以指定 ?.spec.template.spec.affinity?,之后 DaemonSet 控制器 將在能夠與節(jié)點(diǎn)親和性 匹配的節(jié)點(diǎn)上創(chuàng)建 Pod。 如果根本就沒有指定,則 DaemonSet Controller 將在所有節(jié)點(diǎn)上創(chuàng)建 Pod。
Daemon Pods 是如何被調(diào)度的
通過默認(rèn)調(diào)度器調(diào)度
FEATURE STATE: Kubernetes 1.17 [stable]
DaemonSet 確保所有符合條件的節(jié)點(diǎn)都運(yùn)行該 Pod 的一個(gè)副本。 通常,運(yùn)行 Pod 的節(jié)點(diǎn)由 Kubernetes 調(diào)度器選擇。 不過,DaemonSet Pods 由 DaemonSet 控制器創(chuàng)建和調(diào)度。這就帶來了以下問題:
- Pod 行為的不一致性:正常 Pod 在被創(chuàng)建后等待調(diào)度時(shí)處于 ?
Pending?狀態(tài), DaemonSet Pods 創(chuàng)建后不會(huì)處于 ?Pending?狀態(tài)下。這使用戶感到困惑。 - Pod 搶占 由默認(rèn)調(diào)度器處理。啟用搶占后,DaemonSet 控制器將在不考慮 Pod 優(yōu)先級(jí)和搶占 的情況下制定調(diào)度決策。
?ScheduleDaemonSetPods ?允許您使用默認(rèn)調(diào)度器而不是 DaemonSet 控制器來調(diào)度 DaemonSets, 方法是將 ?NodeAffinity ?條件而不是 ?.spec.nodeName? 條件添加到 DaemonSet Pods。 默認(rèn)調(diào)度器接下來將 Pod 綁定到目標(biāo)主機(jī)。 如果 DaemonSet Pod 的節(jié)點(diǎn)親和性配置已存在,則被替換 (原始的節(jié)點(diǎn)親和性配置在選擇目標(biāo)主機(jī)之前被考慮)。 DaemonSet 控制器僅在創(chuàng)建或修改 DaemonSet Pod 時(shí)執(zhí)行這些操作, 并且不會(huì)更改 DaemonSet 的 ?spec.template?。
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchFields:
- key: metadata.name
operator: In
values:
- target-host-name
此外,系統(tǒng)會(huì)自動(dòng)添加 ?node.kubernetes.io/unschedulable:NoSchedule? 容忍度到 DaemonSet Pods。在調(diào)度 DaemonSet Pod 時(shí),默認(rèn)調(diào)度器會(huì)忽略 ?unschedulable ?節(jié)點(diǎn)。
污點(diǎn)和容忍度
盡管 Daemon Pods 遵循污點(diǎn)和容忍度 規(guī)則,根據(jù)相關(guān)特性,控制器會(huì)自動(dòng)將以下容忍度添加到 DaemonSet Pod:
| 容忍度鍵名 | 效果 | 版本 | 描述 |
|---|---|---|---|
node.kubernetes.io/not-ready | NoExecute | 1.13+ | 當(dāng)出現(xiàn)類似網(wǎng)絡(luò)斷開的情況導(dǎo)致節(jié)點(diǎn)問題時(shí),DaemonSet Pod 不會(huì)被逐出。 |
node.kubernetes.io/unreachable | NoExecute | 1.13+ | 當(dāng)出現(xiàn)類似于網(wǎng)絡(luò)斷開的情況導(dǎo)致節(jié)點(diǎn)問題時(shí),DaemonSet Pod 不會(huì)被逐出。 |
node.kubernetes.io/disk-pressure | NoSchedule | 1.8+ | DaemonSet Pod 被默認(rèn)調(diào)度器調(diào)度時(shí)能夠容忍磁盤壓力屬性。 |
node.kubernetes.io/memory-pressure | NoSchedule | 1.8+ | DaemonSet Pod 被默認(rèn)調(diào)度器調(diào)度時(shí)能夠容忍內(nèi)存壓力屬性。 |
node.kubernetes.io/unschedulable | NoSchedule | 1.12+ | DaemonSet Pod 能夠容忍默認(rèn)調(diào)度器所設(shè)置的 unschedulable 屬性. |
node.kubernetes.io/network-unavailable | NoSchedule | 1.12+ | DaemonSet 在使用宿主網(wǎng)絡(luò)時(shí),能夠容忍默認(rèn)調(diào)度器所設(shè)置的 network-unavailable 屬性。 |
與 Daemon Pods 通信
與 DaemonSet 中的 Pod 進(jìn)行通信的幾種可能模式如下:
- 推送(Push):配置 DaemonSet 中的 Pod,將更新發(fā)送到另一個(gè)服務(wù),例如統(tǒng)計(jì)數(shù)據(jù)庫。 這些服務(wù)沒有客戶端。
- NodeIP 和已知端口:DaemonSet 中的 Pod 可以使用 ?
hostPort?,從而可以通過節(jié)點(diǎn) IP 訪問到 Pod??蛻舳四芡ㄟ^某種方法獲取節(jié)點(diǎn) IP 列表,并且基于此也可以獲取到相應(yīng)的端口。 - DNS:創(chuàng)建具有相同 Pod 選擇算符的 無頭服務(wù), 通過使用 ?
endpoints?資源或從 DNS 中檢索到多個(gè) A 記錄來發(fā)現(xiàn) DaemonSet。 - Service:創(chuàng)建具有相同 Pod 選擇算符的服務(wù),并使用該服務(wù)隨機(jī)訪問到某個(gè)節(jié)點(diǎn)上的 守護(hù)進(jìn)程(沒有辦法訪問到特定節(jié)點(diǎn))。
更新 DaemonSet
如果節(jié)點(diǎn)的標(biāo)簽被修改,DaemonSet 將立刻向新匹配上的節(jié)點(diǎn)添加 Pod, 同時(shí)刪除不匹配的節(jié)點(diǎn)上的 Pod。
你可以修改 DaemonSet 創(chuàng)建的 Pod。不過并非 Pod 的所有字段都可更新。 下次當(dāng)某節(jié)點(diǎn)(即使具有相同的名稱)被創(chuàng)建時(shí),DaemonSet 控制器還會(huì)使用最初的模板。
您可以刪除一個(gè) DaemonSet。如果使用 ?kubectl ?并指定 ?--cascade=orphan? 選項(xiàng), 則 Pod 將被保留在節(jié)點(diǎn)上。接下來如果創(chuàng)建使用相同選擇算符的新 DaemonSet, 新的 DaemonSet 會(huì)收養(yǎng)已有的 Pod。 如果有 Pod 需要被替換,DaemonSet 會(huì)根據(jù)其 ?updateStrategy ?來替換。
你可以對(duì) DaemonSet 執(zhí)行滾動(dòng)更新操作。
DaemonSet 的替代方案
init 腳本
直接在節(jié)點(diǎn)上啟動(dòng)守護(hù)進(jìn)程(例如使用 ?init?、?upstartd ?或 ?systemd?)的做法當(dāng)然是可行的。 不過,基于 DaemonSet 來運(yùn)行這些進(jìn)程有如下一些好處:
- 像所運(yùn)行的其他應(yīng)用一樣,DaemonSet 具備為守護(hù)進(jìn)程提供監(jiān)控和日志管理的能力。
- 為守護(hù)進(jìn)程和應(yīng)用所使用的配置語言和工具(如 Pod 模板、?
kubectl?)是相同的。 - 在資源受限的容器中運(yùn)行守護(hù)進(jìn)程能夠增加守護(hù)進(jìn)程和應(yīng)用容器的隔離性。 然而,這一點(diǎn)也可以通過在容器中運(yùn)行守護(hù)進(jìn)程但卻不在 Pod 中運(yùn)行之來實(shí)現(xiàn)。 例如,直接基于 Docker 啟動(dòng)。
裸 Pod
直接創(chuàng)建 Pod并指定其運(yùn)行在特定的節(jié)點(diǎn)上也是可以的。 然而,DaemonSet 能夠替換由于任何原因(例如節(jié)點(diǎn)失敗、例行節(jié)點(diǎn)維護(hù)、內(nèi)核升級(jí)) 而被刪除或終止的 Pod。 由于這個(gè)原因,你應(yīng)該使用 DaemonSet 而不是單獨(dú)創(chuàng)建 Pod。
靜態(tài) Pod
通過在一個(gè)指定的、受 ?kubelet ?監(jiān)視的目錄下編寫文件來創(chuàng)建 Pod 也是可行的。 這類 Pod 被稱為靜態(tài) Pod。 不像 DaemonSet,靜態(tài) Pod 不受 ?kubectl ?和其它 Kubernetes API 客戶端管理。 靜態(tài) Pod 不依賴于 API 服務(wù)器,這使得它們?cè)趩?dòng)引導(dǎo)新集群的情況下非常有用。 此外,靜態(tài) Pod 在將來可能會(huì)被廢棄。
Deployments
DaemonSet 與 Deployments 非常類似, 它們都能創(chuàng)建 Pod,并且 Pod 中的進(jìn)程都不希望被終止(例如,Web 服務(wù)器、存儲(chǔ)服務(wù)器)。
建議為無狀態(tài)的服務(wù)使用 Deployments,比如前端服務(wù)。 對(duì)這些服務(wù)而言,對(duì)副本的數(shù)量進(jìn)行擴(kuò)縮容、平滑升級(jí),比精確控制 Pod 運(yùn)行在某個(gè)主機(jī)上要重要得多。 當(dāng)需要 Pod 副本總是運(yùn)行在全部或特定主機(jī)上,并且當(dāng)該 DaemonSet 提供了節(jié)點(diǎn)級(jí)別的功能(允許其他 Pod 在該特定節(jié)點(diǎn)上正確運(yùn)行)時(shí), 應(yīng)該使用 DaemonSet。
例如,網(wǎng)絡(luò)插件通常包含一個(gè)以 DaemonSet 運(yùn)行的組件。 這個(gè) DaemonSet 組件確保它所在的節(jié)點(diǎn)的集群網(wǎng)絡(luò)正常工作。
文章標(biāo)題:創(chuàng)新互聯(lián)kubernetes教程:KubernetesDaemonSet
網(wǎng)站鏈接:http://m.fisionsoft.com.cn/article/cdpoicp.html


咨詢
建站咨詢
