一、什么是DaemonSet

DaemonSet(守护进程集)和守护进程类似,它在符合匹配条件的节点上均部署一个Pod。

DaemonSet 确保全部(或者某些)节点上运行一个Pod副本。当有新节点加入集群时,也会为它们新增一个Pod。当节点从集群中移除时,这些Pod也会被回收,删除DaemonSet将会删除它创建的所有Pod。

  • DaemonSet的典型场景

    • 运行集群存储daemon(守护进程),例如在每个节点上运行Glusterfs、Ceph等。
    • 在每个节点运行日志收集daemon,例如filebeat、Logstash。
    • 在每个节点运行监控daemon,比如Prometheus Node Exporter。

二、配置文件 fluentd-ds.yaml ( 此处以 fluentd 应用为例 )

apiVersion: apps/v1
kind: DaemonSet    # 类型为 DaemonSet 的资源
metadata: 
  name: fluentd
spec:
  template:
    metadata:
      labels:
        app: logging
        id: fluentd
      name: fluentd
    spec:
      containers:
      - name: fluentd-es
        image: agilestacks/fluentd-elasticsearch:v1.3.0
        env:
         - name: FLUENTD_ARGS
           value: -qq
        volumeMounts:
         - name: containers
           mountPath: /var/lib/docker/containers
         - name: varlog
           mountPath: /varlog
      volumes:
         - hostPath:
             path: /var/lib/docker/containers
           name: containers
         - hostPath:
             path: /var/log
           name: varlog

三、指定 Node 节点

DaemonSet 会忽略 Node 的 unschedulable 状态,有两种方式来指定 Pod 只运行在指定的 Node 节点上:

1. nodeSelector:只调度到匹配指定 label 的 Node 上

  • 先为 Node 打上标签
# 这里给 k8s-node1 打上 `svc_type=microsvc` 的标签
kubectl label nodes k8s-node1 svc_type=microsvc
  • 查看节点信息
  • 然后再 daemonset 配置中设置 nodeSelector
spec:
  template:
    spec:
      nodeSelector:
        svc_type: microsvc
  • 完整 yaml:
apiVersion: apps/v1
kind: DaemonSet # 类型为 DaemonSet 的资源
metadata:
  name: fluentd
spec:
  selector:
    matchLabels:
      app: logging
  template:
    metadata:
      labels:
        app: logging
        id: fluentd
      name: fluentd
    spec:
      nodeSelector:
        svc_type: microsvc
      containers:
      - name: fluentd-es
        image: agilestacks/fluentd-elasticsearch:v1.3.0
        env:
         - name: FLUENTD_ARGS
           value: -qq
        volumeMounts:
         - name: containers
           mountPath: /var/lib/docker/containers
         - name: varlog
           mountPath: /varlog
      volumes:
         - hostPath:
             path: /var/lib/docker/containers
           name: containers
         - hostPath:
             path: /var/log
           name: varlog
  • 根据配置文件创建 DaemonSet
kubectl create -f fluentd-ds.yaml

  • 查看 DaemonSet
  • 查看对应的pod 信息, 看出部署了一台pod, 且在 k8s-node1 的节点部署了服务, 其他节点不会部署

-- 最后, 我们将 k8s-node2节点上也加上svc_type=microsvc标签, 然后查看 ds 信息

2. nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作

3. podAffinity:调度到满足条件的 Pod 所在的 Node 上

四、滚动更新

不建议使用 RollingUpdate,建议使用 OnDelete 模式,这样避免频繁更新 ds

  • 相关配置
spec:
  template:
    spec:
      ...
    ....
  
  updateStrategy:# 更新策略
    #rollingUpdate:  # 滚动更新
    #  maxSurge: 0
    #  maxUnavailable: 1
    #type: RollingUpdate
    
    type: OnDelete # 删除更新
最后修改:2023 年 09 月 11 日
如果觉得我的文章对你有用,请点个赞吧~