k8s离线环境部署DolphinScheduler+SeaTunnel
0.前言
在一个大数据调度系统中,任务和数据的调度与编排是一个非常重要的环节。
在而今的开源时代,使用DolphinScheduler+SeaTunnel这样的黄金组合,可以满足我们对大数据系统建设初期的各种畅想。
作为一名大数据行业的小白,笔者也来演练一下如何在企业内网中如何快速搭建出DolphinScheduler+SeaTunnel,并用一个简单的小示例实践一下。
本文中的部署环境:
- k8s,版本
1.23.15 - helm,版本
3.16.2 - harbor镜像仓库
1.DolphinScheduler部署
今天是2026年2月12号的星期四,目前DolphinScheduler(DS)的最新版本为3.4.0,最新稳定的版本为3.1.9。
从稳定性的角度出发,本文中也采用DS的稳定版3.1.9。部署时DS参考官方的此连接:https://dolphinscheduler.apache.org/en-us/docs/3.1.9/guide/installation/kubernetes
执行以下命令下载源码:
#克隆DS代码
git clone https://github.com/apache/dolphinscheduler.git
#如果拉不动就配置http代理重新拉
git clone -c http.proxy=http://192.168.1.66:7078 -c https.proxy=http://192.168.1.66:7078 https://github.com/apache/dolphinscheduler.git
#切换到3.1.9的tag
git checkout 3.1.9
#切换到部署脚本目录
cd deploy/kubernetes/dolphinscheduler/

再执行下面的命令,执行helm操作:
#添加helm仓库源
helm repo add bitnami https://charts.bitnami.com/bitnami
#同步当前目录下的所有chart
helm dependency update .
#如果同步失败,可尝试配置http代理再次同步
HTTP_PROXY=http://192.168.1.66:7078 HTTPS_PROXY=http://192.168.1.66:7078 helm dependency update .

