文章目录

  • 一、DaemonSet控制器理论知识
  • 1、DaemonSet控制器是什么?
  • 2、DaemonSet控制器工作原理
  • 3、DaemonSet典型应用场景
  • 4、DaemonSet与Deployment的区别
  • 二、案例:DaemonSet控制器实战演示
  • 1、使用DaemonSet部署日志收集组件
  • 2、DaemonSet管理Pod滚动更新
  • 三、总结


一、DaemonSet控制器理论知识

中文官方文档参考:

1、DaemonSet控制器是什么?

Kubernetes中的DaemonSet(简写ds)控制器是一种用来运行守护进程应用程序的控制器,它确保每个Node节点都运行具有指定配置的 Pod副本,当Node节点的加入或删除DaemonSet控制器会自动创建或删除相应的 Pod副本。

特点:

  1. 每个节点只运行一个实例:DaemonSet确保每个节点上只运行一个 Pod 实例。这确保了在每个节点上部署的守护进程能够与主机紧密结合,以提供更高的可用性和可靠性。
  2. 滚动升级:在更新 DaemonSet 时,可以通过几种不同的方式控制滚动升级。可以选择一次更新所有 Pod 实例,也可以在运行新版本之前逐步删除旧的 Pod 实例。
  3. 在启动前执行任务:可以通过 DaemonSet 的

2、DaemonSet控制器工作原理

DaemonSet控制器会监听K8s的daemonset对象、pod对象、node对象,如果这些被监听的对象变动,就会触发syncLoop循环,让K8s集群朝着daemonset对象描述的状态进行演进。

3、DaemonSet典型应用场景

  • 日志和指标收集:在每个节点上运行日志和指标收集器,比如flunentd 、 logstash、filebeat等。
  • 数据存储:在每个节点上运行数据存储,比如glusterd 、ceph等。
  • 监控组件:在每个节点上运行监控组件,比如prometheus、node_exporter、collectd等。

4、DaemonSet与Deployment的区别

  • deployment创建出来的Pod,会分布在各个Node节点,每个节点都可能运行好几个副本。
  • daemonset创建出来的Pod,每个Node节点上最多只能运行一个Pod副本,通常用来运行后台服务和守护进程应用程序。

因此,一般情况下,如果要部署后台服务和守护进程等单节点应用程序,可以使用DaemonSet;如果需要部署复杂的应用程序,如Web服务等,那就需要使用deployment了。

二、案例:DaemonSet控制器实战演示

1、使用DaemonSet部署日志收集组件

部署 fluentd 日志收集组件(只简单演示DaemonSet使用,并非做ELK整体实验)YAML资源清单如下:

cat fluentd-daemonset.yaml 
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: elasticsearch-fluentd
  namespace: default
spec:
  selector:
    matchLabels:
      app: elasticsearch-fluentd
  template:
    metadata:
      labels:
        app: elasticsearch-fluentd
    spec:
      tolerations:              # 定义容忍度,运行在master节点运行(根据自己master的污点定义)
      - effect: NoSchedule  
        key: node-role.kubernetes.io/control-plane
      volumes:                 # 定义卷名称为 system-log
      - name: system-log
        hostPath: 
          path: /var/log
      containers:
      - name: elasticsearch-fluentd
        image: qinziteng/fluentd:2.5.1 
        imagePullPolicy: IfNotPresent
        resources:              # 定义资源限制
          requests:
            cpu: 100m
            memory: 300Mi
          limits:
            memory: 300Mi
        volumeMounts:
        - name: system-log    # 使用system-log卷,挂载到容器/var/log目录
          mountPath: /var/log

执行YAML文件:

kubectl apply -f fluentd-daemonset.yaml

查看Pod状态,如下图可以看到分包在K8s集群每个节点上创建Pod

kubectl get pods -o wide

【Kubernetes资源篇】DaemonSet控制器入门实战详解_docker

2、DaemonSet管理Pod滚动更新

DaemonSet更新策略在 spec.updateStrategy 字段定义,目前支持两种更新策略:

  • rollingUpdate:由于daemonset不支持一个节点运行多个Pod,所以rollingUpdate更新策略是先删除在更新。
  • OnDelete:默认不做更新,需要手动删除后更新。

第一步:创建daemonset资源并使用 nginx:1.18.0 镜像,YAML 如下:

cat web-daemonset.yaml 
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: web-daemonset
  namespace: default
spec:
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      app: web-daemonset
  template:
    metadata:
      labels:
        app: web-daemonset
    spec:
      tolerations:            
      - effect: NoSchedule    # 容忍度根据master 污点定义
        key: node-role.kubernetes.io/control-plane
      containers:
      - name: web-daemonset
        image: nginx:1.18.0
        imagePullPolicy: IfNotPresent
        resources:             
          requests:
            cpu: 100m
            memory: 300Mi
          limits:
            memory: 300Mi

执行YAML 文件:

kubectl apply -f web-daemonset.yaml

查看Pod状态:

kubectl get pods -o wide -l app=web-daemonset

【Kubernetes资源篇】DaemonSet控制器入门实战详解_容器_02

第二步:更新镜像使用nginx:latest

只更改image地方,其余地方不做操作,然后重新apply 使其生效。

【Kubernetes资源篇】DaemonSet控制器入门实战详解_容器_03

kubectl apply -f web-daemonset.yaml

第三步:验证镜像是否更新

kubectl describe pod web-daemonset-2vtd9|grep Image

【Kubernetes资源篇】DaemonSet控制器入门实战详解_docker_04

可以看到镜像版本更新成功了,这种更新其实就是先删除旧版本,再使用新的镜像版本进行创建。

三、总结

  • DaemonSet控制器用于控制每个Node节点有运行指定Pod副本集,当添加或删除Node节点时,DaemonSet会自动创建指定的Pod副本集,来保证每一个Node节点都运行此Pod。用于收集日志、监控等场景。
  • DaemonSet rollingUpdate更新策略是先删除旧版本Pod,在创建新版本Pod,因为每个Node节点只能创建一个Pod副本集。