在Kubernetes中,DaemonSet 是一种控制器,用于确保在集群中的每个节点(或您指定的一组节点)上运行一个 Pod 的副本。DaemonSet 常用于在集群中运行一些提供系统级功能的 Pod,例如:

  1. 日志收集:在每个节点上运行日志收集器,以收集所有节点上的容器日志。
  2. 监控:在每个节点上部署监控代理,以收集性能指标。
  3. 存储:为集群中的每个节点提供存储相关服务,例如使用 glusterfsceph
  4. 网络:运行网络插件,例如覆盖网络或服务发现。
  5. 安全:部署安全相关的代理或扫描器。

DaemonSet 与 Deployment 类似,都可以用来管理 Pod 的生命周期,但它们的主要区别在于:

  • 范围:Deployment 管理的 Pod 副本数量是可配置的,而 DaemonSet 总是尝试在每个符合条件的节点上运行一个 Pod 副本。
  • 选择性:DaemonSet 可以定义在哪些节点上运行 Pod,通过节点标签和选择器来控制。
  • 更新:当 DaemonSet 更新时,它会逐个节点更新 Pod,而不是同时更新所有 Pod。

为什么#

所以为什么要使用DaemonSet,来想象一个场景:

image-20240710132143615

现在我有Node1 Node2 Node3,每个Pod中都有自己的logs,但是如果某个地方出bug了,那么我们会傻傻地去看每一个Pod中的logs来排查错误,但是这个效率太低了

因此我们会再创建一个Node用来日志收集,资源监控等功能

那么如何保证是我想要的Node的日志能够成功传送到Node4呢?

这就需要使用到DaemonSet

比如说日志收集,DaemonSet 就可以使用一个叫 Fluentd 的组件,组成一个Pod,然后用选择器选择自己想要使用 DaemonSet Node,这样子就会像上面图片一样执行:

Node1~3这些节点的 type = microservice 就会都 装有一个 DaemonSet 用于收集日志,然后把日志传送到 Node4

使用#

指定 Pod 只运行在 指定的 Node 节点上

  • nodeSelector

    只调度到匹配指定的 label 的 Node 上

  • nodeAffinity

    功能更加丰富的 Node 选择器, 支持集合操作

  • podAffinity

    调度到满足条件的 Pod 所在的 Node 上

DeploymentStatefulSet 一样

1
2
3
4
5
cd /home/echin
mkdir daemonset/
cd daemonset
touch daemonset.yaml
vim daemonset.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: DaemonSet # 创建类型
metadata:
name: fluentd
spec:
selector:
matchLabels:
app: logging
template:
metadata:
labels:
app: logging
id: fluentd
name: fluentd
spec:
containers:
- name: fluentd-es
image: agilestacks/fluentd-elasticsearch:v1.3.0
env: # 环境变量的配置
- name: FLUENTD_ARGS # key
value: -qq # value
volumeMounts: # 加载数据卷,避免数据丢失
- name: containers # 数据卷的名字
mountPath: /var/lib/docker/containers #将数据卷挂载到某个目录
- name: varlog
mountPath: /var/log
volumes: #定义数据卷
- hostPath: #数据卷类型,主机路径的模式,也就是与 node 共享目录
path: /var/lib/docker/containers
name: containers
- hostPath:
path: /var/log
name: varlog
1
kubectl create -f daemonset.yaml

查看是否成功:

1
2
3
hhhyc@hhhyc:~/daemonset$ sudo kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd 1 1 0 1 0 <none> 20skubectl get ds

或者:

1
2
3
4
5
6
7
hhhyc@hhhyc:~/daemonset$ sudo kubectl get po
NAME READY STATUS RESTARTS AGE
fluentd-qrtwc 1/1 Running 0 4m15s
kubernetes-bootcamp-f95c5b745-d6qq6 1/1 Running 0 2d22h
nginx 1/1 Running 0 16h
web-0 1/1 Running 0 59m
web-1 1/1 Running 0 16h

🆗,感觉这一块学的东西不是很多,直接GPT启动…..