1、DaemonSet
什么是 DaemonSet
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 副本。当有 Node 加入集群时,会自动在其增加一个 Pod,简单来说就是在每一个Node上运行一个副本
典型用法:
- 运行集群存储 daemon,例如 glusterd、ceph
- 在每个 Node 上运行日志收集 daemon,如 fluentd、logstash
- 在每个 Node 上运行监控 daemon,如 Prometheus Node Exporter、collectd、Datadog代理、New Relic代理,或Ganglia gmond
示例:
[root@m1 yaml]# cat daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
app: daemonset
spec:
selector:
matchLabels:
name: daemonset-example
template:
metadata:
labels:
name: daemonset-example
spec:
containers:
- name: daemonset-example
image: docker.harbor.com/library/nginx:v1
[root@m1 yaml]# kubectl create -f daemonset.yaml
daemonset.apps/daemonset-example created
结果:
可以看到在两个节点上分别运行了一个副本
[root@m1 yaml]# kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset-example 2 2 2 2 2 <none> 10s
[root@m1 yaml]# kubectl get daemonset -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
daemonset-example 2 2 2 2 2 <none> 16s daemonset-example docker.harbor.com/library/nginx:v1 name=daemonset-example
[root@m1 yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-example-dxvst 1/1 Running 0 28s 10.244.1.36 m2-n1 <none> <none>
daemonset-example-lqmbr 1/1 Running 0 28s 10.244.2.34 m3-n2 <none> <none>
2、Job
- spec.template格式同Pod
- RestartPolicy仅支持Never或OnFailure
- 单个Pod时,默认Pod成功运行后Job即结束
- .spec.completions 标志Job结束需要成功运行的Pod个数,默认为1
- .spec.parallelism 标志并行运行的Pod的个数,默认为1
- spec.activeDeadlineSeconds 标志失败Pod的重试最大时间,超过这个时间不会继续重试
示例:
示例中在perl镜像启动后执行任务,任务执行后可通过查看日志的方式查看到 派π的2000位
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never ##用不重启
查看任务执行情况
可以看到任务数为1,如果完成结果为 1/1 未完成就是0/1
kubectl get job
3、CronJob
CronJob 管理基于时间的 Job,即:
- 在给定时间点只运行一次
- 周期性的在给定时间的运行
前提条件是kubernetes版本 >=1.8
CronJob Spec
- .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完成后将不会被保留。
示例:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the kubernetes cluster
restartPolicy: OnFailure
查看
kubectl get cronjob
kubectl get job
删除
kubectl delete cronjob hello