DaemonSet
DaemonSet简介
DaemonSet守护进程简称DS,适用于在所有node节点或部分节点运行一个daemon守护进程,,DaemonSet具有如下特点:
- DaemonSet确保所有节点运行一个Pod副本
- 指定节点运行一个Pod副本,通过标签选择器或者节点亲和性
- 新增节点会自动在节点增加一个Pod
- 移除节点时垃圾回收机制会自动清理Pod

DaemonSet适用于每个node节点均需要部署一个守护进程的场景,常见的场景例如:
- 日志采集agent,如fluentd或logstash
- 监控采集agent,如Prometheus Node Exporter,Sysdig Agent,Ganglia gmond
- 分布式集群组件,如Ceph MON,Ceph OSD,glusterd,Hadoop Yarn NodeManager等
- k8s必要运行组件,如网络flannel,weave,calico,kube-proxy等
安装k8s时默认在kube-system命名空间已经安装了有两个DaemonSet,分别为网络插件和kube-proxy,分别负责overlay网络的互通和service代理的实现
1 | [root@master ~]# kubectl get ds -n kube-system |
DaemonSet定义
DaemonSet的定义和Deployment定义使用相类似,需要定义apiVersion,Kind,metadata和spec属性信息,spec中不需要定义replicas个数,spec.template即定义DS生成容器的模版信息,如下是运行一个fluentd-elasticsearch镜像容器的daemon守护进程,运行在每个node上通过fluentd采集日志上报到ElasticSearch。
1 | apiVersion: apps/v1 #api版本信息 |
DaemonSet支持滚动更新,即先终止旧的pod,再创建一个新的pod,逐步进行替换的。
DaemonSet实例
ds-demo.yaml如下:
1 | apiVersion: apps/v1 |
如上,filebeat-ds是由环境变量REDIS_HOST与redis通信的。创建所需要的资源:
1 | kubectl apply -f ds-demo.yaml |
测试redis是否收到日志:
1 | [root@master k8s_study]# kubectl exec -it filebeat-ds-mt4fx -- /bin/sh |
Job
Job简介
Jobs是kubernetes中实现一次性计划任务的Pod控制器—JobController,通过控制Pod来执行任务,其特点为:
- 创建Pod运行特定任务,确保任务运行完成
- 任务运行期间节点异常时会自动重新创建Pod
- 支持并发创建Pod任务数和指定任务数
Jobs任务运行方式有如下三种:
- 运行单个Jobs任务,一般运行一个pod,pod运行结束任务运行完成;
- 运行特定数量的任务,通过completion指定总计运行任务;
- 并发运行任务,通过parallelism指定并发数
运行单个Jobs任务
定义一个jobs任务,通过在command中运行特定一个脚本,将当前的时间打印100次:
1 | apiVersion: batch/v1 |
运行如下:
1 | [root@master ~]# kubectl get jobs.batch |
YMAL文件重要字段:
- spec.template格式同Pod
- RestartPolicy仅支持Never或OnFailure
- 单个Pod时,默认Pod成功运行后Job即结束
.spec.completions标志Job结束需要成功运行的Pod个数,默认为1.spec.parallelism标志并行运行的Pod的个数,默认为1spec.activeDeadlineSeconds标志失败Pod的重试最大时间,超过这个时间不会继续重试
CronJobs
CronJobs简介
CronJobs用于实现类似Linux下的cronjob周期性计划任务,CronJobs控制器通过时间线创建Jobs任务,从而完成任务的执行处理,其具有如下特点:
- 实现周期性计划任务
- 调用Jobs控制器创建任务
- CronJobs任务名称小于52个字符
- 应用场景如:定期备份,周期性发送邮件
CronJobs可通过schedule指定任务运行的周期,其使用参数和cronjob类似,分别使用:分时日月星5个参数表示周期性,其中*表示任意时间点,/表示每隔多久,-表示范围
- 分钟 范围为0-59
- 小时 范围为0-23
- 日期 范围为1-31
- 月份 范围为1-12
- 星期 范围为0-7,其中0和7表示星期日
举例子说明:
*/1 * * * *表示每隔1分钟运行任务1 0 * * 6-7表示每周六日的0点01分运行任务
其用法跟crontab类似。
运行Cronjobs任务
1 | apiVersion: batch/v1beta1 |
上述yaml等同于:
1 | kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster" |
加上 -o yaml --dry-run可以看到跟上面的yaml基本上是等同的。
yaml字段说明:
- .
spec.schedule:调度,必需字段,指定任务运行周期,格式同 Cron .spec.jobTemplate:Job 模板,必需字段,指定需要运行的任务,格式同 Job.spec.startingDeadlineSeconds:启动 Job 的期限(秒级别),该字段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的 Job 将被认为是失败的。如果没有指定,则没有期限.spec.concurrencyPolicy:并发策略,该字段也是可选的。它指定了如何处理被 Cron Job 创建的 Job 的 并发执行。只允许指定下面策略中的一种:- Allow (默认):允许并发运行 Job
- Forbid :禁止并发运行,如果前一个还没有完成,则直接跳过下一个
- Replace :取消当前正在运行的 Job,用一个新的来替换
- 注意,当前策略只能应用于同一个 Cron Job 创建的 Job。如果存在多个 Cron Job,它们创建的 Job 之间总 是允许并发运行。
.spec.suspend:挂起,该字段也是可选的。如果设置为 true ,后续所有执行都会被挂起。它对已经开始 执行的 Job 不起作用。默认值为 false.spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit:历史限制,是可选的字段。它 们指定了可以保留多少完成和失败的 Job。默认情况下,它们分别设置为 3 和 1 。设置限制的值为 0 ,相 关类型的 Job 完成后将不会被保留。
运行如下:
1 | [root@master ~]# kubectl create -f cronjob.yaml |
参考资料
- DaemonSet:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
- Job:https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
- CronJob:https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/
- Kubernetes学习之路(十三)之Pod控制器—DaemonSet
- kubernetes系列教程(十二)详解DaemonSet控制器
- kubernetes系列教程(十三)一次性任务Job和周期任务