乐趣区

关于kubernetes:flink-on-native-kubernetes

上一章讲了 flink 的 application mode。明天咱们次要通过该模式提交 WordCount 作业,并且抉择的是 native kubernetes。

Native Kubernetes 原理

下图形容了 flink 如何与 kubernetes 集成:

创立 Flink Kubernetes Session 集群时,Flink 客户端将首先连贯到 Kubernetes ApiServer 提交集群形容,包含 ConfigMap 标准,Job Manager 服务标准,Job Manager Deployment 标准和 Owner Reference。而后,Kubernetes 将创立 JobManager Deployment,在此期间,Kubelet 将拉取镜像,筹备并装置卷,而后执行启动命令。启动 JobManager Pod 后,Dispatcher 和 KubernetesResourceManager 就绪可用,并且集群已筹备好承受一个或多个作业。

当用户通过 Flink 客户端提交作业时,客户端将生成Job Graph,并将其与用户 jar 一起上传到 Dispatcher。

JobManager 向 KubernetesResourceManager 申请插槽的资源。如果没有可用的插槽,资源管理器将创立 TaskManager Pod 并在集群中注册它们。

示例

Application mode 容许用户创立一个蕴含其 Job 和 Flink 运行时的镜像,这将依据须要主动创立和销毁集群组件。Flink 社区提供了针对任何用例定制的根本 docker 镜像。

下载

首先去官网下载 flink1.11。包中蕴含以下内容:

bin  conf  Dockerfile  examples  lib  LICENSE  licenses  log  NOTICE  opt  plugins  README.txt

其中:

  • bin 下蕴含了 flink 相干的一些可执行文件以及一些 shell 脚本,次要用来提交工作或是创立进行集群
  • conf 蕴含了 flink 和日志等相干的配置文件
  • examples,顾名思义,就是一些 demo 示例,比方咱们明天的 WordCount 就位于此门路下
  • lib 蕴含 flink 依赖的包
  • opt 蕴含了一些扩大的包,比方 flink 对接 s3 的专用包
  • plugins 蕴含了监控相干,比方对接 prometheus,graphite 等。

构建镜像

而后咱们创立一个 Dockerfile,用于定制镜像。Dockerfile 内容如下:

FROM flink
RUN mkdir -p $FLINK_HOME/usrlib
COPY ./examples/streaming/WordCount.jar $FLINK_HOME/usrlib/my-flink-job.jar

构建镜像:

docker build -t iyacontrol/flink-world-count:v0.0.1 .
Sending build context to Docker daemon  362.7MB
Step 1/3 : FROM flink
latest: Pulling from library/flink
e9afc4f90ab0: Already exists 
989e6b19a265: Already exists 
af14b6c2f878: Already exists 
68a79816c3e1: Pull complete 
037cc5cb1b83: Pull complete 
d3efdb331614: Pull complete 
bf82d2b871ad: Pull complete 
4ff2e8c5d83f: Pull complete 
f15a0d59303a: Pull complete 
81130e2e9fdd: Pull complete 
40bdeebc27c6: Pull complete 
8fe3a85e5402: Pull complete 
Digest: sha256:665db47d0a2bcc297e9eb4df7640d3e4c1d398d25849252a726c8ada112722cf
Status: Downloaded newer image for flink:latest
 ---> 43f070a908e6
Step 2/3 : RUN mkdir -p $FLINK_HOME/usrlib
 ---> Running in c44a726b85a9
Removing intermediate container c44a726b85a9
 ---> 67ab6686e049
Step 3/3 : COPY ./examples/streaming/WordCount.jar $FLINK_HOME/usrlib/my-flink-job.jar
 ---> ab3686ebc7e5
Successfully built ab3686ebc7e5

推送镜像到镜像仓库:

docker push  iyacontrol/flink-world-count:v0.0.1
The push refers to repository [docker.io/iyacontrol/flink-world-count]
b3b3d0402b8d: Pushed 
b1757ffb6e42: Pushed 
3af0e2838f53: Mounted from library/flink 
cf0f92755ad7: Mounted from library/flink 
1f8a2f4bd423: Mounted from library/flink 
eedc301c6f3f: Mounted from library/flink 
d23c0e026b3e: Mounted from library/flink 
37f26e989a45: Mounted from library/flink 
e658c78cae16: Mounted from library/flink 
d8859f270d7a: Mounted from library/flink 
7ab97ad88178: Mounted from library/flink 
527ade4639e0: Mounted from library/flink 
c2c789d2d3c5: Mounted from library/flink 
8803ef42039d: Mounted from library/flink 
v0.0.1: digest: sha256:fcd99fedbba2734796226a725789bf7db109131b04f2a13c1cd1bc773ff3b8c0 size: 3253

留神:此处须要换成本人的镜像仓库。或是能够绕过构建步骤,间接应用我打好的镜像。

