DaemonSet控制器:概念、原理
概念
- DaemonSet控制器能够确保k8s集群所有的节点都运行一个相同的pod副本,当向k8s集群中增加node节点时,这个node节点也会自动创建一个pod副本,当node节点从集群移除,这些pod也会自动删除;删除Daemonset也会删除它们创建的pod。
原理
- daemonset的控制器会监听kuberntes的daemonset对象、pod对象、node对象,这些被监听的对象之变动,就会触发syncLoop循环让kubernetes集群朝着daemonset对象描述的状态进行演进。
场景
- 在集群的每个节点上运行存储,比如:glusterd 或 ceph。
- 在每个节点上运行日志收集组件,比如:flunentd、logstash、filebeat等。
- 在每个节点上运行监控组件,比如:Prometheus、Node Exporter、collectd等。
示例:ds部署fluentd
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
namespace: default
labels:
app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane # 容忍master的污点
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: fluentd:v2.5.1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
volumes:
- name: varlog # 挂载系统日志
hostPath:
path: /var/log
- name: varlibdockercontainers # 挂载容器日志
hostPath:
path: /var/lib/docker/containers
说明
ds和deployment yaml文件的区别:
- kind变成daemonSet
- replicaCount删除了
指定节点部署
# 如果指定了.spec.template.spec.nodeSelector,DaemonSet Controller 将在与 Node Selector 匹配的节点上创建 Pod
# 比如部署在磁盘类型为 ssd 的节点上(需要提前给节点定义标签 Label):
nodeSelector:
disktype: ssd
# 比如调度到GPU节点上
nodeSelector:
gpu: "true" # 注意布尔值需要设成字符串
说明
如果添加了新节点或修改了节点标签(Label),DaemonSet 将立刻向新匹配上的节点添加Pod,同时删除不能匹配的节点上的 Pod。
ds滚动更新
kubectl explain ds.spec.updateStrategy.rollingUpdate
-
maxUnavailable(最大不可用):定义了在滚动更新期间可以同时不可用的 Pods 的最大数量。例如,如果
maxUnavailable设置为 1,那么在任何给定时间内,最多只能有一个 Pod 不可用。这有助于确保在更新期间保持一定的可用性。 -
maxSurge(最大增长): 它定义了在滚动更新期间可以同时创建的新 Pods 的最大数量。这个参数允许你一次性引入一定数量的新 Pods,以加速更新过程,同时仍然受到
maxUnavailable的限制,确保不会一次性影响太多的旧 Pods。
[!warning] 注意
只有maxUnavailable为0的时候,才允许设置maxSurge的值
- 逐步替换: DaemonSet 滚动更新通过逐步替换的方式进行,首先在节点上启动新的 Pod,然后停止旧的 Pod。这样可以确保在更新的过程中,每个节点都保持有一个 Pod 在运行。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
namespace: default
labels:
app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # maxSurge是1代表更新过程中最多同时有1个node上的ds pod在更新
maxUnavailable: 0 # 代表最多同时停掉几个node上的ds,起新的ds。设成0就代表最多
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane #容忍控制节点的污点
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: centos #xianchao/fluentd:v2.5.1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
volumes:
- name: varlog # 挂载系统日志
hostPath:
path: /var/log
- name: varlibdockercontainers # 挂载容器日志
hostPath:
path: /var/lib/docker/containers
ds回滚
# 查看更新状态
kubectl rollout status ds/ds-test
# 查看更新历史版本
kubectl rollout history ds ds-test
# 回滚到历史版本
kubectl rollout undo ds ds-test --to-revision=1