D23 kubernetes 工作负载资源对象-Job与CronJob

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,表示当容器终止后不会自动重启容器
  • 创建job资源
[root@k8s-master k8s]# kubectl apply -f job-pi.yaml
  • 查看job对象
[root@k8s-master k8s]# kubectl apply -f job-pi.yaml
NAME   COMPLETIONS   DURATION   AGE
pi     0/1           36s        36s
  • 查看pod
[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)自动重启容器
  • 创建Cronjob资源
[root@k8s-master k8s]# kubectl apply -f cronjob-mysql-backup.yaml
cronjob.batch/mysql-bakcup created
  • 查看Cronjob
[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
posted @ 2024-09-24 16:15  Hello_worlds  阅读(8)  评论(0编辑  收藏  举报