概述
Dinky 是一个基于 Apache Flink 的实时计算平台,它提供了一站式的 Flink 任务开发、运维、监控等功能。Kubernetes 是一个强大的容器编排平台,能够自动化应用的部署、扩展和管理。将 Flink 与 Kubernetes 集成,可以充分利用 Kubernetes 的优势,实现 Flink 任务的弹性伸缩、自动化部署和高可用性。
原文阅读:【巨人肩膀社区·专栏·分享】Dinky手把手教程 - 集成K8s,提交Flink On K8s Application任务
项目地址:https://github.com/DataLinkDC/dinky
如果觉得项目不错欢迎前去点下
Star
, 感谢您的支持!
前置条件
- 确保已安装 Kubernetes 集群,并且
kubectl
命令行工具已配置好,能够与集群通信。 - 已安装 Dinky >= 1.0.3版本
- 理解 Kubernetes 的基本概念,如 Pod、Service、Deployment、Namespace 等。
开始吧
Kubernetes 环境准备
在 Kubernetes 上部署 Dinky 之前,需要准备相应的 Kubernetes 资源对象。
- 创建命名空间:为 Dinky 创建一个独立的命名空间。复制代码
kubectl create namespace dinky
- 创建服务账号和角色绑定:为 Dinky 创建服务账号并赋予相应的权限。复制代码
kubectl create serviceaccount dinky -n dinkykubectl create rolebinding dinky-admin --clusterrole=admin --serviceaccount=dinky:dinky -n dinky
上述操作为创建一个命名空间 dinky和用户dinky, 并为dinky用户赋予所有权限,实际操作中您也可以跳过此步骤,使用default账号,更多参考官方文档 Native Kubernetes | Apache Flink
制作镜像
目前社区还未提供打包好的镜像,所以现阶段需要咱们自己制作镜像,本教程基于flink 1.15版本,其他flink版本替换对应版本号即可
准备依赖
在dinky安装目录下 进入 jar路径,找到如下jar包
bash 复制代码
mkdir docker && cd docker
# /dinky/jar为dinky安装目录,请替换为你自己的安装目录
mv /dinky/jar/dinky-app-1.15-1.0.3-jar-with-dependencies.jar ./
mv ${其他依赖} ./
上述仅为基础必须的依赖,如果你的flink任务有其他依赖需求,请自行补充添加
编写Dockerfile
bash 复制代码
vim Dockerfile
填入以下内容
docker 复制代码
ARG FLINK_VERSION=1.15.4 # flink 版本号
FROM flink:${FLINK_VERSION}-scala_2.12 # flink官方镜像tag
# 把当前目录下的jar添加进依赖目录
ADD . /opt/flink/lib
# 删除loader包,替换为不带loader的
RUN rm -rf /opt/flink/lib/flink-table-planner-loader-*.jar \
mv /opt/flink/opt/flink-table-planner_2.12-*.jar /opt/flink/lib
构建镜像并推送到私有镜像仓库
复制代码
# 构建Dinky app镜像
docker build -t dinky-flink:1.0.3-1.15.4 . --no-cache
# 这一步为推送到私有镜像仓库过程,请根据需要自行修改参数
docker tag dinky-flink:1.0.3-1.15.4 192.168.0.10:5000/dinky-flink-1.0.3-1.15.4
docker push 192.168.0.10:5000/dinky-flink-1.0.3-1.15.4
配置Kubernetes集群信息
在注册中心页面,点击 集群==>集群配置==>新建 进入新建集群页面!
2806.jpg
类型选择
Kubernetes Native
或者
Kubernetes Operator
目前阶段仍推荐Kubernetes Native方式,operator还在beta中
表单内容有点多,但是填起来很简单,有很多可以不填,我整理了一下表格参考
Kubernetes基本配置
对应左侧配置目录
参数说明是否必填默认值示例值暴露端口类型支持NodePort与ClusterIP是无NodePortKubernetes 命名空间集群所在的 Kubernetes 命名空间是无defaultK8s 提交账号集群提交任务的账号是无defaultFlink 镜像地址上一步打包的镜像地址是无192.168.0.10:5000/dinky-flink-1.0.3-1.15.4JobManager CPU 配置JobManager 资源配置否无1TaskManager CPU 配置TaskManager 资源配置否无1Flink 配置文件路径仅指定到文件夹,flink会自行读取文件夹下的配置文件并作为flink的默认配置否无这里目前只能填
/opt/flink/conf
,且在dinky此目录要有flink日志配置文件,否则容器内无法生成日志
如果您有其他的配置项需要添加,请点击添加配置项按钮,添加完毕后,点击保存即可
对于 Flink 配置文件路径 参数需要特别说明,这个路径指的是dinky所在服务器本地路径,指向flink 安装目录conf文件夹,flink会读取该目录下所有文件映射到k8s容器中flink的conf目录,除非有特别需求,否则不建议进行配置,留空即可
Kubernetes 连接与pod配置(选填)
对应右侧配置目录
这些参数都是选填,其余如无需求,留空即可,
K8s KubeConfig
建议填写,如果有多套k8s集群则建立多个配置,可以实现多集群配置
参数说明是否必填默认值示例值K8s KubeConfig集群的KubeConfig内容,如果不填写,则默认使用
~/.kube/config
文件,建议填写否无无Default Pod Template默认的Pod模板否无无JM Pod TemplateJobManager的Pod模板否无无TM Pod TemplateTaskManager的Pod模板否无无
提交 FlinkSQL 配置项(必填)
参数说明是否必填默认值示例值Jar 文件路径指定镜像内dinky-app的 Jar 文件路径,如果该集群配置用于提交 Application 模式任务时 则必填是无local:///opt/flink/dinky-app-1.16-1.0.0-jar-with-dependencies.jar
由于flink限制,k8s模式只能加载镜像内的jar包,也就是地址必须为local://开头,这也是为什么
dinky-app-1.15-1.0.3-jar-with-dependencies.jar
必须打到镜像里的原因
Flink 预设配置(可选)
参数说明是否必填默认值示例值JobManager 内存JobManager 内存大小否无1gTaskManager 内存TaskManager 内存大小否无1gTaskManager 堆内存TaskManager 堆内存大小(不建议配置此项,留空即可)否无1g插槽数一个Taskmanager内Solt数量否无2保存点路径对应SavePoint目录否无hdfs:///flink/savepoint检查点路径对应CheckPoint目录否无hdfs:///flink/checkpoint
提交 kubernetes application 任务
进入数据开发页面,新建一个flink sql任务,选择集群类型为
kubernetes application
,集群选择为我们刚刚配置的集群,点击提交即可
微信截图_20240814171923.png
问题解决
提交任务后没有日志文件
dinky使用flink原生api提交任务,flink源码在提交任务过程中会读取dinky本地 /opt/flink/conf 下的文件作为容器内配置目录挂载,所以需要提前把 flink安装目录下的conf目录内文件全部复制到此,在集群配置处flink配置文件目录填写/opt/flink/conf即可。
任务完成后很久pod才销毁,或启动日志报错udf下载失败
application模式下运行pod需要与dinky进行通信,所以需要修改
配置中心-->全局配置-->Dinky地址
为正确的,pod可访问的地址
image.png
版权归原作者 atbigapp.com 所有, 如有侵权,请联系我们删除。