首页 > 解决方案 > Kubernetes 中的有状态作业

问题描述

我需要偶尔运行一项临时工作。这项工作需要一些状态才能工作。建立国家需要很多时间。因此,希望在后续运行中保持状态的持久性和可重用性,以加快周转时间。我希望将这项工作作为 K8s pod 进行管理。

这是一套完整的要求:

  1. 工作完成后,豆荚将下降。K8s 控制器不应尝试启动 Pod。
  2. 每个 pod 都应该附加一个持久卷。每个 pod 应该有 1 个卷。我打算使用 EBS。
  3. 将来我们应该能够手动恢复 Pod。
  4. 未来的运行可能比过去的运行具有更多或更少的副本。

我知道 K8s 支持 Jobs 和 Statefulsets。有没有同时支持两者的控制器?

标签: kubernetesjobsstateful

解决方案


  1. 工作完成后,豆荚将下降。K8s 控制器不应尝试启动 Pod。

这就是乔布斯所做的——运行到完成。您只控制是否要重试exit > 0

  1. Pod 应该附加一个持久卷。

所有人的音量都一样?他们会写还是只读?你有什么卷后端,AWS EBS 或类似的?根据答案,您可能希望在几个卷之间拆分输入数据或使用单独的卷进行写入,然后将完成作业组装到 1 个卷中(一种映射减少)。或者使用支持多挂载 RW 的卷后端https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes(见表ReadWriteMany

  1. 将来我们应该能够手动恢复 Pod。

适合这里的工作:您在需要时启动它,它会一直运行到完成。

  1. 未来的运行可能比过去的运行具有更多或更少的副本。

工作适合这里。指定不同的completionsparallelism在您启动作业时:https ://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#parallel-jobs

StatefulSets 是不同的概念,它们主要用于集群软件,您可以连续运行并且需要保持每个 pod(例如分片)的角色。


推荐阅读