前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >K8S 1.26 这个新特性,支持大规模并行批处理工作负载

K8S 1.26 这个新特性,支持大规模并行批处理工作负载

作者头像
我的小碗汤
发布于 2023-03-20 01:55:36
发布于 2023-03-20 01:55:36
1.2K0
举报
文章被收录于专栏:我的小碗汤我的小碗汤

Kubernetes 1.26 版本包括一个稳定的 Job[1] 控制器实现,可以可靠地跟踪大量具有高并行度的作业。自 Kubernetes 1.22 以来, SIG Apps[2]WG Batch[3] 一直致力于这项基础改进。经过多次迭代和规模验证,现在这是 Job 控制器的默认实现。

与 Indexed completion mode[4]配合使用,Job controller 可以处理大规模并行批处理作业,支持多达 100k 个并发 Pod。

新的实现还使Pod 故障策略[5]的开发成为可能,该策略在 1.26 版本中处于 beta 阶段。

如何使用此功能?

要将作业跟踪与终结器一起使用,请升级到 Kubernetes 1.25 或更新版本并创建新作业。如果您有能力启用JobTrackingWithFinalizers feature gate[6] ,您也可以在 v1.23 和 v1.24 中使用此功能。

如果您的集群运行 Kubernetes 1.26,则使用终结器进行作业跟踪是一项稳定的功能。对于 v1.25,它位于功能门之后,您的集群管理员可能已明确禁用它 - 例如,如果您有不使用 beta 功能的策略。

升级前创建的作业仍将使用旧行为进行跟踪。这是为了避免向正在运行的 Pod 追溯添加终结器,这可能会引入竞争条件。

为了在大型作业上获得最佳性能,Kubernetes 项目建议使用Indexed completion mode[7]。在这种模式下,控制平面能够通过较少的 API 调用来跟踪作业进度。

如果您是批处理、HPC[8]AI[9]ML[10] 或相关工作负载的运算符开发人员,我们鼓励您使用 Job API 将准确的进度跟踪委托给 Kubernetes。如果 Job API 中缺少某些东西迫使您管理普通 Pod,Working Group Batch[11] 欢迎您提供反馈和贡献。

弃用通知

在该功能的开发过程中,控制平面将注释添加 `batch.kubernetes.io/job-tracking`[12] 到启用该功能时创建的作业中。

在 1.26 版本中,我们弃用了注解batch.kubernetes.io/job-tracking ,控制平面将停止在 Kubernetes 1.27 中添加它。随着这一变化,我们将删除遗留的作业跟踪实施。因此,Job 控制器将跟踪所有使用终结器的 Job,它会忽略没有上述终结器的 Pod。

在将集群升级到 1.27 之前,我们建议您确认没有 annotation 的正在运行的作业,或者等待这些作业完成。否则,您可能会观察到控制平面重新创建了一些 Pod。我们希望这不会影响任何用户,因为该功能自 Kubernetes 1.25 以来默认启用,为旧作业提供足够的缓冲区来完成。

新的实施解决了什么问题?

通常,Kubernetes 工作负载控制器(例如 ReplicaSet 或 StatefulSet)依赖于 Pod 或 API 中其他对象的存在来确定工作负载的状态以及是否需要替换。例如,如果属于 ReplicaSet 的 Pod 终止或不复存在,ReplicaSet 控制器需要创建一个替换 Pod 以满足所需的副本数 ( .spec.replicas)。

从一开始,Job 控制器也依赖 API 中 Pod 的存在来跟踪 Job 状态。Job 有完成[13]失败处理[14] 策略,需要完成的 Pod 的结束状态来确定是否创建替换 Pod 或将 Job 标记为已完成或失败。因此,Job 控制器依赖于 Pod,甚至是终止的 Pod,以保留在 API 中以跟踪状态。

