惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
S
SegmentFault 最新的问题
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
N
Netflix TechBlog - Medium
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Martin Fowler
Martin Fowler
雷峰网
雷峰网
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络
k8s之Job和CronJob
zhengwenfeng · 2022-08-31 · via 郑文峰的博客

# Job

# 什么是Job?

该对象是用来执行运行一段时间后会退出的任务。

# 使用Job

使用yaml描述Job对象,其中restartPolicy是重启策略,需要设定为OnFailure,代表着如果失败则重启,如果是正常执行完成退出,则不需要再次启动。默认的值是Always,会保持着该Pod总是运行的。

template下的Pod模板,Job通过该模板来创建Pod。

apiVersion: batch/v1
kind: Job
metadata:
  name: echo-job

spec:
  template:
    spec:
      restartPolicy: OnFailure
      containers:
      - image: busybox
        name: echo-job
        command: ["/bin/echo"]
        args: ["hello", "world"]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

使用yaml文件创建Job,然后查看job的pod对象,会发现它的STATUS状态为Completed,因为该job正常完成结束退出了。

[root@k8s-worker1 zwf]# kubectl apply -f job.yaml -n zwf
job.batch/echo-job created

[root@k8s-worker1 zwf]# kubectl get pods -n zwf
NAME                       READY   STATUS      RESTARTS   AGE
echo-job-45pmc             0/1     Completed   0          5s

1
2
3
4
5
6

再来看下该Completed的log,会发现已经输出了hello world

[root@k8s-worker1 zwf]# kubectl logs echo-job-45pmc  -n zwf
hello world

1
2

Job的参数

  • activeDeadlineSeconds,设置 Pod 运行的超时时间。

  • backoffLimit,设置 Pod 的失败重试次数。

为什么不直接在Pod上实现,而要新创建对象Job?

保持单一原则,将业务特性与容器管理分开。

# CronJob

# 什么是ConJob?

该对象用于定时任务。

# 使用CronJob

使用Yaml描述CronJob对象,会发现该对象多了一个schedule字段,这个是用来描述定时任务周期的规则,jobTemplate是Job对象的模板,也就是在定时周期内不断创建Job对象来达到定时任务的目的,也是一种组合的方式。


apiVersion: batch/v1
kind: CronJob
metadata:
  name: echo-cj

spec:
  schedule: '*/1 * * * *'
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - image: busybox
            name: echo-cj
            imagePullPolicy: IfNotPresent
            command: ["/bin/echo"]
            args: ["hello", "world"]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

使用定义的Yaml创建CronJob

[root@k8s-worker1 zwf]# kubectl apply -f cronjob.yaml -n zwf
cronjob.batch/echo-cj created

[root@k8s-worker1 zwf]# kubectl get cronjob -n zwf
NAME      SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
echo-cj   */1 * * * *   False     1        1s              2m24s

1
2
3
4
5
6

等待3分钟后,创建了3个CronJob的Pod,并且通过AGE可以发现是每分钟创建一个。

[root@k8s-worker1 zwf]# kubectl get pods -n zwf
NAME                       READY   STATUS      RESTARTS   AGE
echo-cj-27698578-jtfxm     0/1     Completed   0          2m23s
echo-cj-27698579-cdzxg     0/1     Completed   0          83s
echo-cj-27698580-rfp72     0/1     Completed   0          23s

1
2
3
4