Kubernetes(k8s)-DaemonSet介绍

一文读懂DaemonSet以及实践攻略 ❤️ 摘要: 在 Kubernetes 集群中,DaemonSet 是用于在每个(或特定)节点上运行一个 Pod 副本的控制器。通常情况下,DaemonSet 用于部署集群中的基础服务,如日志收集、监控代理、网络插件等。这些服务需要在每个节点上运行,以确保对整个集群的全面覆盖和管理。这篇博客会带着读者将详细了解 DaemonSet 的核心概念、适用场景,并展示如何通过实际案例来创建和管理 DaemonSet 阅读详情

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

上一小节我们讲解的Deployment,虽然是整个k8s集群最常用的资源,并且默认的情况下他只会在node节点出现,但是我们有些业务是一个类似agent的操作,需要在每个节点都需要,并且只能有一个。这个时候使用deployment就不适合,这样的需求就更适合我们今天要讲的资源:DaemonSet,简称ds。

DaemonSet 是 Kubernetes 中的一种控制器,用于确保集群中的每个节点(或特定标签选择器匹配的节点)运行一个 Pod 的副本。与 Deployment 和 ReplicaSet 不同,DaemonSet 的主要用途是在所有节点上运行守护进程类的任务,例如日志收集、监控代理、存储卷插件等。

核心特性

节点覆盖:确保每个目标节点上都有一个 Pod 副本在运行。如果新节点加入集群并且满足标签选择器条件,DaemonSet 会自动创建一个新的 Pod 在该节点上运行。

更新策略:支持滚动更新,允许您安全地更新 DaemonSet 管理的 Pod,而不会影响整个集群的服务。可以配置最大不可用 Pod 数量来控制更新过程中的服务中断。

节点亲和性和容忍度:可以使用节点亲和性规则来指定哪些节点应该运行 DaemonSet 创建的 Pod。此外,还可以设置容忍度(Tolerations),以便 DaemonSet 的 Pod 能够调度到具有特定污点(Taints)的节点上。默认是每个节点都会有。

资源请求和限制:您可以为 DaemonSet 中的容器定义资源请求和限制,确保它们获得足够的计算资源,并避免过度消耗节点资源,后面会单独讲。

健康检查:可以为 DaemonSet 中的 Pod 配置 Liveness 和 Readiness 探针,以监控其健康状态并确保只有健康的 Pod 才会接收流量,这个后面也会单独讲。

持久化存储:如果需要,您可以为 DaemonSet 中的 Pod 配置持久卷(Persistent Volumes),以便它们能够访问持久化存储,这个后面也会单独讲。

使用场景

日志收集:如 Fluentd 或 Logstash,用于从各个节点收集日志。

监控代理:如 Prometheus Node Exporter 或 cAdvisor,用于监控节点和容器的性能指标。

网络插件:如 Calico 或 Flannel,用于提供网络功能。

存储插件:如 Ceph 或 GlusterFS 客户端,用于挂载分布式文件系统。

节点级别的任务:任何需要在每个节点上运行的任务都可以考虑使用 DaemonSet。

范例

下图是我们部署k8s的自动生成的两个ds,一个是网络插件,一个k8s的核心组件kube-proxy。这里我就没有单独额外创建ds,只把kube-proxy进行显示出来,里面的部分信息我进行删减,可以看这个配置文件并没有我们前面deployment的核心参数之一就是副本数量。