配置 kubernetes RBAC 权限

须要给 flink 授予 RBAC 某些权限,并且在提交工作的时候通过参数 (-Dkubernetes.jobmanager.service-account=flink) 指定,JobManager 方可创立作业 Pod。

kubectl create serviceaccount flink -n stream

kubectl create clusterrolebinding flink-role-binding-flink -n stream  --clusterrole=edit --serviceaccount=stream:flink

并没有抉择 default 命名空间,这里创立了一个 stream 的命名空间。

提交作业

执行以下命令提交 WorldCount 作业:

./bin/flink run-application -p 8 -t kubernetes-application \
  -Dkubernetes.cluster-id=my-first-cluster \
  -Dtaskmanager.memory.process.size=4096m \
  -Dkubernetes.taskmanager.cpu=2 \
  -Dtaskmanager.numberOfTaskSlots=4 \
  -Dkubernetes.container.image=iyacontrol/flink-world-count:v0.0.1 \
  -Dkubernetes.namespace=stream \
  -Dkubernetes.jobmanager.service-account=flink \
  -Dkubernetes.rest-service.exposed.type=LoadBalancer \
  -Dkubernetes.rest-service.annotations=service.beta.kubernetes.io/aws-load-balancer-type:nlb \
  local:///opt/flink/usrlib/my-flink-job.jar

只有 application mode 的架构反对 local。假设 jar 位于镜像中,而不位于 Flink 客户端中。

如下相似输入:

2020-07-17 17:57:55,455 INFO  org.apache.flink.kubernetes.utils.KubernetesUtils            [] - Kubernetes deployment requires a fixed port. Configuration blob.server.port will be set to 6124
2020-07-17 17:57:55,455 INFO  org.apache.flink.kubernetes.utils.KubernetesUtils            [] - Kubernetes deployment requires a fixed port. Configuration taskmanager.rpc.port will be set to 6122
2020-07-17 17:57:55,511 WARN  org.apache.flink.kubernetes.kubeclient.decorators.HadoopConfMountDecorator [] - Found 0 files in directory null/etc/hadoop, skip to mount the Hadoop Configuration ConfigMap.
2020-07-17 17:57:55,511 WARN  org.apache.flink.kubernetes.kubeclient.decorators.HadoopConfMountDecorator [] - Found 0 files in directory null/etc/hadoop, skip to create the Hadoop Configuration ConfigMap.
2020-07-17 17:57:56,348 INFO  org.apache.flink.kubernetes.KubernetesClusterDescriptor      [] - Create flink application cluster my-first-cluster successfully, JobManager Web Interface: http://F1DD312BB1102AC0AE558F66FA.gr7.ap-southeast-1.eks.amazonaws.com:8081

上面咱们讲下提交参数:

  • kubernetes.cluster-id 能够指定,更加语义化,如果不指定,零碎会应用 uuid。
  • kubernetes.rest-service.exposed.type 指定裸露 Jobmanager 服务的形式。
  • kubernetes.rest-service.annotations 如果你的 k8s 集群应用的是私有云的托管 k8s,而且 kubernetes.rest-service.exposed.type 为 LoadBalancer,该参数个别都须要设置。
  • kubernetes.container.image 指定咱们作业的镜像。

而后咱们查看一下再 k8s 当中创立了那些资源:

kubectl get all -n stream
NAME                                    READY   STATUS    RESTARTS   AGE
pod/my-first-cluster-64ff98cd96-sprk7   1/1     Running   0          24s
pod/my-first-cluster-taskmanager-1-1    1/1     Running   0          16s
pod/my-first-cluster-taskmanager-1-2    0/1     Pending   0          12s

NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP                                                                          PORT(S)             AGE
service/my-first-cluster        ClusterIP      None             <none>                                                                               6123/TCP,6124/TCP   24s
service/my-first-cluster-rest   LoadBalancer   10.100.xx.179   a4fd46cfa3985f99582310dbfd-0ce036fe28648b82.elb.ap-southeast-1.amazonaws.com   8081:32756/TCP      24s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-first-cluster   1/1     1            1           24s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/my-first-cluster-64ff98cd96   1         1         1       24s
  • 名称为 my-first-cluster 的 Deployment,即 JobManager
  • JobManager 依据提交参数创立的两个 TaskManager Pod
  • 名称为 my-first-cluster-rest 的 服务,用于集群外拜访 JobManager 的治理 UI。
  • 名称为 my-first-cluster 的服务,该服务为 Headless 服务,用于 TaskManager 的 Pod 拜访 JobManager。

拜访 UI

应用下面的 url 拜访 JobManager 的 UI,如下:

总结

flink native kubernets 在 1.10 的时候推出,目前还处于开发当中,某些参数可能会在之后版本中变动。不过 1.11 版本曾经比较稳定了。

退出移动版