pig2 发表于 2019-4-28 16:33:54

在Kubernetes上运行Apache Flink


问题导读

1.在Kubernetes上运行Flink有哪些挑战?
2.为何我们选择将Flink作为作业集群运行?
3.在Kubernetes上是否可以运行Flink?


最近,我正在使用Apache Flink开发一个小型流处理应用程序。 我自然希望将Flink和开发的作业部署到我们的Kubernetes集群。 我一路上学到了很多关于Flink和Kubernetes的知识,在这篇文章中分享给大家

挑战

合规性 - 在Zalando,生产中运行的所有代码必须由至少两个人进行审核,并且所有部署的工件必须可追溯到git提交。部署Flink Jobs的默认方法是将包含具有任何其他所需依赖关系的Job的JAR上载到正在运行的Flink集群。这与我们的内部合规指南不兼容。

容器编排准备 -Flink的一个关键卖点是进行容错流处理。但是 - 正如下一节所述 - 可靠性功能并未考虑到容器编排系统,这使得在Kubernetes上运行Flink集群并不是那么简单。

碎片文档 -Flink和Kubernetes都在快速发展,使一些文档过时。不幸的是,官方文档目前没有提供在Kubernetes上以可靠的方式运行Flink所需的所有信息。


Flink架构和部署模式
为了了解如何在Kubernetes集群上部署Flink,需要对体系结构和部署模式有基本的了解。如果已经熟悉Flink,可跳过本节。

Flink由两个组件组成,即作业管理器和任务管理器。作业管理器协调流处理作业,管理作业提交及其生命周期,并将工作分配给任务管理器。任务管理器执行实际的流处理逻辑。应始终只有一个活动的作业管理器,并且可以有n个任务管理器。

为了实现弹性,有状态的流处理,Flink使用Checkpointing定期将各种流处理算子的状态存储在持久存储中。从故障中恢复时,流处理作业可以从最新检查点恢复。检查点由作业管理器协调 - 值得注意的是,作业管理器知道最新完成的检查点的位置,这将在以后变得重要。




Flink Clusters可以以两种不同的模式运行:第一种模式,称为Standalone或Session Cluster,是一个运行多个流处理作业的集群。 任务管理器在作业之间共享。 第二种模式称为作业集群,专用于运行单个流处理作业。

Flink Cluster可以在HA模式下运行。 在此模式下,多个作业管理器实例正在运行,一个被选为leader。 如果leader失败,领导权将转移到其他正在运行的Job Managers之一。 Flink使用ZooKeeper处理Leader Election。



Kubernetes部署
上面描述的两种模式中,我们选择将Flink作为作业集群运行。推动决策的原因有两个:第一个原因是Job Clusters的Docker镜像需要包含JAR和Flink Job。这可以很好地解决合规性问题,因为我们可以重复使用与常规JVM应用程序相同的工作流程。第二个优点是此部署模型允许为每个Flink作业独立扩展任务管理器。

作业管理器被建模为具有一个副本的部署,任务管理器作为具有n个副本的部署。任务管理器通过Kubernetes服务发现作业管理器。此设置与建议将作业集群的作业管理器作为Kubernetes作业运行的官方文档不同。我们认为在这种情况下使用部署是更可靠的选择(这是一个永无止境的流式传输作业),因为部署将确保一个pod始终在运行,而Job可以完成,从而使集群没有任何作业管理器。这就是为什么我们的设置类似于文档中描述会话集群的设置。

作业管理器窗格的故障由部署控制器处理,它将负责生成新的作业管理器。由于这通常是一个相对较快的操作,这使我们无需在热备份中维护多个作业管理器,这会增加部署的复杂性。任务管理器使用Kubernetes服务寻址作业管理器。

如上所述,作业管理器在其内存中保留一些与检查点相关的状态。在Job Manager崩溃时,此状态将丢失,这就是ZooKeeper中持久存在此状态的原因。这意味着即使没有真正需要领导者选举和Flink HA模式的发现部分(就像Kubernetes本身处理的那样),它仍然需要仅用于存储检查点状态。

由于我们已经在我们的Kubernetes集群中部署了一个etcd集群和etcd-operator,我们不想引入另一个分布式协调系统。我们给了zetcd一个尝试,这是一个由etcdv3支持的ZooKeeper API。这个设置工作正常,所以我们决定坚持下去。

我们在这种设置中遇到的另一个问题是,作业管理器有时会陷入一种不健康的状态,只有通过重新启动作业管理器才能解决这个问题。这是由livenessProbe完成的,它检查作业管理器是否仍然健康且作业是否仍在运行。

还值得注意的是,此设置仅适用于Flink> 1.6.1,因为存在阻止从作业群集中的检查点恢复的此错误。


结论
上面的设置现在正在生产中运行几个月,并且很好地服务于我们的用例。 这表明可以在Kubernetes上可靠地运行Flink,即使有一些小障碍。


最新经典文章,欢迎关注公众号
http://www.aboutyun.com/data/attachment/forum/201406/15/084659qcxzzg8n59b6zejp.jpg

美丽天空 发表于 2019-4-29 23:14:22

感谢分享
页: [1]
查看完整版本: 在Kubernetes上运行Apache Flink