K8S控制器-DaemonSet和Job概念、原理解读

艺帆风顺 发布于 2025-04-02 23 次阅读


一、DaemonSet控制器

 1、概述

    DaemonSet 是 Kubernetes 中的一种资源对象,它用于确保集群中的每个节点都运行着一个相同的 Pod 副本。与 Deployment 或 ReplicaSet 不同,它们会尽量确保在每个节点上运行指定数量的 Pod副本。 每当有新节点加入集群或者已有节点发生变化(如节点故障或节点扩容),DaemonSet 会自动在新节点上创建一个 Pod 副本,以确保集群的每个节点都具有所需的 Pod 实例。 DaemonSet 通常用于在集群的每个节点上运行一些特殊的系统级别任务,例如日志收集、监控代理或网络插件。它们还可用于确保集群中的每个节点都具有相同的配置或运行特定的系统服务。

    2、DaemonSet 工作原理:如何管理 Pod?

      1、创建:当你创建一个 DaemonSet 对象时,Kubernetes 控制器会检查集群中的每个节点,并在每个节点上创建一个 Pod 副本。2、调度:Pod 的调度是由 Kubernetes 调度器处理的。调度器会根据节点的资源可用性和调度策略,将 Pod 分配给适合的节点。通常情况下,每个节点只能运行一个 DaemonSet Pod 副本。 3、监控和自适应:一旦 DaemonSet 的 Pod 副本在节点上启动,Kubernetes 控制器会监视节点的状态。如果节点发生变化,比如节点故障、节点添加或移除,控制器将采取相应的措施来维持DaemonSet 的副本数量。例如,如果新节点加入集群,控制器将在新节点上创建一个 Pod 副本。 4、节点更新:当集群中的节点需要进行系统更新或升级时,DaemonSet 可以与节点的更新流程进行集成。你可以设置 DaemonSet 的更新策略,以确保在节点更新时,Pod 副本能够平滑地迁移到其他节点上,以保持集群的高可用性。 5、删除:如果你删除了一个 DaemonSet 对象,Kubernetes 控制器将停止在所有节点上运行的Pod 副本,并将它们从集群中删除。

      3、DaemonSet典型应用场景

        1、日志收集:你可以使用 DaemonSet 在每个节点上运行日志收集代理,例如 Fluentd 或Filebeat。这样可以确保每个节点的日志都被收集并发送到集中式日志存储或分析系统中。2、监控和指标收集:DaemonSet 可用于在每个节点上运行监控代理,例如 Prometheus Node Exporter,以收集节点级别的指标数据,如 CPU、内存、磁盘和网络使用情况。这有助于进行集群性能监控和故障排查。3、网络插件和代理:DaemonSet 可用于在每个节点上部署网络插件,例如 Calico、Flannel 或Weave,以提供集群内部和集群外部的网络功能,如网络隔离、负载均衡和服务发现。

        4、DaemonSet和Deployment的区别

          1、Pod 副本的数量:在 Deployment 中,你可以定义所需的 Pod 副本数量,Kubernetes 将确保在集群中运行指定数量的 Pod 副本。而在 DaemonSet 中,每个节点上只能运行一个 Pod 副本,DaemonSet 会自动在每个节点上创建 Pod。2、调度策略:Deployment 的 Pod 可以在集群中的任何节点上进行调度,调度器会根据节点的可用性和资源情况来选择合适的节点。而 DaemonSet 的 Pod 只能在每个节点上运行一个副本,无法在同一节点上运行多个相同的 Pod 副本。3、滚动更新:Deployment 支持滚动更新策略,可以控制 Pod 的版本升级过程,确保无中断地进行应用程序的更新。而 DaemonSet 通常用于运行系统级别的任务,不涉及滚动更新。4、故障恢复和节点变化:Deployment 在节点故障或节点扩容时,会自动将 Pod 副本重新调度到其他可用节点上,以确保高可用性。而 DaemonSet 会在新节点加入集群或节点发生变化时,在新节点上创建一个 Pod 副本,以保持在每个节点上都运行一个 Pod 副本。

          5、yaml编写

            apiVersion: apps/v1kind: DaemonSetmetadata: name: logs namespace: kube-system labels: name: kube-logsspec: selector: matchLabels: name: logs #标签选择器:选择相同标签的Pod template: metadata: labels: name: logs spec: tolerations:      - key: node-role.kubernetes.io/control-plane  #设置容忍度,因为控制节点默认拥有污点 effect: NoSchedule containers: - name : logs image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2 imagePullPolicy: IfNotPresent检查:kubectl get ds -n=kube-system -owide配置滚动更新apiVersion: apps/v1kind: DaemonSetmetadata: name: logs namespace: kube-system labels: name: kube-logsspec: updateStrategy: rollingUpdate:      maxSurge: 1  #运行多出来几个Pod      maxUnavailable: 1  #允许少的几个Pod,对于DaemonSet作用不大,因为他每个节点只有一个Pod selector: matchLabels: name: logs template: metadata: labels: name: logs spec: tolerations: - key: node-role.kubernetes.io/control-plane effect: NoSchedule containers: - name : logs image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2 imagePullPolicy: IfNotPresent

            二、Job

            1、概述

            在 Kubernetes 中,Job 是一种用于执行短暂任务的资源对象。它用于在集群中创建一个或多个Pod 来完成任务,确保任务成功完成后自动终止

            2、yaml编写

              apiVersion: batch/v1kind: Jobmetadata: name: new-job labels: name: jobsspec:  completions: 6  #总共6个完成状态才算完成  parallelism: 3   #并行执行3个,也就是同时启动3个 backoffLimit: 6 #总共6个失败才算失败 template: metadata: labels: app: test spec: restartPolicy: Never containers: - name: my-job image: busybox imagePullPolicy: IfNotPresent command: ['/bin/sh','-c'] args: ['echo 1234']查看kubectl get job