This commit is contained in:
huanqing.shao
2019-10-28 20:51:59 +08:00
parent 00e8c35471
commit df1c6afe10
20 changed files with 814 additions and 74 deletions

View File

@ -1,11 +1,98 @@
---
vssueId: 151
layout: LearningLayout
description: 本文描述了 Kubernetes Job 的概念、行为及用法
description: Kubernetes中的Job对象将创建一个或多个Pod_并确保指定数量的Pod可以成功执行到进程正常结束_当Job创建的 Pod执行成功并正常结束时_Job将记录成功结束的Pod数量_当成功结束的Pod达到指定的数量时_Job将完成执行
meta:
- name: keywords
content: Kubernetes教程,K8S教程,Kubernetes Job
content: Kubernetes教程,K8S教程,K8S培训,Kubernetes Job
---
# 控制器 - Job
正在撰写...
<AdSenseTitle>
</AdSenseTitle>
Kubernetes中的 Job 对象将创建一个或多个 Pod并确保指定数量的 Pod 可以成功执行到进程正常结束:
* 当 Job 创建的 Pod 执行成功并正常结束时Job 将记录成功结束的 Pod 数量
* 当成功结束的 Pod 达到指定的数量时Job 将完成执行
* 删除 Job 对象时,将清理掉由 Job 创建的 Pod
一个简单的例子是:创建一个 Job 对象用来确保一个 Pod 的成功执行并结束。在第一个 Pod 执行失败或者被删除(例如,节点硬件故障或机器重启)的情况下,该 Job 对象将创建一个新的 Pod 以重新执行。
当然,您也可以使用 Job 对象并行执行多个 Pod。
## 运行一个Job的例子
在下面这个 Job 的例子中Pod 执行了一个跟 π 相关的计算,并打印出最终结果,该计算大约需要 10 秒钟执行结束。
<<< @/.vuepress/public/statics/learning/job/job.yaml
* 执行如下命令创建该对象
``` sh
kubectl apply -f https://kuboard.cn/statics/learning/job/job.yaml
```
* 执行命令查看创建结果
``` sh
kubectl describe jobs/pi
```
输出结果如下
```
Name: pi
Namespace: default
Selector: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
Labels: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
job-name=pi
Annotations: <none>
Parallelism: 1
Completions: 1
Start Time: Tue, 07 Jun 2016 10:56:16 +0200
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
job-name=pi
Containers:
pi:
Image: perl
Port:
Command:
perl
-Mbignum=bpi
-wle
print bpi(2000)
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: pi-dtn4q
```
* 执行以下命令可查看所有结束的 Pod
``` sh
kubectl get pods
```
* 执行以下命令可获得该 Job 所有 Pod 的名字:
``` sh
pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath='{.items[*].metadata.name}')
echo $pods
```
输出结果如下
```
pi-aiw0a
```
在这个命令中:
* selector 与 Job 定义中的 selector 相同
* `--output=jsonpath` 选项指定了一个表达式,该表达式从返回结果列表中的每一个 Pod 的信息中定位出 `name` 字段的取值
* 执行以下命令可查看 Pod 的日志:
``` sh
kubectl logs $pods
```
输出结果如下:
```
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
```

View File

