DaemonSet:在每个Node上都调度一个Pod

https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/
概念:
DaemonSet:用于管理在 集群中每个Node上仅运行一份Pod的副本实例
如图所示
DaemonSet:在每个Node上都调度一个Pod_第1张图片
这种适合有多种需求的应用
◎ 在每个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副本才会被创建出来。

你可能感兴趣的:(Kubernetes)