Kubernetes 1.26:普遍可用的 Job 跟踪,以支持大规模并行批处理工作负载

2023-05-16

Kubernetes 1.26:普遍可用的 Job 跟踪,以支持大规模并行批处理工作负载

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

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

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

如何使用此功能?

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

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

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

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

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

弃用通知

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

在 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 有完成 和失败处理 策略,需要完成的 Pod 的结束状态来确定是否创建替换 Pod 或将 Job 标记为已完成或失败。因此,Job 控制器依赖于 Pod,甚至是终止的 Pod,以保留在 API 中以跟踪状态。

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

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

新的实施

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

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

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

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

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

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

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

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

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

作者: Aldo Culquicondor
出处: https://kubernetes.io/blog/2022/12/29/scalable-job-tracking-ga/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes 1.26:普遍可用的 Job 跟踪,以支持大规模并行批处理工作负载 的相关文章

  • 如何忽略多容器 Pod 中容器的故障?

    我有一个多容器应用程序 app sidecar 两个容器都应该一直处于活动状态 但 sidecar 并不是那么重要 Sidecar 依赖于外部资源 如果该资源不可用 Sidecar 就会崩溃 它会导致整个吊舱瘫痪 Kubernetes 尝试
  • 如何使用 kubectl 列出 kubernetes 中应用的自定义资源定义

    我最近应用了这个 CRD 文件 https raw githubusercontent com jetstack cert manager release 0 11 deploy manifests 00 crds yaml With ku
  • kubernetes POD IP什么时候会改变?

    我正在尝试将一个整体应用程序移植到 k8s pod 理论上 Pod 被认为是短暂的 建议使用服务概念来提供静态 IP 但到目前为止 在我的测试中 我还没有看到 POD IP 被更改 那么现在的问题是 k8s 什么时候会为我的 POD 分配一
  • 如何从 kubernetes 集群内部访问主机的 localhost

    在此应用程序中 nodejs pod 在 kubernetes 内部运行 而 mongodb 本身作为 localhost 位于主机外部 这确实不是一个好的设计 但它只适用于开发环境 在生产中 将有一个单独的 mongodb 服务器 因为这
  • 如何找出 Kubernetes 中可用的端口?

    我想在 kubernetes 集群中的不同端口上运行多个服务 并且想知道如何检查哪些端口可用并且不会与我的服务产生任何冲突 我还想知道每个端口上的服务名称 以便我可以更好地理解我的配置 有类似的问题涉及验证哪个NodePorts已经在使用中
  • Kubernetes:是否可以在 Kubernetes 集群中通过单个请求访问多个 Pod

    我想清除 Kubernetes 命名空间中所有 Pod 中的缓存 我想向端点发送一个请求 然后该端点将向命名空间中的所有 Pod 发送 HTTP 调用以清除缓存 目前 我只能使用 Kubernetes 命中一个 pod 并且无法控制哪个 p
  • 如何从 Next.js 应用程序访问 Kubernetes 容器环境变量?

    在我的 next config js 中 我有一个如下所示的部分 module exports serverRuntimeConfig Will only be available on the server side mySecret s
  • 使用 zeppelin 在 kubernetes 上 Spark

    我按照本指南在使用 minikube 设置的本地 kubernetes 集群中运行 zeppelin 容器 https zeppelin apache org docs 0 9 0 SNAPSHOT quickstart kubernete
  • Kubernetes 中的暂停镜像有什么用?

    看来在 Windows 上 Kubernetes 启动了一个pause创建的每个 Pod 的图像 这个暂停图像的目的是什么 我在哪里可以找到更多有关它的文档 The pause容器是保存 Pod 网络命名空间的容器 Kubernetes 创
  • Jenkinsfile 泊坞窗

    我正在 docker 容器内的 GCE 上运行一个 jenkins 实例 并希望从此 Jenkinsfile 和 Github 执行多分支管道 我正在使用GCE詹金斯 https cloud google com solutions con
  • Kubernetes Pod 动态环境变量

    我需要能够将自定义环境变量分配给 Pod 的每个副本 一个变量应该是一些随机的 uuid 另一个唯一的数字 怎么可能实现呢 我更愿意继续使用带有副本的 部署 如果这不是开箱即用的 如何通过自定义复制控制器 控制器管理器来实现 有没有可用的钩
  • Istio 允许所有出口流量

    如何允许 Istio 的所有出站流量 我尝试了以下方法 禁用出口网关并 使用 set global proxy includeIPRanges 0 0 0 0 0 0 0 0 0 0 绕过 sidecar 所有选项都不起作用 值得一提的是我
  • 如何从 Kubernetes 服务背后的 HTTP 请求读取客户端 IP 地址?

    我的 Web 应用程序作为 Kubernetes pod 在 SSL 的 nginx 反向代理后面运行 代理和我的应用程序都使用 Kubernetes 服务进行负载平衡 如所述here http blog kubernetes io 201
  • 如何使用 Prometheus Alert Manager 在 Kubernetes 中触发警报

    我在集群中设置了 kube prometheus https github com coreos prometheus operator tree master contrib kube prometheus https github co
  • Spark 执行器 STDOUT 到 Kubernetes STDOUT

    我在 Spark Worker 中运行的 Spark 应用程序将执行程序日志输出到特定文件路径 worker home directory app xxxxxxxx 0 stdout I used log4j properties将日志从
  • 如何根据 Kubernetes / Docker 事件发送警报?

    是否可以根据 Kubernetes 集群内发生的事件以某种方式发送警报 到电子邮件 slack 特别是 如果 Pod 意外重新启动或 Pod 无法启动 那么获取警报将非常有用 同样 了解 Pod 的 CPU 使用率是否超过特定阈值并获取警报
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • 入口和 SSL 直通

    我最近一直在使用 nginxdemo nginx ingress 控制器 据我了解 该控制器无法执行 SSL 直通 我的意思是 将客户端证书一直传递到后端服务进行身份验证 因此我一直通过标头传递客户端主题 DN 最终 我更喜欢 SSL 直通
  • 匹配同一端口上不同路径的 Istio 虚拟服务路由

    我想知道如何在同一端口上匹配 gRPC 路由 以下是我希望通过 VirtualService 实现的目标的示例 apiVersion networking istio io v1alpha3 kind VirtualService meta
  • 指定命名空间时,无法使用 nginx-stable 中的 helm 安装 nginx ingress

    我有个问题 我正在尝试使用 helm 3 安装 nginx 但当我指定命名空间时它不起作用 知道为什么吗 它无需任何操作即可工作 helm install nginx release nginx stable nginx ingres n

随机推荐