@ -0,0 +1,71 @@
---
vssueId: 151
layout: LearningLayout
description: Kubernetes中的Job对象将创建一个或多个Pod_并确保指定数量的Pod可以成功执行到进程正常结束_当Job创建的 Pod执行成功并正常结束时_Job将记录成功结束的Pod数量_当成功结束的Pod达到指定的数量时_Job将完成执行
meta:
- name: keywords
content: Kubernetes教程,K8S教程,K8S培训,Kubernetes Job
---
# 编写Job的定义
<AdSenseTitle>
与所有的 Kubernetes 对象一样Job 对象的 YAML 文件中,都需要包括如下三个字段:
* `.apiVersion`
* `.kind`
* `.metadata`
Job 对象的 YAML 文件,还需要一个 `.spec` 字段。
</AdSenseTitle>
## Pod Template
`.spec.template` 是必填字段:
* 用于定义 [pod template](/learning/k8s-intermediate/workload/pod.html#容器组和控制器)
* 与 Pod 有相同的字段内容但由于是内嵌元素pod template 不包括阿 `apiVersion` 字段和 `kind` 字段
* 除了 Pod 所需的必填字段之外Job 中的 pod template 必须指定
* 合适的标签 `.spec.template.spec.labels`,参考 [Pod Selector](#pod-selector)
* 指定合适的[重启策略 restartPolicy](/learning/k8s-intermediate/workload/pod-lifecycle.html#重启策略) `.spec.template.spec.restartPolicy`,此处只允许使用 `Never``OnFailure` 两个取值
## Pod Selector
`.spec.selector` 字段是可选的。绝大部分情况下,您不需要指定该字段。
## Parallel Jobs
有三种主要的任务类型适合使用 Job 运行:
* Non-parallel Jobs
* 通常,只启动一个 Pod除非该 Pod 执行失败
* Pod 执行成功并结束以后Job 也立刻进入完成 completed 状态
* Parallel Jobs with a fixed completion count
* `.spec.completions` 为一个非零正整数
* Job 将创建至少 `.spec.completions` 个 Pod编号为 1 - `.spec.completions` <Badge type="error">尚未实现</Badge>
* Job 记录了任务的整体执行情况,当 1 - `.spec.completions` 中每一个编号都有一个对应的 Pod 执行成功时Job 进入完成状态
* Parallel Jobs with a work queue
* 不指定 `.spec.completions`,使用 `.spec.parallelism`
* Pod 之间必须相互之间自行协调并发,或者使用一个外部服务决定每个 Pod 各自执行哪些任务。例如某个Pod可能从带工作队列work queue中取出最多N个条目的批次数据
* 每个 Pod 都可以独立判断其他同僚peers是否完成并确定整个Job是否完成
* 当 Job 中任何一个 Pod 成功结束,将不再为其创建新的 Pod
* 当所有的 Pod 都结束了,且至少有一个 Pod 执行成功后才结束,则 Job 判定为成功结束
* 一旦任何一个 Pod 执行成功并退出Job 中的任何其他 Pod 都应停止工作和输出信息,并开始终止该 Pod 的进程
completions 和 parallelism
* 对于 non-parallel Job`.spec.completions``.spec.parallelism` 可以不填写,默认值都为 1
* 对于 fixed completion count Job需要设置 `.spec.completions` 为您期望的个数;同时不设置 `.spec.parallelism` 字段(默认值为 1
* 对于 work queue Job不能设置 `.spec.completions` 字段,且必须设置 `.spec.parallelism` 为0或任何正整数
## Controlling Parallelism 并发控制
并发数 `.spec.parallelism` 可以被设置为0或者任何正整数如果不设置默认为1如果设置为 0则 Job 被暂停,直到该数字被调整为一个正整数。
实际的并发数(同一时刻正在运行的 Pod 数量)可能比设定的并发数 `.spec.parallelism` 要大一些或小一些,不一定严格相等,主要的原因有:
* 对于 fixed completion count Job实际并发运行的 Pod 数量不会超过剩余未完成的数量。如果 `.spec.parallelism` 比这个数字更大,将被忽略
* 对于 work queue Job任何一个 Pod 成功执行后,将不再创建新的 Pod (剩余的 Pod 将继续执行)
* Job 控制器可能没有足够的时间处理并发控制
* 如果 Job 控制器创建 Pod 失败(例如,[ResourceQuota](/learning/k8s-advanced/policy/rq.html) 不够用,没有足够的权限等)
* 同一个Job中在已创建的 Pod 出现大量失败的情况下Job 控制器可能限制 Pod 的创建
* 当 Pod 被优雅地关闭时gracefully shut down需要等候一段时间才能结束