一、什么是DaemonSet
DaemonSet(守护进程集)和守护进程类似,它在符合匹配条件的节点上均部署一个Pod。
DaemonSet 确保全部(或者某些)节点上运行一个Pod副本。当有新节点加入集群时,也会为它们新增一个Pod。当节点从集群中移除时,这些Pod也会被回收,删除DaemonSet将会删除它创建的所有Pod。
DaemonSet的典型场景
- 运行集群存储daemon(守护进程),例如在每个节点上运行Glusterfs、Ceph等。
- 在每个节点运行日志收集daemon,例如filebeat、Logstash。
- 在每个节点运行监控daemon,比如Prometheus Node Exporter。
二、配置文件 fluentd-ds.yaml
( 此处以 fluentd
应用为例 )
apiVersion: apps/v1
kind: DaemonSet # 类型为 DaemonSet 的资源
metadata:
name: fluentd
spec:
template:
metadata:
labels:
app: logging
id: fluentd
name: fluentd
spec:
containers:
- name: fluentd-es
image: agilestacks/fluentd-elasticsearch:v1.3.0
env:
- name: FLUENTD_ARGS
value: -qq
volumeMounts:
- name: containers
mountPath: /var/lib/docker/containers
- name: varlog
mountPath: /varlog
volumes:
- hostPath:
path: /var/lib/docker/containers
name: containers
- hostPath:
path: /var/log
name: varlog
三、指定 Node 节点
DaemonSet 会忽略 Node 的 unschedulable
状态,有两种方式来指定 Pod 只运行在指定的 Node 节点上:
1. nodeSelector
:只调度到匹配指定 label 的 Node 上
- 先为 Node
打上标签
# 这里给 k8s-node1 打上 `svc_type=microsvc` 的标签
kubectl label nodes k8s-node1 svc_type=microsvc
- 查看节点信息
- 然后再 daemonset 配置中设置 nodeSelector
spec:
template:
spec:
nodeSelector:
svc_type: microsvc
- 完整 yaml:
apiVersion: apps/v1
kind: DaemonSet # 类型为 DaemonSet 的资源
metadata:
name: fluentd
spec:
selector:
matchLabels:
app: logging
template:
metadata:
labels:
app: logging
id: fluentd
name: fluentd
spec:
nodeSelector:
svc_type: microsvc
containers:
- name: fluentd-es
image: agilestacks/fluentd-elasticsearch:v1.3.0
env:
- name: FLUENTD_ARGS
value: -qq
volumeMounts:
- name: containers
mountPath: /var/lib/docker/containers
- name: varlog
mountPath: /varlog
volumes:
- hostPath:
path: /var/lib/docker/containers
name: containers
- hostPath:
path: /var/log
name: varlog
- 根据配置文件创建 DaemonSet
kubectl create -f fluentd-ds.yaml
- 查看 DaemonSet
- 查看对应的pod 信息, 看出部署了一台pod, 且在
k8s-node1
的节点部署了服务, 其他节点不会部署
-- 最后, 我们将 k8s-node2节点上也加上svc_type=microsvc
标签, 然后查看 ds 信息
2. nodeAffinity
:功能更丰富的 Node 选择器,比如支持集合操作
3. podAffinity
:调度到满足条件的 Pod 所在的 Node 上
四、滚动更新
不建议使用 RollingUpdate,建议使用 OnDelete 模式,这样避免频繁更新 ds
- 相关配置
spec:
template:
spec:
...
....
updateStrategy:# 更新策略
#rollingUpdate: # 滚动更新
# maxSurge: 0
# maxUnavailable: 1
#type: RollingUpdate
type: OnDelete # 删除更新