当前位置: 首页 > article >正文

k8s主要控制器简述(二)DaemonSet|Job|CronJob

在 Kubernetes 中,DaemonSetJobCronJob 是三种常用的工作负载控制器,分别用于不同的场景。以下是它们的详细介绍和示例。


1. DaemonSet

DaemonSet 用于确保每个节点(或符合特定条件的节点)上都运行一个 Pod 的副本。它通常用于部署系统级别的守护进程,例如日志收集器、监控代理或网络插件。

特点

  • 每个节点一个 Pod:确保每个节点上都有且只有一个 Pod 副本。

  • 自动扩展:当新节点加入集群时,DaemonSet 会自动在新节点上创建 Pod。

  • 节点选择器:可以通过 nodeSelectoraffinity 选择特定节点运行 Pod。

  • 适合场景:部署节点级别的守护进程。

示例

以下是一个 DaemonSet 的示例,用于在每个节点上运行一个日志收集器(Fluentd):

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    metadata:
      labels:
        name: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:latest
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

解释

  • 这个 DaemonSet 会在每个节点上运行一个 Fluentd Pod,用于收集节点上的日志。

  • hostPath 卷将节点的 /var/log 目录挂载到 Pod 中,以便 Fluentd 可以访问日志文件。


2. Job

Job 用于运行一次性任务。它会创建一个或多个 Pod,并确保这些 Pod 成功完成任务。如果 Pod 失败,Job 会重新创建 Pod,直到任务成功完成或达到重试次数限制。

特点

  • 一次性任务:适合运行批处理任务或一次性任务。

  • 任务完成:任务完成后,Pod 不会自动删除,除非手动清理。

  • 并行性:可以通过 parallelismcompletions 字段控制任务的并行度和完成次数。

  • 适合场景:数据处理、备份、测试等一次性任务。

示例

以下是一个 Job 的示例,用于运行一个简单的批处理任务:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

解释

  • 这个 Job 会运行一个 Perl 脚本,计算 π 的值到 2000 位小数。

  • restartPolicy: Never 表示任务完成后 Pod 不会重启。

  • backoffLimit: 4 表示任务失败后最多重试 4 次。


3. CronJob

CronJob 是基于 Job 的扩展,用于定期运行任务。它类似于 Linux 中的 Cron 任务,可以按照指定的时间表执行 Job。

特点

  • 定时任务:按照 Cron 格式的时间表执行任务。

  • 基于 Job:每次执行时创建一个 Job。

  • 适合场景:定期备份、数据清理、定时报告等周期性任务。

示例

以下是一个 CronJob 的示例,用于每天凌晨 3 点运行一次数据备份任务:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: backup
spec:
  schedule: "0 3 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: busybox
            args:
            - /bin/sh
            - -c
            - tar czf /backup/data-$(date +%Y%m%d).tar.gz /data
          restartPolicy: OnFailure

解释

  • schedule: "0 3 * * *" 表示每天凌晨 3 点执行任务。(分时日月周)

  • jobTemplate 定义了每次执行时创建的 Job。

  • 这个任务会使用 busybox 镜像,将 /data 目录打包备份,并保存为 /backup/data-YYYYMMDD.tar.gz


4. 对比总结

特性DaemonSetJobCronJob
用途在每个节点上运行守护进程运行一次性任务定期运行任务
Pod 生命周期长期运行任务完成后停止每次执行时创建 Job,任务完成后停止
并行性每个节点一个 Pod支持并行任务支持并行任务
适合场景日志收集、监控代理、网络插件数据处理、备份、测试定期备份、数据清理、定时报告
调度方式自动扩展到新节点手动触发或通过 CronJob 触发基于 Cron 格式的时间表

5. 使用场景示例

  • DaemonSet

    • 在每个节点上运行日志收集器(如 Fluentd)。

    • 在每个节点上运行监控代理(如 Prometheus Node Exporter)。

    • 在每个节点上运行网络插件(如 Calico、Weave)。

  • Job

    • 运行数据处理任务(如批量导入数据)。

    • 运行测试任务(如自动化测试脚本)。

    • 运行备份任务(如数据库备份)。

  • CronJob

    • 每天凌晨 3 点运行数据备份任务。

    • 每周日晚上 10 点运行数据清理任务。

    • 每小时运行一次监控报告生成任务。


6. 总结

  • DaemonSet:用于在每个节点上运行守护进程,适合系统级别的任务。

  • Job:用于运行一次性任务,适合批处理任务或测试任务。

  • CronJob:用于定期运行任务,适合周期性任务。

应用场景说明

在 Kubernetes 中,DaemonSetJobCronJob 是三种常用的工作负载控制器,它们分别适用于不同的应用场景。以下是对它们的详细应用场景说明,并结合实际示例帮助理解。


1. DaemonSet 的应用场景

DaemonSet 用于确保每个节点(或符合特定条件的节点)上都运行一个 Pod 的副本。它通常用于部署系统级别的守护进程或节点特定的服务。

典型应用场景

(1)日志收集

在每个节点上运行日志收集器(如 Fluentd、Filebeat),收集节点和容器的日志,并发送到集中式日志存储(如 Elasticsearch)。

示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    metadata:
      labels:
        name: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:latest
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

说明

  • 这个 DaemonSet 会在每个节点上运行 Fluentd,收集节点的 /var/log 和容器的日志。


(2)监控代理

