Flink On K8s 集群原理

Flink On K8s 架构

image.png

Flink 任务在 Kubernetes 上运行的步骤有:

●首先往 Kubernetes 集群提交了资源描述文件后,会启动 Master 和 Worker 的 container。
●Master Container 中会启动 Flink Master Process,包含 Flink-Container ResourceManager、JobManager 和 Program Runner。
●Worker Container 会 启 动 TaskManager, 并 向 负 责 资 源 管 理 的 ResourceManager 进行注册,注册完成之后,由 JobManager 将具体的任务分给 Container,再由 Container 去执行。
●需要说明的是,在 Flink 里的 Master 和 Worker 都是一个镜像,只是脚本的命令不一样,通过参数来选择启动 master 还是启动 Worker

JobManager 的执行过程分为两步 :

●首先,JobManager 通过 Deployment 进行描述,保证 1 个副本的 Conainer 运行 JobManager,可以定义一个标签,例如 flink-jobmanager。
●其次,还需要定义一个 JobManager Service,通过 service name 和 port 暴露 JobManager 服务,通过标签选择对应的 pods。

Flink on Kubernetes-TaskManager:

TaskManager 也是通过 Deployment 来进行描述,保证 n 个副本的 Container 运行 TaskManager,同时也需要定义一个标签,例如 flink-taskmanager。

对于 JobManager 和 TaskManager 运行过程中需要的一些配置文件,如:flink-conf.yaml、hdfs-site.xml、core-site.xml,可以通过将它们定义为 ConfigMap 来实现配置的传递和读取

image.png

整个交互的流程比较简单,用户往 Kubernetes 集群提交定义好的资源描述文件即可,例如 deployment、configmap、service 等描述。后续的事情就交给 Kubernetes 集群自动完成。Kubernetes 集群会按照定义好的描述来启动 pod,运行用户程序。各个组件的具体工作如下:

●Service: 通过标签 (label selector) 找到 job manager 的 pod 暴露服务。
●Deployment:保证 n 个副本的 container 运行 JM/TM,应用升级策略。
●ConfigMap:在每个 pod 上通过挂载 /etc/flink 目录,包含 flink-conf.yaml 内容。

•Session Cluster 模式

• 启动
    •kubectl create -f jobmanager-service.yaml
    •kubectl create -f jobmanager-deployment.yaml
    •kubectl create -f taskmanager-deployment.yaml
•Submit job
    •kubectl port-forward service/flink-jobmanager 8081:8081
    •bin/flink run -d -m localhost:8081 ./examples/streaming/

TopSpeedWindowing.jar
• 停止
•kubectl delete -f jobmanager-deployment.yaml
•kubectl delete -f taskmanager-deployment.yaml
•kubectl delete -f jobmanager-service.yaml

首先启动 Session Cluster,执行上述三条启动命令就可以将 Flink 的 Job-Manager-service、jobmanager-deployment、taskmanager-deployment 启动起来。启动完成之后用户可以通过接口进行访问,然后通过端口进行提交任务。若想销毁集群,直接用 kubectl delete 即可,整个资源就可以销毁。

配置文件示例

image.png
image.png

● Job Cluster 模式

除了 Session 模式,还有一种 Per Job 模式。在 Per Job 模式下,需要将用户代码都打到镜像里面,这样如果业务逻辑的变动涉及到 Jar 包的修改,都需要重新生成镜像,整个过程比较繁琐,因此在生产环境中使用的比较少。
以使用公用 docker 仓库为例,Job Cluster 的运行步骤如下:

● build 镜像:在 flink/flink-container/docker 目录下执行 build.sh 脚本
● 上传镜像:在 hub.docker.com 上需要注册账号和创建仓库进行上传镜像。
docker tag topspeed zkb555/topspeedwindowing
docker push zkb555/topspeedwindowing

● 启动任务:在镜像上传之后,可以启动任务。
kubectl create -f job-cluster-service.yaml
FLINK_IMAGE_NAME=zkb555/topspeedwindowing:latest FLINK_JOB=org.apache.flink.streaming.examples.windowing.TopSpeedWindowing FLINK_JOB_PARALLELISM=3
envsubst <
job-cluster-job.yaml.template
kubectl create -f -FLINK_IMAGE_NAME=zkb555/topspeedwindowing:latest FLINK_JOB_PARALLELISM=4

envsubst <
task-manager-deployment.yaml.template | kubectl create -f -

你可能感兴趣的:(Flink On K8s 集群原理)