DaemonSet是k8s 1.2版本新增的一种资源对象,用于管理在集群中每个Node上仅运行一份Pod的副本实例。

这种用法适合有以下需求的应用:

  1. 在每个node上都运行一个GlusterFS存储或者Ceph存储的Daemon进程。
  2. 在每个node上都运行一个日志采集程序,例如Fluentd或者Logstach。
  3. 在每个node上都运行一个性能监控程序,采集该node的运行性能数据,例如prometheus node exporter、colletcd、new relic agent,或者ganglia gmond等。

DaemonSet的pod调度策略与rc类似,除了使用系统内置的算法在每个node上进行调度,也可以在pod的定义中使用NodeSelector或NodeAffinity来指定满足条件的node范围进行调度。

下面的例子定义为每个node上都启动一个fluentd容器,配置文件fluentd-ds.yaml的内容如下,其中挂载了物理机的两个目录“/var/log”和“/var/lib/docker/containers”:

vim fluentd-ds.yaml

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:
      containers:
      - name: fluentd-elasticsearch
        image: govtechsg/fluentd-elasticsearch
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

查看创建好的DaemonSet 和Pod ,可以看到在每个node上都创建了一个pod

[root@bogon ~]# kubectl get daemonset -A
NAMESPACE     NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
kube-system   fluentd-elasticsearch   2         2         2       2            2           <none>          17m

[root@bogon ~]# kubectl get pod -o wide --namespace=kube-system
NAME                          READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
fluentd-elasticsearch-758zp   1/1     Running   0          3m52s   172.17.0.6   kafka03    <none>           <none>
fluentd-elasticsearch-h4x6m   1/1     Running   0          19m     172.17.0.6   server01   <none>           <none>

滚动更新

v1.6 + 支持 DaemonSet 的滚动更新,可以通过 .spec.updateStrategy.type 设置更新策略。目前支持两种策略:

  1. OnDelete:更新模板后,只有手动删除了旧的 Pod 后才会创建新的 Pod
  2. RollingUpdate:默认策略。更新 DaemonSet 模版后,自动删除旧的 Pod 并创建新的 Pod

在使用 RollingUpdate 策略时,还可以设置:

  • spec.updateStrategy.rollingUpdate.maxUnavailable, 默认 1
  • spec.minReadySeconds,默认 0

回滚

v1.7 + 还支持回滚

# 查询历史版本
$ kubectl rollout history daemonset <daemonset-name>

# 查询某个历史版本的详细信息
$ kubectl rollout history daemonset <daemonset-name> --revision=1

# 回滚
$ kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
# 查询回滚状态
$ kubectl rollout status ds/<daemonset-name>
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