在每个节点上运行监控代理(如 Prometheus Node Exporter),收集节点的系统指标(如 CPU、内存、磁盘使用率)。

示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
      - name: node-exporter
        image: prom/node-exporter:latest
        ports:
        - containerPort: 9100
      hostNetwork: true
      hostPID: true

说明

  • 这个 DaemonSet 会在每个节点上运行 Prometheus Node Exporter,暴露节点的系统指标。


(3)网络插件

在每个节点上运行网络插件(如 Calico、Weave),为 Pod 提供网络连接和策略管理。

示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: calico-node
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: calico-node
  template:
    metadata:
      labels:
        k8s-app: calico-node
    spec:
      containers:
      - name: calico-node
        image: calico/node:latest
        env:
        - name: DATASTORE_TYPE
          value: "kubernetes"

说明

  • 这个 DaemonSet 会在每个节点上运行 Calico 网络插件,为 Pod 提供网络功能。


2. Job 的应用场景

Job 用于运行一次性任务,确保任务成功完成。它适合处理批处理任务或临时任务。

典型应用场景

(1)数据处理

运行批处理任务,例如数据导入、数据转换或数据分析。

示例

apiVersion: batch/v1
kind: Job
metadata:
  name: data-import
spec:
  template:
    spec:
      containers:
      - name: importer
        image: data-importer:latest
        command: ["python", "import.py"]
      restartPolicy: Never
  backoffLimit: 4

说明

  • 这个 Job 会运行一个数据导入任务,完成后 Pod 会自动停止。


(2)备份任务

运行数据库备份或文件备份任务。

示例

apiVersion: batch/v1
kind: Job
metadata:
  name: db-backup
spec:
  template:
    spec:
      containers:
      - name: backup
        image: mysql:latest
        command: ["mysqldump", "-h", "db-host", "-u", "root", "-ppassword", "mydb", ">", "/backup/mydb.sql"]
      restartPolicy: OnFailure

说明

  • 这个 Job 会运行一个 MySQL 数据库备份任务,将数据导出到 /backup/mydb.sql


(3)测试任务

运行自动化测试任务,例如单元测试或集成测试。

示例

apiVersion: batch/v1
kind: Job
metadata:
  name: run-tests
spec:
  template:
    spec:
      containers:
      - name: tester
        image: test-runner:latest
        command: ["pytest", "/tests"]
      restartPolicy: Never

说明

  • 这个 Job 会运行一个测试任务,完成后 Pod 会自动停止。


3. CronJob 的应用场景

CronJob 用于定期运行任务,类似于 Linux 中的 Cron 任务。它适合处理周期性任务。

典型应用场景

(1)定期备份

每天或每周定期运行数据库备份任务。

示例

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: daily-backup
spec:
  schedule: "0 3 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: mysql:latest
            command: ["mysqldump", "-h", "db-host", "-u", "root", "-ppassword", "mydb", ">", "/backup/mydb-$(date +%Y%m%d).sql"]
          restartPolicy: OnFailure

说明

  • 这个 CronJob 会在每天凌晨 3 点运行一次数据库备份任务。


(2)数据清理

定期清理过期数据或临时文件。

示例

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cleanup
spec:
  schedule: "0 0 * * 0"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cleaner
            image: busybox
            command: ["find", "/data", "-type", "f", "-mtime", "+7", "-delete"]
          restartPolicy: OnFailure

说明

  • 这个 CronJob 会在每周日凌晨 0 点运行一次数据清理任务,删除 /data 目录下超过 7 天的文件。


(3)定时报告

定期生成监控报告或业务报告。

示例

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: report-generator
spec:
  schedule: "0 6 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: report
            image: report-generator:latest
            command: ["python", "generate_report.py"]
          restartPolicy: OnFailure

说明

  • 这个 CronJob 会在每天早晨 6 点运行一次报告生成任务。


4. 总结

控制器应用场景示例任务
DaemonSet节点级别的守护进程,如日志收集、监控代理、网络插件Fluentd、Prometheus Node Exporter、Calico
Job一次性任务,如数据处理、备份、测试数据导入、数据库备份、自动化测试
CronJob周期性任务,如定期备份、数据清理、定时报告每天备份、每周清理、定时生成报告


http://www.kler.cn/a/597701.html

相关文章:

  • OpenCV图像拼接(5)用于计算一组图像的特征点和描述符的函数computeImageFeatures()
  • 数据结构之基本队列-顺序结构实现-初始化-判断队列是否为空(front=rear)-出队-入队-队尾满了,调整队列-获取队头元素
  • Redis原理--持久化
  • EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代
  • 2025-03-22 学习记录--C/C++-C 库函数 - getchar()
  • Java 方法执行原理底层解析
  • HTML——什么是块级元素,什么是内联元素,有何区别
  • 高端网站设计:艺术与科技的完美融合,引领数字新风尚
  • 【人工智能-前端OpenWebUI】--图表显示
  • python:调用 ui2 获取当前页面所有实时文本
  • 数据结构-----树
  • OAK相机入门(四):近距离深度图
  • 2025_0321_生活记录
  • Winform在工控行业对比Wpf的优势?
  • 双核锁步技术在汽车芯片软错误防护中的应用详解
  • 在大数据开发中ETL是指什么?
  • 如果没有负载均衡,普通路由器怎么实现叠加两条宽带的带宽?
  • 组合总数||| 电话号码的字母组合
  • Ranger 鉴权
  • 基于C语言实现的观察者模式 以温度监控系统为例