同步chart成功后会有以上信息输出。
如果上面的命令由于网络原因安装失败,可通过代理先将原镜像下载之后再上传到harbor的方式解决。步骤为:
#查看依赖镜像
helm template . | grep “image:” | awk ‘{print $2}’ | tr -d ‘"’ | sort | uniq
输出为:
busybox:1.30
docker.io/bitnami/postgresql:11.11.0-debian-10-r71
docker.io/bitnami/zookeeper:3.6.2-debian-10-r185
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-alert-server:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-api:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-master:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-tools:3.1.9
dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.9
得到清单后,我们给docker配置好代理,(命令参考:配置docker的网络代理)。再依次手动拉取:
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-master:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-api:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-alert-server:3.1.9
docker pull dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-tools:3.1.9
docker pull bitnami/postgresql:11.11.0-debian-10-r71
docker pull bitnami/zookeeper:3.6.2-debian-10-r185
docker pull busybox:1.30
再依次打上tag:
export MY_HARBOR="dockerhub.haiyang.com/haiyang"
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-master:3.1.9 $MY_HARBOR/dolphinscheduler-master:3.1.9
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-api:3.1.9 $MY_HARBOR/dolphinscheduler-api:3.1.9
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-alert-server:3.1.9 $MY_HARBOR/dolphinscheduler-alert-server:3.1.9
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-tools:3.1.9 $MY_HARBOR/dolphinscheduler-tools:3.1.9
docker tag docker.io/bitnami/postgresql:11.11.0-debian-10-r71 $MY_HARBOR/postgresql:11.11.0-debian-10-r71
docker tag busybox:1.30 $MY_HARBOR/busybox:1.30
docker tag dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.9 $MY_HARBOR/dolphinscheduler-worker:3.1.9
docker tag public.ecr.aws/bitnami/zookeeper:3.6.2-debian-10-r185 $MY_HARBOR/zookeeper:3.6.2-debian-10-r185
再依次push到私服:
docker push $MY_HARBOR/dolphinscheduler-master:3.1.9
docker push $MY_HARBOR/dolphinscheduler-api:3.1.9
docker push $MY_HARBOR/dolphinscheduler-alert-server:3.1.9
docker push $MY_HARBOR/dolphinscheduler-tools:3.1.9
docker push $MY_HARBOR/postgresql:11.11.0-debian-10-r71
docker push $MY_HARBOR/busybox:1.30
docker push $MY_HARBOR/dolphinscheduler-worker:3.1.9
docker push $MY_HARBOR/zookeeper:3.6.2-debian-10-r185
替换values.yaml中registry的镜像仓库地址:
# 执行替换(使用 | 作为定界符,避免仓库地址中的 / 导致冲突)
sed -i "s|registry: \"dolphinscheduler.docker.scarf.sh/apache\"|registry: \"$MY_HARBOR\"|g" values.yaml
postgresql和zookeeper的需要单独处理,编辑values.yaml文件,在各自的节点中添加对应的image配置:
postgresql:
enabled: true
image:
registry: "dockerhub.haiyang.com"
repository: "haiyang/postgresql"
tag: "11.11.0-debian-10-r71"
……省略……
zookeeper:
enabled: true
image:
registry: "dockerhub.haiyang.com"
repository: "haiyang/zookeeper"
tag: "3.6.2-debian-10-r185"
busybox部分的处理:
#找到对应的模块文件:
grep -r "busybox" templates/
---
templates/_helpers.tpl: image: busybox:1.30
替换命令:
sed -i “s|image: busybox:1.30|image: $MY_HARBOR/busybox:1.30|g” templates/_helpers.tpl
至此,我们已经完成了dolphinscheduler、postgresql、zookeeper、busybox这些镜像地址的替换。
再修改一下pod中路径配置,从mycluster修改到本地文件(临时修改,重启pod后数据会丢失)
sed -i ‘/resource.hdfs.fs.defaultFS:/ s|hdfs://mycluster:8020|file:///|’ values.yaml
接下来就可以用helm来安装DS了。安装DS到指定的k8s命名空间中:
最终pod状态截图如下,所有pod均ready:
测试时,可以用port-forward命令映射出端口验证一下:
kubectl port-forward --address 0.0.0.0 -n test svc/dolphinscheduler-api 12345:12345
或直接将service的类型修改为NodePort:
kubectl patch svc dolphinscheduler-api -n bigdata -p ‘{“spec”:{“type”:“NodePort”}}’
之后再访问对应的端口,如:http://192.168.1.168:35246/dolphinscheduler/ui
默认用户名和密码为:admin/dolphinscheduler123
登录进去看一下:
2.SeaTunnel部署
SeaTunnel(ST)目前的最新版本为2.3.12。
为了快速安装,这里也还是使用helm。https://seatunnel.apache.org/docs/2.3.12/start-v2/kubernetes/helm
SeaTunnel官方指定的helm仓库中最新的为2.3.10,我们也使用这个版本的helm进行安装:
export VERSION=2.3.10
#创建seatunnel_helm
mkdir seatunnel_helm
#切换到seatunnel_helm
cd seatunnel_helm
#拉取seatunnel的helm镜像
helm pull oci://registry-1.docker.io/apache/seatunnel-helm --version ${VERSION}
#如果拉取失败可以尝试通过配置代理尝试,如:
HTTP_PROXY=http://192.168.1.66:7078 HTTPS_PROXY=http://192.168.1.66:7078 helm pull oci://registry-1.docker.io/apache/seatunnel-helm --version ${VERSION}
#解压seatunnel的helm包:
tar -xvf seatunnel-helm-${VERSION}.tgz
cd seatunnel-helm
与前面部署DS类似的,部署前也需要将对应的seatunnel镜像拉取并推送到docker的私有仓库中。
#获取出seatunnel这个helm镜像的docker镜像
helm template . | grep "image:" | awk '{print $2}' | tr -d '"' | sort | uniq
#拉取对应的seatunnel镜像
docker pull apache/seatunnel:2.3.10
#定义私有仓库地址
export MY_HARBOR="dockerhub.haiyang.com/haiyang"
#打tag
docker tag apache/seatunnel:2.3.10 $MY_HARBOR/apache/seatunnel:2.3.10
#推送到私服
docker push $MY_HARBOR/apache/seatunnel:2.3.10
再替换helm的values.yaml中的镜像地址:
sed -i “s|registry: “apache/seatunnel”|registry: “$MY_HARBOR/apache/seatunnel”|g” values.yaml
替换好镜像后,安装并启动seatunnel
#安装seatunnel到bigdata这个命名空间中
helm install seatunnel . -n bigdata
最后,再查看一下状态:
kubectl get pod -n bigdata -w
SeaTunnel的master和worker都启动就绪了。
如果要访问http接口,可直接执行以下命令将8080端口映射出来:
kubectl expose deployment seatunnel-master --type=NodePort --name=seatunnel-web --port=8080 --target-port=8080 -n bigdata
分别运行两个http接口测试一下:
curl http://127.0.0.1:25323/running-jobs
curl http://127.0.0.1:25323/system-monitoring-information
3.DS+ST联合小示例
前面两个步骤,我们已经完成了DolphinScheduler 和 SeaTunnel 在内网环境中的部署,接下来再用一个小示例验证一下。
尽管在DS的界面中也有可以直接运行SeaTunnel的组件,但它要求SeaTunnel和DolphinScheduler需要部署在同一个机器中,这与目前的部署结构不匹配。
但好在SeaTunnel提供了http接口,则我们可以使用http接口的方式向SeaTunnel提交任务。
参考的SeaTunnel接口:submit-a-job

其本质在dolphinscheduler的容器中向seatunnel-web这个service发http请求。
为了确保方案的可行性,我们可以先通过手动运行的方式验证下:
kubectl exec -it dolphinscheduler-api-6447777469-dhd8r -n bigdata – bash
curl -X GET http://seatunnel-web:8080/running-jobs

确认无误后,再在DS的界面中添加SHELL节点,尝试提交一个SeaTunnel的JOB。
在SHELL的脚本内容中输入以下内容:
curl -X POST http://seatunnel-web:8080/submit-job \
-H "Content-Type: application/json" \
-d '{
"env": {
"job.mode": "batch"
},
"source": [
{
"plugin_name": "FakeSource",
"plugin_output": "fake",
"row.num": 100,
"schema": {
"fields": {
"name": "string",
"age": "int",
"card": "int"
}
}
}
],
"transform": [],
"sink": [
{
"plugin_name": "Console",
"plugin_input": ["fake"]
}
]
}'
截图为:
之后再运行此工作流,显示为:
从日志上可以看出,任务已经提交成功并返回了一个jobId。
但需要注意的是,如果是在生产环境中用http的方式提交SeaTunnel的任务还需要做一些额外的处理,这是因为DS 节点的成功/失败状态仅代表“提交成功/失败”,而不是“数据同步成功/失败”,关于此处的详细方案这里不再进一步展开。
如要实现在K8S下比较完备的整合流程,可参考此链接:https://dev.to/chen_debra_3060b21d12b1b0/sync-api-data-to-your-data-lake-with-seatunnel-dolphinscheduler-30aj
更多推荐



所有评论(0)