0
点赞
收藏
分享

微信扫一扫

k8s控制器之DaemonSet

DaemonSet介绍

DaemonSet概述

DaemonSet确保全部node上运行一个Pod的副本。当有node节点加入集群时,也会为他们新增一个Pod 。当有node节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。在每一个node节点上只调度一个Pod,因此无需指定replicas的个数,比如:在每个node上都运行一个日志采集程序,负责收集node节点本身和node节点之上的各个Pod所产生的日志,在每个node上都运行一个性能监控程序,采集该node的运行性能数据。

DaemonSet应用场景

  • 在集群的每个节点上运行存储,比如:glusterd、ceph。

  • 在每个节点上运行日志收集组件,比如:flunentd 、logstash、filebeat等。

  • 在每个节点上运行监控组件,比如:Prometheus。

DaemonSet和Deployment区别

DaemonSet默认会在每个节点上运行有且只有一个pod(不考虑调度策略的情况下)。而Deployment可以在每个节点运行0到多个pod。

DaemonSet应用实践

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
  labels:
    app: nginx-ds
spec:
  template:
    metadata:
      name: nginx-pod
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx-c
          image: nginx:1.21.5
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
  selector:
    matchLabels:
      app: nginx-pod

运行DaemonSet并查看pod信息

kubectl apply -f daemonset.yaml

#查看pod信息,发现只有master节点不会创建
kubectl get pod -o wide

通过运行上面的DaemonSet资源文件,发现在所有工作节点都创建了pod,但是master节点没有,因为master节点默认设置了污点,不允许pod调度到该节点,如果业务需要在master节点部署pod的话(例如像监控信息),那么需要修改DaemonSet的资源文件,添加污点容忍度,修改如下:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
  labels:
    app: nginx-ds
spec:
  template:
    metadata:
      name: nginx-pod
      labels:
        app: nginx-pod
    spec:
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
      containers:
        - name: nginx-c
          image: nginx:1.21.5
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
  selector:
    matchLabels:
      app: nginx-pod

再次运行发现在master节点也创建了pod,这样所有节点都运行了一个pod。如果我们删除某个节点的pod,会马上在该节点创建一个新的pod,以保证每个节点都运行一个pod。

DaemonSet滚动更新

DaemonSet有两种更新策略类型:

  • OnDelete:这是向后兼容性的默认更新策略。使用OnDelete更新策略,在更新DaemonSet模板后,只有在手动删除旧的DaemonSet pod时才会创建新的DaemonSet pod。这与Kubernetes1.5或更早版本中DaemonSet的行为相同。

  • RollingUpdate:使用RollingUpdate更新策略,在更新DaemonSet模板后,旧的DaemonSet pod将被终止,并且将以受控方式自动创建新的DaemonSet pod;默认类型是RollingUpdate。
kubectl edit ds nginx-ds

编辑DaemonSet,修改镜像版本,保存退出,这时各节点的pod将会自动更新成新的镜像。

DaemonSet版本回滚

更新之后,查看更新记录

kubectl rollout history ds nginx-ds
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

根据版本号可以回滚到指定版本:

#根据版本号查看版本的内容
kubectl rollout history ds nginx-ds --revision=1
kubectl rollout history ds nginx-ds --revision=2

#根据版本号回滚到指定版本
kubectl rollout undo ds nginx-ds --to-revision=1
举报

相关推荐

0 条评论