这种依赖性使得对 Job 状态的跟踪变得不可靠,因为可以出于多种原因从 API 中删除 Pod,包括:

  • 垃圾收集器在节点宕机时移除孤立的 Pod。
  • 垃圾收集器在达到阈值时移除已终止的 Pod。
  • Kubernetes 调度程序抢占 Pod 以容纳更高优先级的 Pod。
  • 污点管理器驱逐一个不能容忍NoExecute污点的 Pod。
  • 外部控制器,不包含在 Kubernetes 中,或人工删除 Pod。

新的实施

当控制器需要在删除对象之前对对象采取操作时,它应该 向它管理的对象添加终结器。[15]终结器可防止对象从 API 中删除,直到移除终结器为止。一旦控制器完成清理并记录已删除的对象,它就可以从对象中删除终结器,并且控制平面从 API 中删除对象。

这就是新的 Job 控制器正在做的事情:在 Pod 创建期间添加终结器,并在 Pod 终止并在 Job 状态中说明后删除终结器。然而,事情并没有那么简单。

主要的挑战是至少涉及两个对象:Pod 和 Job。虽然终结器存在于 Pod 对象中,但执行状态存在于 Job 对象中。没有任何机制可以自动删除 Pod 中的终结器并更新 Job 状态中的计数器。此外,在给定的时间可能有多个终止的 Pod。

为了解决这个问题,我们实施了一个三阶段的方法,每个阶段都转化为一个 API 调用。

  1. 对于每个终止的 Pod,将 Pod 的唯一 ID (UID) 添加到存储在拥有作业的.status ( .status.uncountedTerminatedPods[16] )中的列表中。
  2. 从 Pod 中移除终结器。
  3. 原子地执行以下操作:
    • 从列表中删除 UID
    • 在作业的status中增加succeededfailed计数器总数。

作业控制器可能会在第 1 步和第 2 步中乱序接收 API 更改的结果,从而使问题更加复杂。我们通过为删除的终结器添加内存缓存来解决这个问题。

