概念
在 Kubernetes 中,DaemonSet 是一种控制器对象,用于确保在每个节点上运行一个 Pod 副本。与 ReplicaSet 和 Deployment 不同,它们只负责在集群中的所有节点上创建 Pod 副本,而不考虑副本数量
DaemonSet对象通常被用于需要在每个节点上运行某个服务或应用程序时,比如日志收集、监控代理、网络插件等。使用 DaemonSet 可以确保每个节点都运行该服务或应用程序,并且可以自动在新加入集群的节点上启动相关的 Pod 副本
与其他控制器对象类似,DaemonSet 也支持滚动更新、回滚版本、扩展和缩小副本数量等操作,同时还可以通过 NodeSelector 和 NodeAffinity等特性来指定 DaemonSet 在哪些节点上运行。
注意:由于 DaemonSet 在每个节点上都会运行一个 Pod 副本,因此对于较大的集群,可能会导致资源消耗较大,需要谨慎使用和管理。同时,在使用 DaemonSet 时,需要考虑到节点之间的差异部署。
创建DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine
此时查看每个节点上都创建了一个daemonset(如果设置了污点则不会创建),若想每个pod创建2个daemonset只能再创建一个yaml
指定节点部署(给节点打标签)
参数:
nodeSelector:
首先给工作节点打上标签
kubectl label node k8s-node01 k8s-node02 my-label=daemonset
然后在yaml文件加上nodeSelector:参数,并指定标签
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
my-label: daemonset
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine
更新回滚策略
DaemonSet也有 OnDelete 和 RollingUpdate 两种方式
DaemonSet 的更新和回滚与 Deployment 类似,请参考之前StatefulSet与deployment的wiki