DaemonSet
说明
- 是个 Pod 控制器
- 能够确保 k8s 的所有节点都运行一个相同的 pod 副本,假设这个 pod 名称为 pa
- 当增加 node 节点时,这个节点会自动创建一个 pa
- 副本当删除 node 节点时,pa 副本会自动删除
- 删除 daemonset 会删除它们创建的 pod
使用场景
- 需要在每一个 node 节点运行一个存储服务,例如 gluster,ceph
- 需要在每一个 node 节点运行一个日志收集服务,例如 fluentd,logstash
- 需要在每一个 node 节点运行一个监控服务,例如 Prometheus Node Exporter,zabbix agent 等
DaemonSet 概述
在 k8s 中,DaemonSet 是一种用于在集群中的每个节点上运行一个副本的资源对象。它确保每个节点上都运行一个 Pod 的副本,以便在整个集群中提供特定的服务或功能。
DaemonSet 具有以下特点:
- 每个节点一个副本:每个节点上都会自动创建一个 Pod 的副本,并且不会自动在新节点上创建副本。
- 节点自动感知:当节点加入或离开集群时,DaemonSet 会自动调整 Pod 的数量,以保证每个节点上都有运行的副本。
- 节点亲和性:可以使用节点选择器或亲和性规则来选择在特定节点上运行 DaemonSet 的 Pod。
- 基于 Pod 模板:DaemonSet 使用 Pod 模板来定义要创建的 Pod 的配置,包括容器镜像、命令、环境变量等。
DaemonSet 在很多场景中都非常有用,例如:
- 日志收集:在每个节点上运行日志收集代理,将节点日志发送到集中的存储或分析系统。
- 监控和度量:在每个节点上运行监控代理,收集节点和容器的度量指标。
- 网络代理:在每个节点上运行网络代理,实现网络隔离、负载均衡等功能。
通过使用 DaemonSet,您可以确保在整个集群中的每个节点上都运行指定的 Pod,以提供特定的服务或功能,并确保集群中的每个节点都具有相同的配置。
我们的 k8s 集群默认有两个 DaemonSet
获取所有 ns 下的 DaemonSet
kubectl get ds -A
[root@k8s-master k8s]# kubectl get ds -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system calico-node 3 3 3 3 3 kubernetes.io/os=linux 2d8h
kube-system kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 2d9h
示例
- 编辑 yaml 文件
my-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
namespace: kube-system
labels:
la-nginx: daemonset-nginx
spec:
selector:
matchLabels:
k2-nginx: daemonset-nginx
template:
metadata:
labels:
k2-nginx: daemonset-nginx
spec:
containers:
- name: daemonset-nginx
image: nginx
- 执行 yaml 文件,创建 daemonset
[root@k8s-master k8s]# vim my-ds.yaml
[root@k8s-master k8s]# kubectl apply -f my-ds.yaml
daemonset.apps/daemonset-nginx created
- 查看 ns 命名空间为 kube-system 下的所有 pod
kubectl get pod -n kube-system
- 可以看到,我们只启动了2个 pod,集群明明有3个节点,我们看看在哪2个节点启动了
kubectl get pod -n kube-system -o wide
......
daemonset-nginx-5x8gr 1/1 Running 0 4m42s 192.169.169.169 k8s-node2 <none> <none>
daemonset-nginx-8s6dg 1/1 Running 0 4m42s 192.169.36.114 k8s-node1 <none> <none>
......
可以看到,只在 node1 和 node2 两个节点启动了,master 节点没有启动,这是为什么呢?
因为 master 天生就打了一个污点信息 NoSchedule,污点后面再讲
我们可以通过以下命令查看节点设置了哪些污点
# k8s-master 是节点的名字
kubectl describe node k8s-master
......
Taints: node-role.kubernetes.io/control-plane:NoSchedule
......
里面有这样一条信息,这就是 master 节点打上的污点,就是不让 pod 调度到该节点
查看其它节点的信息,发现为none
# 如果为空,Pod 可以自由地调度到这个节点上
Taints: <none>
说明:
有指定节点,那就在指定节点创建 pod,如指定了 nodeName,affinity,污点容忍度等…
未指定节点,将在所有节点上创建 Pod
Deployments 和 Daemonset 区别联系
相似性
- 都能创建Pod
- 创建的 Pod 对应的进程都不希望被终止掉
使用 Deployments 的场景:无状态的 Sevice 使用 Deployments,微服务,需要实现对副本的数量进行扩缩容、平滑升级,就用 Deployments
使用 Daemonset 的场景:需要 Pod 副本总是运行在全部或特定主机上,并需要先于其他 Pod 启动,就用 daemonSet。