尽管如此,我们在测试阶段仍然遇到了一些问题,在某些情况下,一些 pod 会被终结器卡住(#108645[17]#109485[18]#111646[19])。因此,我们决定将 1.23 和 1.24 版本的功能门控切换为默认禁用。

解决后,我们重新启用了 1.25 版本的功能。从那时起,我们收到了客户通过 Job API 在他们的集群中同时运行数万个 Pod 的报告。看到这一成功,我们决定在 1.26 中将该功能升级到稳定版,作为我们长期承诺的一部分,使 Job API 成为在 Kubernetes 集群中运行大批量作业的最佳方式。

要了解有关该功能的更多信息,您可以阅读KEP[20]

参考资料

[1]

Job: https://kubernetes.io/docs/concepts/workloads/controllers/job/

[2]

自 Kubernetes 1.22 以来, SIG Apps: https://github.com/kubernetes/community/tree/master/sig-apps

[3]

WG Batch: https://github.com/kubernetes/community/tree/master/wg-batch

[4]

completion mode: https://kubernetes.io/docs/concepts/workloads/controllers/job/#completion-mode

[5]

Pod 故障策略: https://kubernetes.io/docs/concepts/workloads/controllers/job/#pod-failure-policy

[6]

feature gate: https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/

[7]

Indexed completion mode: https://kubernetes.io/docs/concepts/workloads/controllers/job/#completion-mode

[8]

HPC: https://en.wikipedia.org/wiki/High-performance_computing

[9]

AI: https://en.wikipedia.org/wiki/Artificial_intelligence

[10]

ML: https://en.wikipedia.org/wiki/Machine_learning

[11]

Working Group Batch: https://github.com/kubernetes/community/tree/master/wg-batch

[12]

batch.kubernetes.io/job-tracking: https://kubernetes.io/docs/reference/labels-annotations-taints/#batch-kubernetes-io-job-tracking

[13]

完成: https://kubernetes.io/docs/concepts/workloads/controllers/job/#completion-mode

[14]

失败处理: https://kubernetes.io/docs/concepts/workloads/controllers/job/#handling-pod-and-container-failures

[15]

终结器。: https://kubernetes.io/docs/concepts/overview/working-with-objects/finalizers/

[16]

.status.uncountedTerminatedPods: https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/job-v1/#JobStatus

[17]

#108645: https://github.com/kubernetes/kubernetes/issues/108645

[18]

#109485: https://github.com/kubernetes/kubernetes/issues/109485

[19]

#111646: https://github.com/kubernetes/kubernetes/pull/111646

[20]

KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/2307-job-tracking-without-lingering-pods

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes 1.28:Job 失效处理的改进
作者: Kevin Hannon (G-Research), Michał Woźniak (Google)
希里安
2023/10/30
2540
Kubernetes 1.28:Job 失效处理的改进
Kubernetes 1.21版本引入暂停作业特性
Job(作业)是 Kubernetes API 的重要组成部分。虽然其他类型的工作负载(如 Deployment、ReplicaSet、StatefulSet 和 DaemonSet)解决了需要 Pod 永远运行的用例,但 Job 在 Pod 需要运行到完成时非常有用。Job 通常用于并行批处理,可以用于各种应用程序,从视频渲染和数据库维护到发送批量电子邮件和科学计算。
CNCF
2021/04/21
1.2K0
K8S 在 v1.27 中移除的特性和主要变更
随着 Kubernetes 发展和成熟,为了此项目的整体健康,某些特性可能会被弃用、移除或替换为优化过的特性。基于目前在 v1.27 发布流程中获得的信息,本文将列举并描述一些计划在 Kubernetes v1.27 发布中的变更, 发布工作目前仍在进行中,可能会引入更多变更。
我的小碗汤
2023/03/23
1.4K0
K8S 在 v1.27 中移除的特性和主要变更
Kubernetes 1.21引入Indexed Jobs特性
一旦你将一个非并行作业(Job[1])容器化,就很容易在 Kubernetes 上启动并运行它,而无需修改二进制文件。在大多数情况下,当运行并行分布式作业时,你必须设置一个单独的系统来在工作资源之间划分工作。例如,你可以设置一个任务队列,将一个工作项分配给每个 Pod[2],或将多个项分配给每个 Pod,直到队列清空为止[3]。
CNCF
2021/04/21
1.3K0
Kueue 介绍
作者:Abdullah Gharaibeh(谷歌),Aldo Culquicondor(谷歌)
CNCF
2022/11/28
2.7K0
Kubernetes 1.26 正式发布
这个版本总共包括 37 个增强:其中 11 个升级到 Stable,10 个升级到 Beta 版,16 个进入 Alpha 版。我们还有 12 个功能被弃用或删除,其中三个我们在本次宣布中会详细介绍。
灵雀云
2023/02/27
8040
Kubernetes 1.26 正式发布
图解 K8S 1.26 新功能 Pod 调度就绪特性解析
Kubernetes 1.26 引入了 Pod 的一个新特性:scheduling gates。在 Kubernetes 中,调度门是告诉调度程序何时准备好考虑调度 Pod 的 keys。
我的小碗汤
2023/03/20
7980
图解 K8S 1.26 新功能 Pod 调度就绪特性解析
Kubernetes 1.26 正式发布,所有变化都在这儿了!
太平洋时间 2022 年 12 月 8 号 Kubernetes 正式发布了主题为 `Electrifying` 的 v1.26。
我的小碗汤
2023/03/20
1K0
Kubernetes 1.26 正式发布,所有变化都在这儿了!
k8s 关于Job与Cronjob
在Kubernetes 中通过创建工作负载资源 Job 可完成大型计算以及一些批处理任务。比如 Job 转码文件、获取部分文件和目录,机器学习中的训练任务等。这篇小作文我们一起来了解 k8s 中关于 job、cronjob 的内容。
你大哥
2021/11/02
8300
K8S 使用 TTL 控制器自动清理完成的 Job Pod
最近为集群 CI 默认添加了 .spec.ttlSecondsAfterFinished 参数, 以便在 cronjob 和 job 运行完成后自动清理过期 pod 。
老麦
2022/12/24
1.4K0
K8S 使用 TTL 控制器自动清理完成的 Job Pod
kubernetes系列教程(十三)一次性任务Job和周期任务
Windows下可以通过批处理脚本完成批处理任务,脚本运行完毕后任务即可终止,从而实现批处理任务运行工作,类似的任务如何在kubernetes中运行呢?答案是Jobs,Jobs是kubernetes中实现一次性计划任务的Pod控制器—JobController,通过控制Pod来执行任务,其特点为:
HappyLau谈云计算
2020/01/23
7.4K1
刚刚 Kubernetes 1.25 正式发布,所有变化都在这儿了
此版本带来了 40 项增强功能,略少于Kubernetes 1.24 中的 46 项。在这 40 项增强功能中,13 项正在升级到稳定版,10 项是对现有功能的不断改进,15 项是全新的,2 项是已弃用的功能。
我的小碗汤
2023/03/19
1.7K0
刚刚 Kubernetes 1.25 正式发布,所有变化都在这儿了
k8s架构与组件详解
k8s系统在设计是遵循c-s架构的,也就是我们图中apiserver与其余组件的交互。在生产中通常会有多个Master以实现K8s系统服务高可用。K8s集群至少有一个工作节点,节点上运行 K8s 所管理的容器化应用。
你大哥
2021/10/11
3.9K0
k8s架构与组件详解
K8S v1.26:CPUManager 正式发布,生产可用!
CPU 管理器是 kubelet 的一部分;kubelet 是 Kubernetes 的节点代理,能够让用户给容器分配独占 CPU。CPU 管理器自从 Kubernetes v1.10 进阶至 Beta[1], 已证明了它本身的可靠性,能够充分胜任将独占 CPU 分配给容器,因此采用率稳步增长, 使其成为性能关键型和低延迟场景的基本组件。随着时间的推移,大多数变更均与错误修复或内部重构有关, 以下列出了几个值得关注、用户可见的变更:
我的小碗汤
2023/03/20
6580
K8S v1.26:CPUManager 正式发布,生产可用!
Kubernetes v1.33 版本来了!
作者:Agustina Barbetta, Aakanksha Bhende, Udi Hofesh, Ryota Sawada, Sneha Yadav
希里安
2025/03/31
1830
Kubernetes v1.33 版本来了!
K8s:通过 PSA(Pod Security Admission) 定义K8s 集群安全基线
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/09/11
7160
K8s:通过 PSA(Pod Security Admission) 定义K8s 集群安全基线
K8S 1.28 这个功能已 GA,主机故障时服务能快速恢复
作者:Xing Yang (VMware) 和 Ashutosh Kumar (Elastic) 原文:https://t.hk.uy/b3Yq 译者:进击云原生
我的小碗汤
2023/09/08
3700
K8S 1.28 这个功能已 GA,主机故障时服务能快速恢复
k8s DaemonSet 介绍与实例
我们之前说k8s中使用deployment、statefulset工作负载资源来分别维护无状态和有状态应用。这篇小作文我们会学习如何使用DaemonSet来维护一个守护进程(应用)。
你大哥
2021/11/02
1.9K0
Kubernetes 1.24 正式发布,这里是功能总览!
Kubernetes 1.24 的发布日期从 4 月 19 日 移至 5 月 3 日[1]。现已正式发布。
我的小碗汤
2023/03/19
1.1K0
Kubernetes 1.24 正式发布,这里是功能总览!
为Pod标签编写一个控制器
Operators[1](操作器)被证明是在 Kubernetes 中运行有状态分布式应用程序的优秀解决方案。Operator SDK[2]等开源工具提供了构建可靠和可维护的操作器的方法,使扩展 Kubernetes 和实现自定义调度变得更容易。
CNCF
2021/07/07
8330
相关推荐
Kubernetes 1.28:Job 失效处理的改进
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档