Kubernetes DaemonSet、Job与CronJob控制器原理

Kubernetes DaemonSet、Job与CronJob控制器原理

_

一、DaemonSet

1. kube-proxy的特殊性

kube-proxy作为Kubernetes集群的核心网络组件,以容器的形式封装在Pod中,同时需要在集群的每个节点上持续运行,以实现服务代理和负载均衡能力。

[Step1] 查看kube-system命名空间下的所有Pod,能够看到每个节点上都运行了一个kube-proxy。

root@k8s-master:~# kubectl get pods -n kube-system -o wide

传统的Replicaset控制器仅能保证Pod的副本数量恒定,无法满足每个节点运行一个实例的调度需求,因此这里应用需要通过DaemonSet控制器实现调度与管理。

2. DaemonSet概述

DaemonSet可以保证集群全部或指定节点上常驻运行单个Pod副本。新节点接入集群时自动部署对应Pod,节点下线后自动回收相关Pod。删除DaemonSet资源,其创建的所有Pod也会一并清除。DaemonSet适用于需要逐节点部署运行的服务场景,典型案例如Zabbix监控客户端Agent。

1.1 DaemonSet的典型应用场景

  • 集群节点守护进程部署

  • 全节点日志采集服务

  • 节点级监控采集服务

1.2 DaemonSet与Deployment区别

  • Deployment控制全局总副本数,集群中随意调度,不关心落在具体哪个节点

  • DaemonSet控制每个符合条件的节点各一个,强制节点级部署,用于节点级组件

3. DaemonSet基础案例

[Step1] 查看当前集群中的所有节点信息。

root@k8s-master:~# kubectl get nodes

[Step2] 本地新建YAML清单,定义DaemonSet资源描述模板。

root@k8s-master:~# vim busybox-daemonset.yml
​
# 写入下列内容
apiVersion: apps/v1     # 固定语法
kind: DaemonSet         # 资源类型
metadata:
  name: busybox-daemonset
  labels:               # 定义标签
    app: busybox-label  # 自定义标签(键和值均可自定义)
spec:
  selector:
    matchLabels:            # 标签匹配模式:精确匹配
      app: busybox-label    # 匹配的标签值
  template:
    metadata:   
      labels:           # 给Pod加上标签,需要和selector定义一致
        app: busybox-label
    spec:
      containers:
        - name: busybox
          image: busybox:latest
          imagePullPolicy: IfNotPresent
          command: ['sh','-c','sleep 3600']

[Step3] 基于YAML清单向Kubernetes集群声明式地创建DaemonSet资源。

root@k8s-master:~# kubectl create -f busybox-daemonset.yml

[Step4] 验证:基于YAML文件中定义的资源,查询它的运行状态。这个时候可能会存在疑惑,DaemonSet本应在每个节点上部署一个Pod,当前集群中一共存在三个节点,为什么只生成了两个Pod。究其原因,k8s集群里的Master主节点默认带有调度污点,禁止调度运行业务类Pod,所有DaemonSet仅会在普通工作节点上部署业务容器。

root@k8s-master:~# kubectl get -f busybox-daemonset.yml

[Step5] 验证:查看当前集群中所有节点的污点,能够看到k8s-master主节点携带污点,不允许将普通业务Pod调度到身上。

root@k8s-master:~# kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints

[Step6] 验证:查看所有Pod的详细信息,能够看到busybox-daemonset已经在两个工作节点上分别创建一个Pod。

root@k8s-master:~# kubectl get pod -o wide

[Step7] 将DaemonSet创建的Pod删除,过一会能够发现DaemonSet会自动启动一个新Pod。

root@k8s-master:~# kubectl delete pod busybox-daemonset-d8kp5
root@k8s-master:~# kubectl get pod -o wide

二、任务型控制器

1. 一次性任务场景

Deployment是Kubernetes中用于部署常驻型业务应用的核心控制器,能够确保指定数量的Pod副本持续运行,保障业务高可用。同时支持灵活的水平扩缩容,让业务负载始终处于最佳运行状态。DaemonSet则专门用于部署节点级守护进程,它会保证集群中的每个/指定节点上,都运行且只运行一个Pod实例。

在实际使用中,应该根据应用的业务属性选择控制器,面向业务服务的常驻应用,优先使用Deployment,面向节点级基础设施的守护进程,则应该使用DaemonSet。

对于需要执行一次性任务的场景,例如批量处理文件,需要启动一组Pod并行处理任务,等待任务执行完成后自动关闭所有Pod并释放资源,此时应该使用Job控制器。

2. Job概述

