头像墨无痕 创建于 2024年08月14日 修改于 2024年08月15日615次阅读 3个点赞

Dinky手把手教程 - 集成K8s,提交Flink On K8s Application任务

概述

Dinky 是一个基于 Apache Flink 的实时计算平台,它提供了一站式的 Flink 任务开发、运维、监控等功能。Kubernetes 是一个强大的容器编排平台,能够自动化应用的部署、扩展和管理。将 Flink 与 Kubernetes 集成,可以充分利用 Kubernetes 的优势,实现 Flink 任务的弹性伸缩、自动化部署和高可用性。

项目地址:https://github.com/DataLinkDC/dinky

如果觉得项目不错欢迎前去点下 Star, 感谢您的支持!

前置条件

  • 确保已安装 Kubernetes 集群,并且 kubectl 命令行工具已配置好,能够与集群通信。
  • 已安装 Dinky >= 1.0.3版本
  • 理解 Kubernetes 的基本概念,如 Pod、Service、Deployment、Namespace 等。

开始吧

Kubernetes 环境准备

在 Kubernetes 上部署 Dinky 之前,需要准备相应的 Kubernetes 资源对象。

  1. 创建命名空间:为 Dinky 创建一个独立的命名空间。

    复制代码
    kubectl create namespace dinky
  2. 创建服务账号和角色绑定:为 Dinky 创建服务账号并赋予相应的权限。

    复制代码
    kubectl create serviceaccount dinky -n dinky
    kubectl create rolebinding dinky-admin --clusterrole=admin --serviceaccount=dinky:dinky -n dinky

上述操作为创建一个命名空间 dinky和用户dinky, 并为dinky用户赋予所有权限,实际操作中您也可以跳过此步骤,使用default账号,更多参考官方文档 https://nightlies.apache.org/flink/flink-docs-stable/docs/deployment/resource-providers/native_kubernetes/#rbac

制作镜像

目前社区还未提供打包好的镜像,所以现阶段需要咱们自己制作镜像,本教程基于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
2806.jpg

类型选择Kubernetes Native或者Kubernetes Operator 目前阶段仍推荐Kubernetes Native方式,operator还在beta中

表单内容有点多,但是填起来很简单,有很多可以不填,我整理了一下表格参考

Kubernetes基本配置

对应左侧配置目录

参数 说明 是否必填 默认值 示例值
暴露端口类型 支持NodePort与ClusterIP NodePort
Kubernetes 命名空间 集群所在的 Kubernetes 命名空间 default
K8s 提交账号 集群提交任务的账号 default
Flink 镜像地址 上一步打包的镜像地址 192.168.0.10:5000/dinky-flink-1.0.3-1.15.4
JobManager CPU 配置 JobManager 资源配置 1
TaskManager CPU 配置 TaskManager 资源配置 1
Flink 配置文件路径 仅指定到文件夹,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 Template JobManager的Pod模板
TM Pod Template TaskManager的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必须打到镜像里的原因

参数 说明 是否必填 默认值 示例值
JobManager 内存 JobManager 内存大小 1g
TaskManager 内存 TaskManager 内存大小 1g
TaskManager 堆内存 TaskManager 堆内存大小(不建议配置此项,留空即可 1g
插槽数 一个Taskmanager内Solt数量 2
保存点路径 对应SavePoint目录 hdfs:///flink/savepoint
检查点路径 对应CheckPoint目录 hdfs:///flink/checkpoint

提交 kubernetes application 任务

进入数据开发页面,新建一个flink sql任务,选择集群类型为kubernetes application,集群选择为我们刚刚配置的集群,点击提交即可

微信截图_20240814171923.png
微信截图_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
image.png
点赞
分享
打赏
评论
全部评论
加载失败