一、DaemonSet控制器理論知識
中文官方文檔參考:
1、DaemonSet控制器是什么?
Kubernetes中的DaemonSet(簡寫ds)控制器是一種用來運(yùn)行守護(hù)進(jìn)程應(yīng)用程序的控制器,它確保每個(gè)Node節(jié)點(diǎn)都運(yùn)行具有指定配置的 Pod副本,當(dāng)Node節(jié)點(diǎn)的加入或刪除DaemonSet控制器會(huì)自動(dòng)創(chuàng)建或刪除相應(yīng)的 Pod副本。
特點(diǎn):
-
每個(gè)節(jié)點(diǎn)只運(yùn)行一個(gè)實(shí)例:DaemonSet確保每個(gè)節(jié)點(diǎn)上只運(yùn)行一個(gè) Pod 實(shí)例。這確保了在每個(gè)節(jié)點(diǎn)上部署的守護(hù)進(jìn)程能夠與主機(jī)緊密結(jié)合,以提供更高的可用性和可靠性。
-
滾動(dòng)升級:在更新 DaemonSet 時(shí),可以通過幾種不同的方式控制滾動(dòng)升級??梢赃x擇一次更新所有 Pod 實(shí)例,也可以在運(yùn)行新版本之前逐步刪除舊的 Pod 實(shí)例。
-
在啟動(dòng)前執(zhí)行任務(wù):可以通過 DaemonSet 的
2、DaemonSet控制器工作原理
DaemonSet控制器會(huì)監(jiān)聽K8s的daemonset對象、pod對象、node對象,如果這些被監(jiān)聽的對象變動(dòng),就會(huì)觸發(fā)syncLoop循環(huán),讓K8s集群朝著daemonset對象描述的狀態(tài)進(jìn)行演進(jìn)。
3、DaemonSet典型應(yīng)用場景
-
日志和指標(biāo)收集:在每個(gè)節(jié)點(diǎn)上運(yùn)行日志和指標(biāo)收集器,比如flunentd 、 logstash、filebeat等。
-
數(shù)據(jù)存儲:在每個(gè)節(jié)點(diǎn)上運(yùn)行數(shù)據(jù)存儲,比如glusterd 、ceph等。
-
監(jiān)控組件:在每個(gè)節(jié)點(diǎn)上運(yùn)行監(jiān)控組件,比如prometheus、node_exporter、collectd等。
4、DaemonSet與Deployment的區(qū)別
- deployment創(chuàng)建出來的Pod,會(huì)分布在各個(gè)Node節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都可能運(yùn)行好幾個(gè)副本。
- daemonset創(chuàng)建出來的Pod,每個(gè)Node節(jié)點(diǎn)上最多只能運(yùn)行一個(gè)Pod副本,通常用來運(yùn)行后臺服務(wù)和守護(hù)進(jìn)程應(yīng)用程序。
因此,一般情況下,如果要部署后臺服務(wù)和守護(hù)進(jìn)程等單節(jié)點(diǎn)應(yīng)用程序,可以使用DaemonSet;如果需要部署復(fù)雜的應(yīng)用程序,如Web服務(wù)等,那就需要使用deployment了。
二、案例:DaemonSet控制器實(shí)戰(zhàn)演示
1、使用DaemonSet部署日志收集組件
部署 fluentd 日志收集組件(只簡單演示DaemonSet使用,并非做ELK整體實(shí)驗(yàn))YAML資源清單如下:
cat fluentd-daemonset.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: elasticsearch-fluentd
namespace: default
spec:
selector:
matchLabels:
app: elasticsearch-fluentd
template:
metadata:
labels:
app: elasticsearch-fluentd
spec:
tolerations: # 定義容忍度,運(yùn)行在master節(jié)點(diǎn)運(yùn)行(根據(jù)自己master的污點(diǎn)定義)
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
volumes: # 定義卷名稱為 system-log
- name: system-log
hostPath:
path: /var/log
containers:
- name: elasticsearch-fluentd
image: qinziteng/fluentd:2.5.1
imagePullPolicy: IfNotPresent
resources: # 定義資源限制
requests:
cpu: 100m
memory: 300Mi
limits:
memory: 300Mi
volumeMounts:
- name: system-log # 使用system-log卷,掛載到容器/var/log目錄
mountPath: /var/log
執(zhí)行YAML文件:
kubectl apply -f fluentd-daemonset.yaml
查看Pod狀態(tài),如下圖可以看到分包在K8s集群每個(gè)節(jié)點(diǎn)上創(chuàng)建Pod
kubectl get pods -o wide
2、DaemonSet管理Pod滾動(dòng)更新
DaemonSet更新策略在 spec.updateStrategy
字段定義,目前支持兩種更新策略:
- rollingUpdate:由于daemonset不支持一個(gè)節(jié)點(diǎn)運(yùn)行多個(gè)Pod,所以rollingUpdate更新策略是先刪除在更新。
- OnDelete:默認(rèn)不做更新,需要手動(dòng)刪除后更新。
第一步:創(chuàng)建daemonset資源并使用 nginx:1.18.0 鏡像,YAML 如下:
cat web-daemonset.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: web-daemonset
namespace: default
spec:
updateStrategy:
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: web-daemonset
template:
metadata:
labels:
app: web-daemonset
spec:
tolerations:
- effect: NoSchedule # 容忍度根據(jù)master 污點(diǎn)定義
key: node-role.kubernetes.io/control-plane
containers:
- name: web-daemonset
image: nginx:1.18.0
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 300Mi
limits:
memory: 300Mi
執(zhí)行YAML 文件:
kubectl apply -f web-daemonset.yaml
查看Pod狀態(tài):
kubectl get pods -o wide -l app=web-daemonset
第二步:更新鏡像使用nginx:latest
只更改image地方,其余地方不做操作,然后重新apply 使其生效。
kubectl apply -f web-daemonset.yaml
第三步:驗(yàn)證鏡像是否更新
kubectl describe pod web-daemonset-2vtd9|grep Image
文章來源:http://www.zghlxwxcb.cn/news/detail-498172.html
可以看到鏡像版本更新成功了,這種更新其實(shí)就是先刪除舊版本,再使用新的鏡像版本進(jìn)行創(chuàng)建。文章來源地址http://www.zghlxwxcb.cn/news/detail-498172.html
三、總結(jié)
- DaemonSet控制器用于控制每個(gè)Node節(jié)點(diǎn)有運(yùn)行指定Pod副本集,當(dāng)添加或刪除Node節(jié)點(diǎn)時(shí),DaemonSet會(huì)自動(dòng)創(chuàng)建指定的Pod副本集,來保證每一個(gè)Node節(jié)點(diǎn)都運(yùn)行此Pod。用于收集日志、監(jiān)控等場景。
- DaemonSet rollingUpdate更新策略是先刪除舊版本Pod,在創(chuàng)建新版本Pod,因?yàn)槊總€(gè)Node節(jié)點(diǎn)只能創(chuàng)建一個(gè)Pod副本集。
到了這里,關(guān)于【Kubernetes資源篇】DaemonSet控制器入門實(shí)戰(zhàn)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!