1、简介
Deployment和DaemonSet资源主要用于部署和管理守护进程型的应用程序,如nginx、mysql、java进程等。这类应用程序的特点是持续运行,通常在没有明确停止或下线的情况下一直保持运行状态。此外,kubernetes还提供了Job和CronJob资源,用于管理一次性任务和定时任务,如计算任务、数据备份、数据转换等,这类应用程序通常在需要时运行,并在完成后自动结束
2、Job
- 假设有一项计算圆周率值的任务,我们可以使用job来完成这项任务。以下是job资源的配置示例
[root@k8s-master k8s]# cat job-pi.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: uhub.service.ucloud.cn/librarys/perl:latest
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Neve
在上述实例中,该job定义了一个perl容器。容器启动后,执行命令 perl -Mgignum......来计算圆周率的值(3.1415926........)。将重启策略restaPolicy字段设置为never,表示当容器终止后不会自动重启容器
[root@k8s-master k8s]# kubectl apply -f job-pi.yaml
[root@k8s-master k8s]# kubectl apply -f job-pi.yaml
NAME COMPLETIONS DURATION AGE
pi 0/1 36s 36s
[root@k8s-master k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pi-gv6c7 0/1 ContainerCreating 0 2s
可以看到pod的status是创建中
[root@k8s-master k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pi-gv6c7 1/1 Running 0 4s
可以看到pod的status是running中,说明容器在执行任务重。等待约1min,任务执行完成状态转为Completed。
[root@k8s-master k8s]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
pi 0/1 8s 8s
COMPLETIONS: 0/1 表示该 Job 的一个任务还没有完成。
[root@k8s-master k8s]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
pi 1/1 8s 10s
COMPLETIONS: 1/1 表示该 Job 的任务已经完成(Job 只需要完成 1 个任务)。
[root@k8s-master k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pi-gv6c7 0/1 Completed 0 15s
READY: 0/1 表示 Pod 中的容器已经停止运行,任务完成。
STATUS: Completed 表示 Pod 已经成功完成了它的工作,这意味着 Pod 中的任务已经结束,不再需要保持运行。
[root@k8s-master k8s]# kubectl logs pi-gv6c7
3.141592653.......
通过查看pod日志获取计算结果
如果pod启动失败,job会不断的创建新的pod,直到重试次数到达上限,重试次数由backoffLimit字段设置,默认值为6,既最多重试创建6个pod,每次创建建哥时间呈指数级增加(10s、20s、40s。。。。),其最长延迟为5min
任务完成后,job对象和生成的pod不会自动删除,需要手动删除对应的job对象
[root@k8s-master ~]# kubectl delete job pi
job.batch "pi" deleted
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pi-gv6c7 0/1 Completed 0 24h
pod-pretstop 1/1 Running 9 (69m ago) 18d
[root@k8s-master ~]# kubectl delete pod pi-gv6c7
pod "pi-gv6c7" deleted
3、Cronjob
- 假设有一项定期执行数据备份的任务,可以使用Cronjob来完成这项任务。以下是Cronjob资源的配置示例
[root@k8s-master k8s]# cat cronjob-mysql-backup.yaml
apiVersion: batch/v1
kind: Cronjob
metadata:
name: mysql-bakcup
spec:
schedule: "0 1 * * *"
jobTemplate:
spec:
template:
spec:
containers:
image: mysql:5.7
command:
- /bin/sh
- -c
- mysqldump -h IP地址或主机名 -u username -p password database > /opt/database_$(date +\%Y\%m\%d).sql
restartPolicy: OnFailure
- 字段含义如下
schedule:设置调度时间的表达式,语法格式与linux系统上的Crontab相同,cron表达式:* * * * * 分 时 日 月 周。这里值为 0 1 * * *表示每天凌晨1点执行
jobTemplate:定义执行的任务模版,其中包含一个mysql容器。容器启动后,执行MySQLdump命令,将远程MySQL数据库导出为sql文件
restartPolicy:重启策略,这里将其设置为onfailure,表示当容器异常退出时(退出状态码为非0)自动重启容器
[root@k8s-master k8s]# kubectl apply -f cronjob-mysql-backup.yaml
cronjob.batch/mysql-bakcup created
[root@k8s-master k8s]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
mysql-bakcup 0 1 * * * False 0 <none> 32s
NAME:名称
SCHEDULE:调度时间
SUSPEND:是否挂起
ACTIVE:当前活跃的任务数
LAST SCHEDULE:最近一次调度时间
AGE:创建时间
Cronjob是基于job实现的,它是通过定期创建一个新的job对象来执行一次任务。默认情况下,只保留最近成功完成的3个job对象,我们可以通过sucessfullJobHistoryLimit字段来设置保留成功的job数量
如果间隔时间较多,则可能会出现两个job同时存在的情况,既上一个job还没有执行完成,下一个pod已启动。Cronjob允许这种情况发生,该行为由concurrencyPolicy字段控制,并具有以下可选值:
- Allow:默认值,允许多并发执行多个相同的job
- Forbid:禁止并发相同的job。如果上一个job没有执行完成,则跳过下一个job
- Replace:如果上一个job没有执行完成,则新的job会替换正在运行的job
如果不需要再定期执行这个任务,只需要删除对应的Cronjob对象即可
[root@k8s-master k8s]# kubectl delete cronjob mysql-bakcup
cronjob.batch "mysql-bakcup" deleted