diff --git a/.vuepress/config-sidebar.js b/.vuepress/config-sidebar.js index 14a8cec..bd1c7b2 100644 --- a/.vuepress/config-sidebar.js +++ b/.vuepress/config-sidebar.js @@ -204,6 +204,8 @@ module.exports = { 'k8s-intermediate/workload/wl-job/spec', 'k8s-intermediate/workload/wl-job/failure', 'k8s-intermediate/workload/wl-job/cleanup', + 'k8s-intermediate/workload/wl-job/auto-cleanup', + 'k8s-intermediate/workload/wl-job/pattern', ] } ] diff --git a/learning/k8s-intermediate/workload/wl-job/auto-cleanup.md b/learning/k8s-intermediate/workload/wl-job/auto-cleanup.md new file mode 100644 index 0000000..1f44d85 --- /dev/null +++ b/learning/k8s-intermediate/workload/wl-job/auto-cleanup.md @@ -0,0 +1,56 @@ +--- +vssueId: 151 +layout: LearningLayout +description: Kubernetes中的Job对象将创建一个或多个Pod_并确保指定数量的Pod可以成功执行到进程正常结束_本文描述如何自动清理已经结束的Pod +meta: + - name: keywords + content: Kubernetes培训,K8S教程,K8S培训,Kubernetes Job +--- + +# Job的自动清理 + + + + + +系统中已经完成的 Job 通常是不在需要里的,长期在系统中保留这些对象,将给 apiserver 带来很大的压力。如果通过更高级别的控制器(例如 [CronJobs](../wl-cronjob/))来管理 Job,则 CronJob 可以根据其中定义的基于容量的清理策略(capacity-based cleanup policy)自动清理Job。 + +## TTL 机制 + +**FEATURE STATE:** `Kubernetes v1.12` alpha + +除了 CronJob 之外,TTL 机制是另外一种自动清理已结束Job(`Completed` 或 `Finished`)的方式: +* TTL 机制由 [TTL 控制器](../wl-ttl/) 提供 +* 在 Job 对象中指定 `.spec.ttlSecondsAfterFinished` 字段可激活该特性 + +当 TTL 控制器清理 Job 时,TTL 控制器将删除 Job 对象,以及由该 Job 创建的所有 Pod 对象。 +::: tip 删除Job +删除 Job 时,其生命周期函数将被触发,例如 finalizer +::: + +参考例子: + +``` sh {6} +apiVersion: batch/v1 +kind: Job +metadata: + name: pi-with-ttl +spec: + ttlSecondsAfterFinished: 100 + template: + spec: + containers: + - name: pi + image: perl + command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] + restartPolicy: Never +``` + +**字段解释 `ttlSecondsAfterFinished`:** +* Job `pi-with-ttl` 的 `ttlSecondsAfterFinished` 值为 100,则,在其结束 `100` 秒之后,将可以被自动删除 +* 如果 `ttlSecondsAfterFinished` 被设置为 `0`,则 TTL 控制器在 Job 执行结束后,立刻就可以清理该 Job 及其 Pod +* 如果 `ttlSecondsAfterFinished` 值未设置,则 TTL 控制器不会清理该 Job + +::: warning alpha +TTL 机制目前还是 alpha 状态,FEATURE GATE 为 `TTLAfterFinished`。更多信息请参考 [TTL 控制器](../wl-ttl/) +::: diff --git a/learning/k8s-intermediate/workload/wl-job/cleanup.md b/learning/k8s-intermediate/workload/wl-job/cleanup.md index c8dc3ad..b4a3cd8 100644 --- a/learning/k8s-intermediate/workload/wl-job/cleanup.md +++ b/learning/k8s-intermediate/workload/wl-job/cleanup.md @@ -34,7 +34,7 @@ Job 中 `.spec.activeDeadlineSeconds` 字段的优先级高于 `.spec.backoffLim 例如: -``` yaml +``` yaml {7} apiVersion: batch/v1 kind: Job metadata: diff --git a/learning/k8s-intermediate/workload/wl-job/index.md b/learning/k8s-intermediate/workload/wl-job/index.md index e48c338..407833b 100644 --- a/learning/k8s-intermediate/workload/wl-job/index.md +++ b/learning/k8s-intermediate/workload/wl-job/index.md @@ -7,7 +7,7 @@ meta: content: Kubernetes教程,K8S教程,K8S培训,Kubernetes Job --- -# 控制器 - Job +# 控制器 - Job Kuboard 正在计划中 diff --git a/learning/k8s-intermediate/workload/wl-job/pattern.md b/learning/k8s-intermediate/workload/wl-job/pattern.md index 4b055ff..8ea963d 100644 --- a/learning/k8s-intermediate/workload/wl-job/pattern.md +++ b/learning/k8s-intermediate/workload/wl-job/pattern.md @@ -7,7 +7,7 @@ meta: content: Kubernetes培训,K8S教程,K8S培训,Kubernetes Job --- -# Job设计模式 +# Job的模式 @@ -20,4 +20,42 @@ Kubernetes Job 对象可以用来支持 Pod 的并发执行,但是: * 渲染页面 * 转码文件 * 扫描 NoSQL 数据库中的主键 - * 等 + * 其他 + +在一个复杂的系统中,可能存在多种类型的工作任务,本文只考虑批处理任务(batch job)。 + +对于批处理任务的并行计算,存在着几种模式,它们各自有自己的优缺点: +* 每个工作任务一个 Job 对象 v.s. 一个 Job 对象负责所有的工作任务 + * 当工作任务特别多时,第二种选择(一个 Job 对象负责所有的工作任务)更合适一些 + * 第一种选择(每个工作任务一个 Job 对象)将为管理员和系统带来很大的额外开销,因为要管理很多数量的 Job 对象 +* Pod的数量与工作任务的数量相等 v.s. 每个Pod可以处理多个工作任务 + * 第一种选择(Pod的数量与工作任务的数量相等)通常只需要对现有的代码或容器做少量的修改 + * 第二种选择(每个Pod可以处理多个工作任务)更适合工作任务的数量特别多的情况,相较于第一种选择可以降低系统开销 +* 使用工作队列,此时: + * 需要运行一个队列服务 + * 需要对已有的程序或者容器做修改,以便其可以配合队列工作 + * 如果是一个已有的程序,改造时可能存在难度 + +他们的优缺点归纳如下表所示,其中第二列到第四列罗列了主要考虑的对比因素: + +| 模式 | 单个Job对象 | Pod的数量少于工作任务? | 是否修改已有代码? | 是否可兼容kube1.1 | +| ------------------------------------------------------------ | ----------- | ----------------------- | ------------------ | ----------------- | +| [Job Template Expansion](https://kubernetes.io/docs/tasks/job/parallel-processing-expansion/) | | | ✓ | ✓ | +| [Queue with Pod Per Work Item](https://kubernetes.io/docs/tasks/job/coarse-parallel-processing-work-queue/) | ✓ | | 有时候 | ✓ | +| [Queue with Variable Pod Count](https://kubernetes.io/docs/tasks/job/fine-parallel-processing-work-queue/) | ✓ | ✓ | | ✓ | +| Single Job with Static Work Assignment | ✓ | | ✓ | | + +当您指定 `.spec.completions` 时,Job 控制器创建的每个 Pod 都有一个相同的 [spec]()。这意味着,同一个 Job 创建的所有的 Pod 都使用: +* 相同的执行命令 +* 相同的容器镜像 +* 相同的数据卷 +* 相同的环境变量(例如,不同时间点创建的Pod,[Service的环境变量](/learning/k8s-intermediate/service/service-details.html#环境变量) 可能会不同) + +Job 的不同模式本质上讲,如何为一组工作任务分配 Pod。下表总结了不同的模式下 `.spec.parallelism` 和 `.spec.completions` 字段的设置。(表中 `w` 代表工作任务的数量) + +| 模式 | `.spec.completions` | `.spec.parallelism` | +| ------------------------------------------------------------ | ------------------- | ------------------- | +| [Job Template Expansion](https://kubernetes.io/docs/tasks/job/parallel-processing-expansion/) | 1 | should be 1 | +| [Queue with Pod Per Work Item](https://kubernetes.io/docs/tasks/job/coarse-parallel-processing-work-queue/) | W | any | +| [Queue with Variable Pod Count](https://kubernetes.io/docs/tasks/job/fine-parallel-processing-work-queue/) | 1 | Any | +| Single Job with Static Work Assignment | W | any | diff --git a/learning/k8s-intermediate/workload/wl-ttl/index.md b/learning/k8s-intermediate/workload/wl-ttl/index.md new file mode 100644 index 0000000..890c4a5 --- /dev/null +++ b/learning/k8s-intermediate/workload/wl-ttl/index.md @@ -0,0 +1,14 @@ +--- +vssueId: 151 +layout: LearningLayout +description: Kubernetes中 +meta: + - name: keywords + content: Kubernetes教程,K8S教程,K8S培训,Kubernetes TTL +--- + +# TTL 机制 + + + + diff --git a/package-lock.json b/package-lock.json index 8adf403..c57f28e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1556,6 +1556,11 @@ "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, + "animate.css": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/animate.css/download/animate.css-3.7.2.tgz", + "integrity": "sha1-5z4NUOkssc/vFZfZs4qUgQIOCOo=" + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-colors%2Fdownload%2Fansi-colors-3.2.4.tgz", @@ -12141,6 +12146,14 @@ "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=" }, + "vueg": { + "version": "1.4.5", + "resolved": "https://registry.npm.taobao.org/vueg/download/vueg-1.4.5.tgz", + "integrity": "sha1-UtVOEezeHmljaKJHpKoJ2Dbr+oQ=", + "requires": { + "animate.css": "^3.7.0" + } + }, "vuepress": { "version": "1.2.0", "resolved": "https://registry.npm.taobao.org/vuepress/download/vuepress-1.2.0.tgz", diff --git a/package.json b/package.json index 3202aa4..83dcb8f 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "esm": "^3.2.25", "npm": "^6.11.3", "reduce-css-calc": "^2.1.6", + "vueg": "^1.4.5", "vuepress": "^1.2.0", "vuepress-plugin-named-chunks": "^1.0.2" }