图片

    [root@master01 ~]# kubectl  get ds -n kube-system    kube-proxy   -o yaml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      annotations:
        deprecated.daemonset.template.generation: "1"
      labels:
        k8s-app: kube-proxy
      name: kube-proxy
      namespace: kube-system
    spec:
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          k8s-app: kube-proxy
      template:
        metadata:
          creationTimestamp: null
          labels:
            k8s-app: kube-proxy
        spec:
          containers:
          - command:   #启动命令
            - /usr/local/bin/kube-proxy
            - --config=/var/lib/kube-proxy/config.conf
            - --hostname-override=$(NODE_NAME)
            env:
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
            image: registry.aliyuncs.com/google_containers/kube-proxy:v1.23.12
            imagePullPolicy: IfNotPresent
            name: kube-proxy
            resources: {}
            securityContext:  #因为他需要操作系统的iptables,所以他这里使用了docker里面的特权模式
              privileged: true
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:     #这里的挂载实际上和docker -v 效果一样
            - mountPath: /var/lib/kube-proxy
              name: kube-proxy
            - mountPath: /run/xtables.lock
              name: xtables-lock
            - mountPath: /lib/modules
              name: lib-modules
              readOnly: true
          dnsPolicy: ClusterFirst
          hostNetwork: true   #这里采用的主机网络模式
          nodeSelector:       #只要有这个标签才会有创建pod
            kubernetes.io/os: linux  
          priorityClassName: system-node-critical
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          serviceAccount: kube-proxy  #pod的访问kube-apiserver的权限
          serviceAccountName: kube-proxy
          terminationGracePeriodSeconds: 30
          tolerations:
          - operator: Exists
          volumes:   #部分挂载信息是通过configmap进行引入的
          - configMap:  
              defaultMode: 420
              name: kube-proxy
            name: kube-proxy
          - hostPath:
              path: /run/xtables.lock
              type: FileOrCreate
            name: xtables-lock
          - hostPath:
              path: /lib/modules
              type: ""
            name: lib-modules
      updateStrategy:  #pod的更新模式
        rollingUpdate:
          maxSurge: 0
          maxUnavailable: 1
        type: RollingUpdate

    一般而言ds我们更新较少,因为他主要是作为辅助程序来提高的,而非业务程序。

    运维小路

    一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

    关注微信公众号《运维小路》获取更多内容。

    K8s架构|全面整理K8s的架构介绍 K8S架构与核心技术介绍 参考文献: https://jimmysong.io/kubernetes-handbook/concepts/concepts.html https://www.infoq.cn/article/kubernetes-and-cloud-native-applications-part01/ 文章目录K8S架构与核心技术介绍1. 架构图1.1 整体结构图1.2 组件间的协议1.3 master与node架构图1.4 分层架构图2. K8s核心技术概念2.1 API对象2.2 阅读详情

    相关推荐

    Kubernetes k8s学习笔记 尚硅谷王泽老师 由浅入深

    Kubernetes k8s学习笔记尚硅谷2019 这里写目录标题Kubernetes k8s学习笔记尚硅谷2019Kubernetes 特点Kubernetes 学习知识点Kubernetes 组件说明brog的架构K8S的架构 Kubernetes 特点 Kubernetes 学习知识点 Kubernetes 组件说明 brog的架构 k8s算是brog系统的GO语言版 Brog Master负责请求分发 分发到Broglet完成工作 BrogMaster节点最好三个以上且单数 Seched

    weixin_43691773的博客 4865

    K8S系列】深入解析DaemonSet

    Kubernetes是一个容器编排平台,其中DaemonSetKubernetes中的一个重要概念。DaemonSet是一种控制器,用于在集群内运行一组Pod,并确保每个节点上都有一个Pod副本在运行。 1.2 常用特性 下面是一些DaemonSet的常用特性: 只在特定的节点上运行Pod:可以使用NodeSelector或者NodeAffinity来限制DaemonSet的Pod只在特定的节点上运行。 根据节点的标签更新Pod:如果在集群中添加或删除了节点,Kubernetes会通过DaemonS

    颜淡慕潇 3万+

    kubernetes(K8S)学习(五):K8S进阶(Lifecycle......偏理论)

    本文介绍Kubernetes中Pod的进阶知识,主要包括五个方面:1) Pod的生命周期状态(Pending、Running、Succeeded、Failed、Unknown);2) 重启策略(Always、OnFailure、Never);3) 静态Pod的特点;4) 健康检查探针(livenessProbe、readinessProbe、startupProbe);5) ConfigMap的创建与使用。文章详细说明了每种状态和策略的具体含义,并提供了命令行创建ConfigMap的示例代码。这些内容帮助

    ꯭ 瞎꯭扯꯭蛋꯭的博客 2876

    KubernetesDaemonSet 详解

    Kubernetes 集群中,通常需要在每个节点上运行守护进程来监视节点健康状态、收集日志等,这些守护进程通常称为系统级守护进程,如 Kubernetes Cluster Autoscaler 和 Kubernetes DNS。使用 Deployment 或 StatefulSet 可以创建 Pod,这些 Pod 可以被调度到任何节点上运行,但是在某些情况下,需要确保每个节点上都运行着一个 Pod 副本 版本,即需要使用 DaemonSet

    陈书予 4090

    K8S系列(六)DaemonSet详解

    下面介绍第二个控制器:**DaemonSet。**同样的问题:如果我们没有 DaemonSet 会怎么样?下面有几个需求:DaemonSet 也是 Kubernetes 提供的一个 default controller,它实际是做一个守护进程的控制器,它能帮我们做到以下几件事情:这里用 fluentd 来做例子。DaemonSet 最常用的点在于以下几点内容:首先是存储,GlusterFS 或者 Ceph 之类的东西,需要每台节点上都运行一个类似于 Agent 的东西,DaemonSet 就能很好地满足这个

    林木森的博客 1万+

    K8s 守护进程之 DaemonSet:深入解析

    DaemonSetKubernetes中一个重要的资源对象,它确保每个节点上都运行一个Pod副本,常用于部署需要在每个节点上运行的守护进程或服务,如日志收集、节点监控等。本文将全面解析DaemonSet的基本概念、工作原理和高级特性。

    博客虽小,世界尽在其中 3921

    Kubernetesk8s)资源控制器Daemonset、Job、CronJob详细介绍

    什么是 DaemonSet DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一 个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod 使用 DaemonSet 的一些典型用法: 运行集群存储 daemon,例如在每个 Node 上运行 gluste...

    南宫乘风-Linux运维-虚拟化容器-Python编程 ownit.top 769

    K8s DaemonSet介绍

    Kubernetes 中的一种控制器,用于确保每个(或某些指定的)节点上运行一个 Pod 副本。它是为部署守护进程设计的,例如需要在每个节点上运行的任务或工具。在部署 DaemonSet 时,可以配置节点的**亲密性(Affinity)排斥性(Toleration)**属性来控制 Pod 的调度行为。

    开心 1221

    第144天学习打卡( Kubernetes DaemonSet k8s集群组件 k8s的核心概念)

    DaemonSet DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除Daemonet将会删除它创建的所有Pod。 使用DaemonSet的一些典型的用法: 运行集群存储daemon,例如在每个Node上运行glusterd、ceph。 在每个Node上运行日志收集daemon, 例如fluentd、logstash。 在每个Node上运行监控daemon,例如Prometheus N

    doudoutj的博客 279

    K8s: 控制器之DaemonSet对象和调度

    6 )DaemonSet 仅在某些节点上运行 Pod。5 )DaemonSet Pod选择器。4 )DaemonSet Pod模板。3 )DaemonSet 必须字段。

    Wang的专栏 1203

    K8S实战进阶

    官网文档:https://kubernetes.io/zh-cn/docs/reference/using-api/REST API 是 Kubernetes 系统的重要部分,组件之间的所有操作和通信均由 API Server 处理的 REST AP I调用,大多数情况下, API 定义和实现都符合标准的 HTTP REST 格式,可以通过kubectl命令管理工具或其他命令行工具来执行。控制管理器开启–horizontal-pod-autoscaler-use-rest-clients。

    xinxiaoyu_的博客 1492

    Kubernetes DaemonSet 详细介绍

    Kubernetes DaemonSet 是一种控制器资源,用于确保集群中所有(或部分)节点上都运行一个Pod副本。主要应用于日志收集(如Fluentd)、监控代理(如Prometheus Node Exporter)、网络插件等系统级守护进程。其特点包括自动匹配节点数量、绕过调度器直接指定节点、支持滚动更新和回滚等。通过nodeSelector、节点亲和性或容忍度可限制Pod运行范围。与Deployment相比,DaemonSet更专注于节点级别的系统服务部署。

    guigenyi的专栏 1701

    Filebeat on k8s 日志采集实战操作

    Filebeat是一个轻量级的开源日志文件和数据收集器,由 Elastic 公司开发,用于采集、解析和发送日志数据。在 Kubernetes 中,Filebeat通常用于采集容器日志,并将其发送到中央日志存储、分析或搜索工具,如 Elasticsearch、Logstash 或 Fluentd。以下是Filebeat在KubernetesFilebeat容器部署:首先,在Kubernetes集群中创建一个或多个Filebeat容器的Pod。这些Pod。

    别来沾边儿 1238

    Kubernetes in action-Kubernetes的pod

    pod是一组并置的容器,它是k8s最基本的构建模块,一个pod的上会有多个容器【很多时候也是只有一个容器】。当一个pod的有多个容器的时候也都是运行在一个工作节点上,即不会一个pod上的多个容器运行在多个节点上。同一个pod中的容器之间是部分隔离的虽然容器之间通过Linux的命名空间是隔离的,但是有时候我们并不希望单个容器之间是完全隔离的,而是让一个容器组内的容器之间可以共享一部分资源。

    m0_50149847的博客 1083

    K8S POD

    定义:在K8s中,容器是一种将应用程序及其依赖项打包在一起的轻量级、可移植和自包含的软件单元。特点轻量级:容器不需要额外的操作系统来运行应用程序,而是与宿主机共享操作系统内核,这使得容器的启动和停止更加迅速,并且可以在同一宿主机上运行更多的容器。可移植性:容器提供了一种统一的编排和部署方式,使得应用程序可以在不同的环境中轻松迁移和部署。隔离性:K8s容器能够实现隔离,使得不同的应用程序可以在同一台物理机或虚拟机上运行,彼此之间不会相互干扰。

    王小工小工历程 1848

    K8S实战

    Kubernetes还支持另外一种叫“静态Pod”的应用部署手段。“静态Pod”非常特殊,它不受Kubernetes系统的管控,不与apiserver、scheduler发生关系,所以是“静态”的。但既然它是Pod,也必然会“跑”在容器运行时上,也会有YAML文件来描述它,而唯一能够管理它的Kubernetes组件也就只有在每个节点上运行的kubelet了。“静态Pod”的YAML文件默认都存放在节点的 /etc/kubernetes/manifests 目录下,它是Kubernetes的专用目录。

    mchwq的博客 880

    k8s芜湖

    k8s部署、k8s pod管理和优化

    SPNOS__WCY的博客 1285

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

    只更改image地方,其余地方不做操作,然后重新apply 使其生效。查看Pod状态,如下图可以看到分包在K8s集群每个节点上创建Pod。DaemonSet更新策略在。第二步:更新镜像使用。

    2401_87033955的博客 298
    上一篇: Kubernetes(k8s)-Deployment介绍
    下一篇: Kubernetes(k8s)-StatefulSet介绍
    dessler
    博客等级 码龄20年 3056粉丝 434原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值