一,概述
DaemonSet(简写 ds)控制器能够确保k8s集群的所有Node节点,都运行一个相同的Pod副本。
当Node节点增加时,该节点也会自动创建一个Pod副本。
当Node节点减少时,该节点也会自动删除这个Pod副本。
当删除DaemonSet时,所有节点上的Pod副本,也会自动删除。
二,原理
DaemonSet控制器会监听K8S中的DaemonSet对象,pod对象,node对象,这些监听对象的变化,会触发syncLoop循环,让K8S集群朝着DaemonSet对象描述的状态演进。
三,场景
- 集群的每个node节点上运行存储,如:glusterd, ceph等;
- 集群的每个node节点上运行日志收集组件,如:flunentd,logstash,filebeat 等;
- 集群的每个node节点上运行监控组件,如:Prometheus,Node Exporter, collectd等。
四,DaemonSet 与 Deployment的区别
Deployment部署副本Pod,可以随机的分布在每个node节点上,部署可多可少,也可为零。
DaemonSet部署副本Pod,每个node节点最多只能运行一个Pod副本。
五,资源清单 常用字段
# kubectl explain dsapiVersion <string> #当前资源使用的api版本,跟VERSION: apps/v1保持一致
kind <string> #资源类型,跟KIND: DaemonSet保持一致
metadata <Object> #元数据,定义DaemonSet名字的
spec <Object> #定义容器的
status <Object> #状态信息,不能改
# kubectl explain ds.specminReadySeconds <integer> #当新的pod启动几秒种后,再kill掉旧的pod。
revisionHistoryLimit <integer> #历史版本
selector <Object> -required- #用于匹配pod的标签选择器
template <Object> -required- #定义Pod的模板,基于这个模板定义的所有pod是一样的
updateStrategy <Object> #daemonset的升级策略
# kubectl explain ds.spec.templatemetadata <Object>
spec <Object>
六,案例:部署日志收集组件fluentd
所有node节点,包括master节点,都导入镜像进行安装:fluentd_2_5_1.tar.gz
vim daemonset.yamlapiVersion: apps/v1
kind: DaemonSet # 指定资源类型
metadata:name: ds-fluedtdnamespace: kubec-systemlabels:app: ds-fluedtd
spec:minReadySeconds: 5 # 最小的准备时间为5srevisionHistoryLimit: 8 # 更新历史版本 限制8个selector:matchLabels:theapp: pod-fluedtdversion: v6template:metadata:labels:theapp: pod-fluedtdversion: v6spec:tolerations: # 添加容忍- key: node-role.kubernetes.io/control-plane # 容忍master上的污点effect: NoSchedule # 容忍影响和master相同containers:- name: pod-nodeimage: xxxxxx/fluentd:v2.5.1 # 配置正确的fluentd镜像文件imagePullPolicy: IfNotPresent # 本地拉取不成功,会从docker.hub上拉取 resources: # 配置资源limits: # 限制最大配置cpu: 500mmemory: 300Mirequests: # 需求最小配置cpu: 300mmemory: 128MivolumeMounts:- name: vol-fluedtd # 与volumes的值保持相同mountPath: /path/to/logs/restartPolicy: Alwaysvolumes: - name: vol-fluedtd # 与volumeMounts的name值保持相同nfs: # 采用nfs存储path: /data/volumesserver: 192.168.40.180updateStrategy: # 指定更新策略rollingUpdate: # 采用滚动更新maxSurge: 2 # 最多增加2个maxUnavailable: 0 # 最少减少0个type: RollingUpdate # 更新类型为滚动更新,默认值
kubectl get ds -n meidongyanNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ds-fluedtd 3 3 3 3 3 <none> 132m
至此,安装成功,每个节点均已经部署一个pod副本!
1,Pod定义容忍 master主机上的污点,从而实现在master部署:
2,更新策略
- 2-1
# 命令行更新pod
kubectl set image daemonsets [资源名] [容器名]=ikubernetes/filebeat:5.6.6-alpine -n kube-system# 例如:
kubectl set image daemonsets ds-fluedtd pod-node=ikubernetes/filebeat:5.6.6-alpine -n kube-system
- 2-2
# kubectl explain ds.spec.updateStrategyrollingUpdate <Object>
type <string># kubectl explain ds.spec.updateStrategy.rollingUpdate
maxSurge <string>
maxUnavailable <string># kubectl explain ds.spec.updateStrategy.type
type的values:- "OnDelete":只有手工删除了DaemonSet创建的Pod副本,新的Pod副本才会被创建 - "RollingUpdate":更新时,日版本的Pod将被自动“杀掉
...
updateStrategy: # 指定更新策略rollingUpdate: # 采用滚动更新maxSurge: 2 # 最多增加2个maxUnavailable: 0 # 最少减少0个type: RollingUpdate # 更新类型为滚动更新,默认值
...