https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/
概念:
DaemonSet:用于管理在 集群中每个Node上仅运行一份Pod的副本实例
如图所示
这种适合有多种需求的应用
◎ 在每个Node上都运行一个GlusterFS存储或者Ceph存储的 Daemon进程
◎ 在每个Node上都运行一个日志采集程序,例如Fluentd或者 Logstach
◎ 在每个Node上都运行一个性能监控程序,采集该Node的运行 性能数据,例如Prometheus Node Exporter、collectd、New Relic agent或 者Ganglia gmond等
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
Pod Selector
您必须指定与 .spec.template 的标签匹配的 pod selector。当不配置时,pod selector 将不再有默认值。selector 默认与 kubectl apply 不兼容。 此外,一旦创建了 DaemonSet,它的 .spec.selector 就不能修改。修改 pod selector 可能导致 Pod 意外悬浮,并且这对用户来说是困惑的
spec.selector 表示一个对象,它由如下两个字段组成:
- matchLabels - 与 ReplicationController 的 .spec.selector 的作用相同。
- matchExpressions - 允许构建更加复杂的 Selector,可以通过指定 key、value 列表 ,以及与 key 和 value 列表相关的操作符。
当上述两个字段都指定时,结果表示的是 AND 关系。 如果指定了 .spec.selector,必须与 .spec.template.metadata.labels 相匹配。如果与它们配置的不匹配,则会被 API 拒绝。
仅在某些节点上运行 Pod
如果指定了 .spec.template.spec.nodeSelector,DaemonSet Controller 将在能够与 Node Selector 匹配的节点上创建 Pod。类似这种情况,可以指定 .spec.template.spec.affinity,然后 DaemonSet Controller 将在能够与 node Affinity 匹配的节点上创建 Pod。 如果根本就没有指定,则 DaemonSetController 将在所有节点上创建 Pod。
更新策略
DaemonSet也能执行滚动升级了, 即在更新一个DaemonSet模板的时候,旧的Pod副本会被自动删除,同 时新的Pod副本会被自动创建,此时DaemonSet的更新策略 (updateStrategy)为RollingUpdate,如下所示:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
updateStrategy:
type: RollingUpdate
updateStrategy的另外一个值是OnDelete,即只有手工删除了 DaemonSet创建的Pod副本,新的Pod副本才会被创建出来。