Job(任务控制器)在Kubernetes中用于执行一次性短时任务,确保指定任务成功完成,任务跑完后自动结束退出,不会长期常驻运行。

2.1 核心特点

  • 一次性执行:任务执行完毕后,Pod自动停止,不会重启常驻

  • 重试机制:任务执行失败可自动重试,直至运行成功

  • 完成计数:可设定成功完成任务总数,达到数量即结束

2.2 适用场景

  • 数据库定时备份、数据迁移

  • 批量数据处理、日志清理

  • 脚本一次性执行、离线计算任务

  • 初始化环境、一次性运维作业

3. CronJob概述

在日常应用中,存在定期或周期性执行任务的需求,这类场景可以通过CronJob实现。基于时间规则调度Job,支持单点单次执行、周期性重复执行,通过“Schedule”字段即可设定任务运行时间与执行周期。CronJob的适用场景如定时备份数据库、定时同步数据、报表统计、凌晨低峰跑批量任务等。

[Tricks] Schedule的格式与Linux中的crontab命令类似,可以通过查看“/etc/crontab”文件查看书写语法。

root@k8s-master:~# cat /etc/crontab

4. Job基础案例

[Step1] 本地新建YAML清单,定义Job资源描述模板。

root@k8s-master:~# vim perl-job.yml

# 写入下列内容
apiVersion: batch/v1	# 固定语法
kind: Job				# 资源类型
metadata:
  name: perl
spec:
  template:
    spec:
      containers:
        - name: perl
          image: perl:latest
          imagePullPolicy: IfNotPresent
          command: ["perl","-e","print 'Hello World!\n';"]
      restartPolicy: Never		# 只能选择Never或OnFailure
  backoffLimit: 4				# 指定Job失败后重试次数

[Step2] 基于YAML清单向Kubernetes集群声明式地创建Job资源。

root@k8s-master:~# kubectl create -f perl-job.yml

[Step3] 验证:在集群中查询“perl-job.yml”文件定义的资源状态,能够看到的状态为“Complete”,代表Job任务执行完毕。

root@k8s-master:~# kubectl get -f perl-job.yml

[Step4] 验证:查看Pod的运行日志,能够看到我们在YAML文件中定义的输出信息。

root@k8s-master:~# kubectl logs perl-jn9sj

5. CronJob基础案例

[Step1] 本地新建YAML清单,定义CronJob资源描述模板。

root@k8s-master:~# vim perl-cronjob.yml

# 写入下列内容
apiVersion: batch/v1	# 固定语法
kind: CronJob			# 资源类型
metadata:
  name: perl-cronjob
spec:
  # 定时规则,书写语法等同于/etc/crontab
  schedule: "*/1 * * * *"
  # Job模板,每次定时触发都会创建一个Job
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: perl-cronjob
              image: perl:latest
              imagePullPolicy: IfNotPresent
              command: ["perl","-e","print 'Hello!\n';"]
          restartPolicy: OnFailure	# 重启策略,失败才重启,成功不重启

[Step2] 基于YAML清单向Kubernetes集群声明式地创建CronJob资源。

root@k8s-master:~# kubectl create -f perl-cronjob.yml

[Step3] 验证:查看当前集群中所有Job任务的运行状态,能够看到刚刚创建的CronJob任务。

root@k8s-master:~# kubectl get cronjobs.batch

[Step4] 验证:实时显示Pod状态变化,能够看到“perl-cronjob”定时任务每隔1分钟自动触发,依次经历Pod等待、容器创建后,快速完成任务并进入“Completed”状态。

root@k8s-master:~# kubectl get pods -w

[Step5] 验证:可能会存在疑惑,CronJob每次执行都会生成一条记录,那么是否会导致历史信息无限堆积。其实不会出现这种问题,通过查看“perl-cronjob”的详细信息,能够看到定时任务仅保留最近3条成功任务记录以及1条失败任务记录,旧的历史Pod会自动清理,避免资源冗余。

root@k8s-master:~# kubectl describe cronjobs.batch perl-cronjob

[Step6] 可以通过修改下列值设置保留历史记录条数。

root@k8s-master:~# vim perl-cronjob.yml

# 写入下列内容
apiVersion: batch/v1
kind: CronJob
metadata:
  name: perl-cronjob
# 在spec下添加下列两行
spec:
  failedJobsHistoryLimit: 5
  successfulJobsHistoryLimit: 5

[Step7] 可以通过子命令“explain”查看官方字段说明。

root@k8s-master:~# kubectl explain cronjob.spec.failedJobsHistoryLimit
root@k8s-master:~# kubectl explain cronjob.spec.successfulJobsHistoryLimit


Kubernetes Service与服务发现 2026-08-27

评论区