一,概述
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 ds
apiVersion <string> #当前资源使用的api版本,跟VERSION: apps/v1保持一致
kind <string> #资源类型,跟KIND: DaemonSet保持一致
metadata <Object> #元数据,定义DaemonSet名字的
spec <Object> #定义容器的
status <Object> #状态信息,不能改
# kubectl explain ds.spec
minReadySeconds <integer> #当新的pod启动几秒种后,再kill掉旧的pod。
revisionHistoryLimit <integer> #历史版本
selector <Object> -required- #用于匹配pod的标签选择器
template <Object> -required- #定义Pod的模板,基于这个模板定义的所有pod是一样的
updateStrategy <Object> #daemonset的升级策略
# kubectl explain ds.spec.template
metadata <Object>
spec <Object>
六,案例:部署日志收集组件fluentd
所有node节点,包括master节点,都导入镜像进行安装:fluentd_2_5_1.tar.gz
vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet # 指定资源类型
metadata:
name: ds-fluedtd
namespace: kubec-system
labels:
app: ds-fluedtd
spec:
minReadySeconds: 5 # 最小的准备时间为5s
revisionHistoryLimit: 8 # 更新历史版本 限制8个
selector:
matchLabels:
theapp: pod-fluedtd
version: v6
template:
metadata:
labels:
theapp: pod-fluedtd
version: v6
spec:
tolerations: # 添加容忍
- key: node-role.kubernetes.io/control-plane # 容忍master上的污点
effect: NoSchedule # 容忍影响和master相同
containers:
- name: pod-node
image: xxxxxx/fluentd:v2.5.1 # 配置正确的fluentd镜像文件
imagePullPolicy: IfNotPresent # 本地拉取不成功,会从docker.hub上拉取
resources: # 配置资源
limits: # 限制最大配置
cpu: 500m
memory: 300Mi
requests: # 需求最小配置
cpu: 300m
memory: 128Mi
volumeMounts:
- name: vol-fluedtd # 与volumes的值保持相同
mountPath: /path/to/logs/
restartPolicy: Always
volumes:
- name: vol-fluedtd # 与volumeMounts的name值保持相同
nfs: # 采用nfs存储
path: /data/volumes
server: 192.168.40.180
updateStrategy: # 指定更新策略
rollingUpdate: # 采用滚动更新
maxSurge: 2 # 最多增加2个
maxUnavailable: 0 # 最少减少0个
type: RollingUpdate # 更新类型为滚动更新,默认值
kubectl get ds -n meidongyan
NAME 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.updateStrategy
rollingUpdate <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 # 更新类型为滚动更新,默认值
...