DaemonSet和守护进程类似,它在符合匹配条件的节点上均部署一个Pod。当有新节点接入集群时,也会为他们新增一个Pod,当节点从集群删除时,这些Pod也会被回收,删除DaemonSet将会删除它所创建的所有Pod。
使用DaemonSet的一些典型用法:
运行集群存储daemon(守护进程),例如在每个节点上运行Glusterd,Ceph等。
在每个节点上运行日志手机daemon,例如Fluentd,Logstash。
在每个节点上运行监控daemon,比如Prometheus Node Exporter,Collectd,Datadog代理,New Relic代理或Ganglia gmond。
1. 创建DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: nginx
name: nginx
spec:
selector:
matchLabels:
app: nginx
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
app: nginx
spec:
tolerations:
# 这些容忍度设置是为了让该守护进程集在控制平面节点上运行
# 如果你不希望自己的控制平面节点运行 Pod,可以删除它们
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule # 污点为下方查询出的
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1
kubectl apply -f nginx-ds.yaml
污点查询:
# kubectl describe node | grep Taint
Taints: node-role.kubernetes.io/control-plane:NoSchedule
Taints: node-role.kubernetes.io/control-plane:NoSchedule
Taints: node-role.kubernetes.io/control-plane:NoSchedule
Taints: <none>
Taints: <none>
使用-o wide 可以查看 Pod 所在的节点
# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-gx2tt 1/1 Running 0 63s 10.244.79.99 k8s-worker01 <none> <none>
nginx-hjtd8 1/1 Running 0 63s 10.244.195.1 k8s-master03 <none> <none>
nginx-qpmsr 1/1 Running 0 63s 10.244.32.129 k8s-master01 <none> <none>
nginx-zbbcg 1/1 Running 0 63s 10.244.122.138 k8s-master02 <none> <none>
nginx-zf9nb 1/1 Running 0 63s 10.244.69.231 k8s-worker02 <none> <none>
2. 更新和回滚 DaemonSet
DaemonSet 更新策略和 StatefulSet 类似,也有 OnDelete 和 RollingUpdate 两种方式。
查看更新状态 :
kubectl rollout status ds/<daemonset-name>
列出所有修订版本:
kubectl rollout history daemonset <daemonset-name>
回滚到指定 revision:
kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>