
一、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
