应用完成后清理 Kubernetes 上的 Flink 应用集群的最佳实践

问题描述

我们在 Kubernetes 上以应用模式运行 Flink 作业,问题是当作业完成/停止时,作业管理器容器将退出,但 1. 任务管理器的部署 2. 作业管理器服务 3. configMap 仍将是除非我们运行 kubectl delete 来清理它。

如果我们手动停止作业,这没什么大不了的,但如果我们的 Flink 作业是一个批处理作业,稍后会完成,这意味着我们需要一个外部服务来持续监控作业管理器容器并清理其余的完成后资源,这不是很实用。

我想知道这里的最佳做法是什么?我们是否支持在 Kubernetes 上运行 Flink 批处理作业?如果是,那么 Flink 作业本身应该有办法在完成后清理所有内容,对吗?

解决方法

我假设您在 Kubernetes 上运行 standalone Flink 应用程序。在这种模式下,Flink 不知道 Kubernetes 集群。因此用户必须利用一些外部工具(例如 kubectl、k8s-operator)来管理 Flink 集群的生命周期。这意味着您需要手动删除 TaskManager 部署、配置映射、服务。

我认为可以通过以下两种方式改善这种情况。

  1. 为 TaskManager 部署、配置映射、JobManager 作业的服务设置 owner reference。但是,您仍然需要在应用完成后手动删除 Kubernetes 作业。
  2. 试试 native Kubernetes integration。 Flink 将有一个嵌入式 Kubernetes 客户端,可以在应用完成时自动删除资源。