一、简介
在 Kubernetes 中,DaemonSet 是一种控制器类型,用于确保集群中的每个节点运行一个特定的 Pod 实例。通常情况下,DaemonSet 被用来在集群的每个节点上运行一个特定的系统服务或者应用程序副本,例如日志收集器(如 Fluentd 或 Filebeat)、监控代理(如 Prometheus Node Exporter)、存储解决方案(如 Ceph 的 OSD 部署)等。
二、主要用途
确保每个节点上运行相同的 Pod 实例:
DaemonSet 确保在集群的每个节点上都有一个 Pod 的副本在运行,从而保证了特定任务或服务在整个集群中的普遍性。
1.节点级别的任务部署:
可以用来在每个节点上运行具有特定配置的任务,例如日志收集、监控等任务,这些任务通常需要与节点本身密切关联。
2.服务发现和负载均衡:
在某些情况下,DaemonSet 可以用于运行网络服务或负载均衡器的实例,以便每个节点都可以直接处理来自外部的流量。
3.更新和升级:
DaemonSet 也支持更新和升级,可以通过更改 Pod 模板或镜像来进行滚动更新,确保新的配置或版本可以安全地应用到每个节点。
DaemonSet 的主要作用,是让你在 k8s 集群里,运行一个 Daemon Pod。
这个 Pod 有如下三个特征:
- 这个 Pod 运行在 k8s 集群里的每一个节点(Node)上;
- 每个节点上只有一个这样的 Pod 实例;
- 当有新的节点加入 Kubernetes 集群后,该 Pod 会自动地在新节点上被创建出来;而当旧节点被删除后,它上面的 Pod 也相应地会被回收掉。
举例:
各种网络插件的 Agent 组件,都必须运行在每一个节点上,用来处理这个节点上的容器网络;
各种存储插件的 Agent 组件,也必须运行在每一个节点上,用来在这个节点上挂载远程存储目录,操作容器的 Volume 目录;
各种监控组件和日志组件,也必须运行在每一个节点上,负责这个节点上的监控信息和日志搜集。
三、示例
以下是一个简化的 DaemonSet 示例 YAML 文件,用于在每个节点上运行一个日志收集器:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluentd:v1.0.0
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
解释
- metadata.name: DaemonSet 的名称为 fluentd。
- spec.selector.matchLabels: 选择器用于选择要管理的 Pod,这里选择 app: fluentd 标签的 Pod。
- spec.template: 定义要创建的 Pod 的模板。
- spec.template.spec.containers: 定义 Pod 中运行的容器,这里是 fluentd 容器。
- spec.template.spec.volumes: 定义 Pod 使用的卷,用于将宿主机的日志目录和 Docker 容器目录挂载到容器内部,以便收集日志。
创建 DaemonSet 对象
kubectl create -f fluentd-elasticsearch.yaml
查看 DaemonSet 对象
[root@k8s-master set]# kubectl get ds -n kube-system fluentd-elasticsearch
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-elasticsearch 3 3 3 3 3 <none> 22m
注:k8s 里比较长的 API 对象都有短名字,比如 DaemonSet 对应的是 ds,Deployment 对应的是 deploy。