文章目录
一、DaemonSet
控制器介绍:
- DaemonSet 可以确保全部(或者某些)节点上运行一个 Pod 的副本。
- 当有节点加入集群时, 也会给这新节点新增一个 Pod 。
- 当有节点从集群移除时,此节点上的Pod 会被回收。
- 删除 DaemonSet 将会删除它创建的所有 Pod。
应用场景:
- 属于运维层面上的技术,常常用在网络插件、监控Agent、日志Agent等场景。
- 在每个Node上都运行一个GlusterFS存储或者Ceph存储的Daemon进程。
- 在每个Node上都运行一个日志采集程序,例如Fluentd或者Logstach。
- 在每个Node上都运行一个性能监控程序,采集该Node的运行性能数据,例如Prometheus Node Exporter、collectd、New Relic agent或者Ganglia gmond等。
Daemon Pod如何被调度的?
- 最开始DaemonSet调度和普通的Pod调度不同,使用的是专有DaemonSet Controller调度器,而不是默认Scheduler调度器,后面就出现很多矛盾问题。
- 继而在1.18版本后,DaemonSet的调度默认切换到Kubernetes Scheduler进行,因此DaemonSet也能正确处理Taints和Tolerations的问题。
daemon pod特点:
- daemonset pod名称: daemonset名字-随机字符串
- deployment pod名称: deployment名称-RS名称-随机字符串
概念图:
1.编辑yaml文件。
[root@k8s-master bck]# cat web1.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: web4
spec:
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
2.导入查看,每个node上都部署了一个pod。
3.若某个节点存在污点时,导入yaml后不会创建Pod,直至污点被删除或者配置污点容忍。我这里是node1存在污点,node2没有,所有再次导入后pod只被创建在node2节点上,node1没有。
4.此时可以删除node1上污点,再导入yaml文件,就会在node1节点上创建pod。
二、Job
基本了解:
- Job在实际的应用场景中用的比较少,因为它的用法特殊,所以特定行业领域或者针对性的工作才会用到。比如发送电子邮件、渲染视频帧、编解码文件、NoSQL 数据库中扫描主键范围等等。
概念:
- 通过K8s Job资源对象来定义并启动一个批处理任务。批处理任务通常并行(或者串行)启动多个计算进程去处理一批工作项(Work item),处理完成后,整个批处理任务结束。
特点:
- Job 会创建一个或者多个 Pod,并将继续重试 Pod 的执行,直到指定数量的 Pod 成功终止。
- 当Pod成功结束,Job跟踪记录成功完成的Pod个数。 当数量达到指定的成功个数阈值时,Job任务结束。
- 删除 Job 的操作会清除所创建的全部 Pod。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。
批处理任务4种模式:
- Job Template Expansion模式:一个Job对象对应一个待处理的Work item,有几个Work item就产生几个独立的Job,通常适合Work item数量少、每个Work item要处理的数据量比较大的场景,比如有一个100GB的文件作为一个Work item,总共有10个文件需要处理。
- Queue with Pod Per Work Item模式:采用一个任务队列存放Work item,一个Job对象作为消费者去完成这些Work item,在这种模式下,Job会启动N个Pod,每个Pod都对应一个Work item。
- Queue with Variable Pod Count模式:也是采用一个任务队列存放Work item,一个Job对象作为消费者去完成这些Work item,但与上面的模式不同,Job启动的Pod数量是可变的。
- Single Job with Static Work Assignment模式,也是一个Job产生多个Pod,但它采用程序静态方式分配任务项,而不是采用队列模式进行动态分配。
Job三种类型:
- Non-parallel Jobs:通常一个Job只启动一个Pod,除非Pod异常,才会重启该Pod,一旦此Pod正常结束,Job将结束。
- Parallel Jobs with a fixed completion count:并行Job会启动多个Pod,此时需要设定Job的.spec.completions参数为一个正数,当正常结束的Pod数量达至此参数设定的值后,Job结束。此外,Job的.spec.parallelism参数用来控制并行度,即同时启动几个Job来处理Work item。
- Parallel Jobs with a work queue:任务队列方式的并行Job需要一个独立的Queue,Work item都在一个Queue中存放,不能设置Job的.spec.completions参数,此时Job有以下特性:
- 每个Pod都能独立判断和决定是否还有任务项需要处理。
- 如果某个Pod正常结束,则Job不会再启动新的Pod。
- 如果一个Pod成功结束,则此时应该不存在其他Pod还在工作的情况,它们应该都处于即将结束、退出的状态。
- 如果所有Pod都结束了,且至少有一个Pod成功结束,则整个Job成功结束。
模式 | 是否是单个Job 对象 | Pod 数是否少于工作条目数 | 是否需要直接使用应用无需修改 |
---|---|---|---|
Job Template Expansion模式 | \ | \ | 是 |
Queue with Pod Per Work Item模式 | 是 | \ | 有时 |
Queue with Variable Pod Count模式 | 是 | \ | \ |
Single Job with Static Work Assignment模式 | 是 | \ | 是 |
1.创建一个Job任务用来计算 π 到小数点后 2000 位,并将结果打印出来。
[root@k8s-master ~]# cat job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
ttlSecondsAfterFinished: 20 ##TTL机制,在job结束20秒后会被自动删除。
backoffLimit: 5 ##若有pod失败,则Job重试,该参数代表job重试次数。
activeDeadlineSeconds: 20 ## Job运行时间达到20秒后,其下所有运行中的 Pod 都会被终止,并更新job状态。
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
[root@k8s-master ~]# kubectl apply -f job.yaml
2.查看计算结果。
三、Cronjob
基本了解:
- CronJob 创建基于时隔重复调度的 Job,类似Linux Cron的定时任务,常用于执行排期操作,例如数据备份、生成报告等。
- 采用Cron 格式编写, 并周期性地在给定的调度时间执行 Job。
- CronJob仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。
Cron时间表语法:
注意事项:
- 问号” ? “和星号” * “含义相同,都表示给定字段的任何可用值。
- ” * “:表示匹配该域的任意值,假如在Minutes域使用“*”,则表示每分钟都会触发事件。
- ” / “:表示从起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域设置为5/20,则意味着第1次触发在第5min时,接下来每20min触发一次,将在第25min、第45min等时刻分别触发。
1.创建一个cronjob,周期性的执行Job任务,每分钟打印出当前时间和问候消息。
[root@k8s-master ~]# cat cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
concurrencyPolicy: Allow ##并发规则,可选有Forbid、Replace、Allow,默认为Allow允许并发。
failedJobsHistoryLimit: 1 ##应保留多少失败的任务。
startingDeadlineSeconds: 20 ##控制器统计在过去 20 秒中错过了多少次 Job。
successfulJobsHistoryLimit: 3 ##应保留已完成的任务。
suspend: false ##是否调度挂起,默认为false。
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
[root@k8s-master ~]# kubectl apply -f cronjob.yaml
2.查看创建的cronjob、job和pod。job名称是在cronjob名称后面多了一串随机字符,pod名称是在job名称后面多了一串随机字符。
3.查看日志。
4.查看cronjob定期执行任务情况。
5.删除。