DaemonSet控制器
- 概念、原理解读、应用场景
- 概述
- 工作原理
- 典型的应用场景介绍
- DaemonSet 与 Deployment 的区别
- 解读资源清单文件
- 实践案例
概念、原理解读、应用场景
概述
DaemonSet控制器能够确保K8S集群所有的节点都分别运行一个相同的pod副本;
当集群中增加node节点时,新的node节点也会自动创建一个pod副本;
当node节点从集群移除,这些pod也会自动删除;删除Daemonset也会删除它创建的pod
工作原理
DaemonSet的控制器会监听K8S的daemonset对象、pod对象、node对象,这些被监听的对象之变动,就会触发 syncLoop循环 让 K8S集群朝着daemonset对象描述的状态进行演进。
典型的应用场景介绍
在集群的每个节点上运行存储,比如:glusterd 或 ceph。
在每个节点上运行日志收集组件,比如:flunentd 、 logstash、filebeat等。
在每个节点上运行监控组件,比如:Prometheus、 Node Exporter 、collectd等。
DaemonSet 与 Deployment 的区别
Deployment :部署的 Pod副本 会分布在各个 Node 上,一个 Node 可能运行好几个副本。
DaemonSet :每个 Node 上最多只能运行一个副本。
解读资源清单文件
查看定义Daemonset资源需要的字段有哪些
kubectl explain ds
查看DaemonSet的spec字段如何定义
kubectl explain ds.spec
字段解释说明
- minReadySeconds:当新的pod启动几秒种后,再kill掉旧的pod
- revisionHistoryLimit:保存多少个历史版本
- selector(必填):用于匹配pod的标签选择器
- template(必填):定义Pod的模板,基于这个模板创建的所有pod是一样的
- updateStrategy:daemonset的升级策略
实践案例
实验:部署日志收集组件fluentd
环境说明:使用K8S的 V1.25.0版本,集群是1个master,2个work节点
编写DaemonSet资源清单
vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch # #资源的名字
namespace: monitor # 资源使用的名称空间
labels: # DaemonSet资源具有的标签
k8s-app: fluentd-logging
spec:
selector: # 标签选择器,匹配pod的标签
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels: # 基于模板定义的pod所具有的标签
name: fluentd-elasticsearch
spec:
tolerations: # 定义容忍度,master上自带了污点 为了让pod能调度到master节点上定义的容忍度
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule
containers: # 定义容器
- name: fluentd-elasticsearch
image: fluentd:v2.5.1
resources: # 资源配额
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log # 挂载容器目录
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers # 把/var/lib/docker/containers/挂载到容器里
readOnly: true # 挂载目录是只读权限
terminationGracePeriodSeconds: 30 # 优雅的关闭服务
volumes:
- name: varlog
hostPath:
path: /var/log # 基于本地目录创建一个卷
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
启动资源
kubectl apply -f daemonset.yaml
查看DaemonSet创建情况
kubectl get ds -n monitor
查看DaemonSet控制器创建的pod情况
kubectl get pods -n monitor -o wide
通过上面可以看到在k8s的三个节点均创建了fluentd这个pod
pod的名字是由 {控制器的名字} - {随机数} 组成的