【译】How to natively deploy Flink on Kubernetes with High-Availability (HA)

写在前面的话

下文翻译的时候,本人对 Cloud-Native 概念理解比较粗浅,如今有了进一步的理解,希望大伙儿在看下面文章的时候能够抱着以下几点观念去读:
云原生是一套方法论,用来指导我们更高效地构建和运行应用程序,包括几个方面:

  • DevOps:开发/运维协作、自动化、CI工具(构建集成、测试、部署)
  • 持续交付:敏捷模式、快速迭代、快速反馈
  • 微服务:服务地组织形式,独立性、扩展性、解耦性、规范性
  • 容器:服务运行载体,Docker,Kubernetes

--------------------------------------分割线-------------------------------------------------
原文地址

Flink 在早些时候就支持像YARNMesos这种资源管理系统,然而这些系统既不是为那些越来越流行的云原生架构而设计,也无法满足人们处理更复杂、混合的工作内容(如批处理、流处理、深度学习、网络服务)的要求。 因此,越来越多的用户选择在 Kubernetes 上去自动部署、扩缩容他们的 Flink 应用。
随着版本的不断更新,Flink 社区在“Kubernetes原生集成”方面取得了显著的进步,从Active Resource Management到“轻Zookeeper”型的HA。在接下来内容中,我们将着重从技术细节层面描述"如何在Kubernetes上原生部署Flink",深挖Flink的HA架构。之后我们将会通过一个实际例子来指导你在Kubernetes上部署一个Flink应用集群,并使能HA。最后我们会总结一下在Kubernetes上原生部署Flink应用的优势,并对其未来的工作做个介绍。

在Kubernetes上原生集成Flink

在我们开始学习如何实现基于Kubernetes的HA服务的技术细节之前,首先让我大致介绍一下针对在Kubernetes上部署Flink这件事来说,原生,到底意味着什么:

  • Flink是自给自足的。Flink客户端中嵌入了一个Kubernetes客户端,因此你无需借助额外的工具,如:Kubecel,在Kubernetes中创建一个Flink集群。
  • Flink客户端会通过API Server与Kubernetes直接通讯来部署JobManager。Flink客户端这边的配置、log4j以及Hadoop配置会自动同步给JobManager的Pod。
  • Flink的资源管理器会根据需求直接对接API Server来实现TaskManager POD的分配与发布。

总的来说,这与在其他资源管理系统(如YARN、Mesos)中集成Flink相似,就是直接与Kubernetes的API Server进行交互。


Flink原生集成在Kubernetes上的架构

Kubernetes中的高可用服务

在将Flink引入生产环境的过程中,高可用是一个很常见的要求:避免单节点型Flink集群的故障问题。在1.12之前的版本中,Flink提供的Zookeeper HA服务被广泛应用于生产环境,并且支持单节点集群、YARN以及Kubernetes部署。然而,为了HA而在Kubernetes中再管理一个Zookeeper集群,带来了额外的操作开销,而这些开销本可以避免,因为Kubernetes也提供了一些公共接口来实现leader选举以及配置存储(如ConfigMap)。从Flink 1.12开始,我们促使了这些特性的引入,来帮助用户在Kubernetes上更方便地运行一个HA型的Flink集群。

Flink的Kubernetes高可用服务架构

上图描述了Kubernets中高可用Flink服务的架构,具体工作流程如下:
1、针对leader选举,首先有一系列的JobManagers被标记为候选者,他们全部向外声明自己是leader,但最终只有一个会成为激活的leader,之后这个激活的JobManager会持续发送心跳以向其他人更新其leader的地位。同时,其他JobManagers也会时不时地尝试成为leader——这保证JobManager的快速故障恢复。不同的组件(ResourceManagr、JobManager、Dispatcher、RestEndpoint)拥有独立的leader选举服务以及ConfigMap。
2、被激活的leader会在ConfigMap中发布自己的地址,需要注意的是,Flink使用ConfigMap来实现竞争锁以及leader地址存储。这确保了在定期的更新期间不会发生意料之外的变更。
3、leader接收服务用以发现各个激活态leader的地址并允许各个组件之后的注册事宜。举个例子,TaskManagers接收ResourceManager和JobManager的注册地址并提供slots。在接受服务中,Flink通过Kubernetes Watch来监听ConfigMap变化——当ConfigMap内容发生变化时,这通常意味着leader的变更,这样监听器就可以马上获得最新leader的地址。
4、其他所有的元信息(如运行的jobs、job图表、已完成检查器以及检查器计数器)都被直接存储到了相应的ConfigMap中。只有leader可以更新ConfigMap。这些HA数据只有当Flink集群收到终止信号时才会被清理。请注意,存在ConfigMap中的只是指针数据,具体的数据存在DistributedStorage中。通过这种间接型的映射可以保持ConfigMap的文件大小(MB级的ConfigMap可以存储GB级的数据)。

