我正在考虑用 K8s 部署 Flink。我是 Flink 的新手,有一个简单的问题:
说我使用 K8s 来管理码头工人并将任务管理器部署到码头工人中。
据我了解,一个 docker 失败时可以由 K8s 重启,一个任务在失败时可以由 Flink 重启。
如果一个任务在 docker 的容器中运行,并且容器由于某种原因突然失败,在 Flink 看来,任务失败了,所以任务应该重新启动,而在 K8s 的视图中,容器失败了,所以 docker 应该重新启动。在这种情况下,我们是不是应该因为两种"重启"而担心一些冲突?
我想你想在这里阅读官方的 kubernetes 设置指南:https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/deployment/kubernetes.html
它描述了 3 种使其工作的方法:
-
会话集群:这涉及在附录中启动 2 个部署,并要求您在开始时手动或通过脚本提交 Flink 作业。这与您开发时的本地独立集群非常相似,只是它现在在您的 kubernetes 集群中
-
作业集群:通过将 Flink 部署为 k8s 作业,您将能够消除作业提交步骤。
-
掌舵图:从外观上看,该项目已经 2 年没有更新了,因此您的里程可能会有所不同。
我在会话集群方面取得了成功,但我最终想尝试"正确"的方式,即使用第二种方法将其部署为 kubernetes 作业。
根据您的 Flink 源和故障类型,您的 Flink 作业将以不同的方式失败。你不应该担心"冲突"。要么 Kubernetes 会重启容器,要么 Flink 会处理它可以处理的错误。重试一定量后,它将取消,具体取决于您配置此内容的方式。有关更多详细信息,请参阅配置。如果容器以非 0 的代码退出,Kubernetes 将尝试重新启动它。但是,它可能会也可能不会重新提交作业,具体取决于您是否在作业群集中部署了作业,或者您是否具有所用映像的初始化脚本。在会话群集中,这可能会有问题,具体取决于作业提交是通过任务管理器还是作业管理器完成的。如果作业是通过任务管理器提交的,那么我们需要取消现有的失败作业,以便重新提交的作业可以启动。
注意:如果您确实使用了会话集群,并且有一个基于文件系统的有状态后端(非 RocksDB 有状态后端(用于检查点,则需要找出一种方法让作业管理器和任务管理器共享检查点目录。
如果任务管理器使用作业管理器无法访问的检查点目录,则任务管理器的持久性层将累积并最终导致某种磁盘空间不足错误。如果您决定使用 RocksDB 并启用增量检查点,这可能不是问题
。