样例:高可用集群

你需要一个运行状态的Kubernetes集群,并且正确配置好KubeConfig。

1、将Flink job制成Docker镜像:

FROM flink:1.12.1
RUN mkdir -p $FLINK_HOME/usrlib
COPY /path/of/my-flink-job.jar $FLINK_HOME/usrlib/my-flink-job.jar

使用上面的Dockerfile构建镜像,并推送到自己的镜像仓:

docker build -t <user-image> .
docker push <user-image>

2、启动一个Flink应用集群

./bin/flink run-application \
    --detached \
    --parallelism 4 \
    --target kubernetes-application \
    -Dkubernetes.cluster-id=k8s-ha-app-1 \
    -Dkubernetes.container.image=<user-image> \
    -Dkubernetes.jobmanager.cpu=0.5 \
    -Dkubernetes.taskmanager.cpu=0.5 \
    -Dtaskmanager.numberOfTaskSlots=4 \
    -Dkubernetes.rest-service.exposed.type=NodePort \
    -Dhigh-availability=org.apache.flink.kubernetes.highavailability.KubernetesHaServicesFactory \
    -Dhigh-availability.storageDir=s3://flink-bucket/flink-ha \
    -Drestart-strategy=fixed-delay \
    -Drestart-strategy.fixed-delay.attempts=10 \
    -Dcontainerized.master.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.12.1.jar \
    -Dcontainerized.taskmanager.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.12.1.jar \
    local:///opt/flink/usrlib/my-flink-job.jar

3、访问Flink的可视化网页端并查看运行的job

通过查看Flink 客户端的日志,你可以看到JobManager可视化页面的地址,如:

2021-02-05 17:26:13,403 INFO  org.apache.flink.kubernetes.KubernetesClusterDescriptor      [] - Create flink application cluster k8s-ha-app-1 successfully, JobManager Web Interface: http://192.168.64.21:32388

4、杀掉JobManager来模拟故障

kubectl exec -ti {jobnamanger_pod_name} -- /bin/sh -c "kill 1"

5、确认job从最近一次成功探测中恢复

刷新页面直到新的JobManager启动,之后检查其运行日志来确认job恢复情况

2021-02-05 09:44:01,636 INFO  org.apache.flink.runtime.checkpoint.CheckpointCoordinator    [] - Restoring job 00000000000000000000000000000000 from Checkpoint 101 @ 1612518074802 for 00000000000000000000000000000000 located at <checkpoint-not-externally-addressable>.

6、取消job

job可以在页面上取消,也可以通过命令行取消:

./bin/flink cancel --target kubernetes-application -Dkubernetes.cluster-id=<ClusterID> <JobID>

注意,当job被取消后,Flink创建的所有Kubernetes资源(JobManager deployment、TaskManager pod,Service,Flink Configuration ConfigMap以及leader相关的ConfigMap)都会被自动删除。

总结

Flink的Kubernetes原生集成是1.10版本开始的,在主机名复杂性,配置、管理以及操作Flink集群方面做了很多的云原生环境运行的抽象工作。经历过3次主要版本的发布之后,Flink社区在支持多发布模式(会话、应用)方面取得了显著的进步,同时,提供了一种不依赖Zookeepers的HA可选项模式。
与单节点Kubernetes集群相比,原生集成方式对用户更友好,并且对Kubernetes的上游知识要求更少。随着Flink对底层Kubernetes集群了解的加深,将来还可以利用其动态资源配置来更有效地利用Kubernetes资源。Flink下一步将会从Pod模板方面来加深其Kubernetes原生支持,使得Flink能够更灵活的使用Kubernetes集群的高级资源(Volumes,初始化容器,sidecar容器等)。这部分工作已经在进行,并且在1.13版本中将会呈现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容