写点什么

海豚调度在 Kubernetes 体系中的技术实战

  • 2022-02-22
  • 本文字数:6130 字

    阅读完需:约 20 分钟

海豚调度在 Kubernetes 体系中的技术实战

海豚调度是当前非常优秀的分布式易扩展的可视化工作流任务调度平台。


基于笔者所在公司业务的特性,阐述我们使用 Kubernetes 作为海豚调度的技术底座的原因:


  • 各类独立部署项目,需要快速建立开发环境和生产环境;

  • 项目环境互联网访问受限,服务器只能使用离线的安装方式;

  • 尽可能统一的安装配置的信息,减少多个项目配置的异常;

  • 与对象存储技术的结合,统一非结构化数据的技术;

  • 便捷的监控体系,与现有监控集成;

  • 多种调度器的混合使用;

  • 全自动的资源调整能力;

  • 快速的自愈能力;


本文的案例都是基于海豚调度 1.3.9 版本为基础。Hadoop

基于 helm 工具的自动化高效部署方式

首先,我们介绍基于官网提供的 helm 的安装方式。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。也是云原生 CNCF 的毕业项目之一。


海豚的官网和 GitHub 上有非常详细的配置文件和案例。这里我们重点介绍一些社区中经常出现的咨询和问题。


官网文档地址 https://dolphinscheduler.apache.org/zh-cn/docs/1.3.9/user_doc/Kubernetes-deployment.html


GitHub 文件夹地址 https://GitHub.com/apache/dolphinscheduler/tree/1.3.9-release/docker/Kubernetes/dolphinscheduler


  • 在 value.yaml 文件中修改镜像,以实现离线安装(air-gap install);


  image:    repository: "apache/dolphinscheduler"    tag: "1.3.9"    pullPolicy: "IfNotPresent"
复制代码


针对公司内部安装好的 harbor,或者其他公有云的私仓,进行 pull,tag,以及 push。这里我们假定私仓地址是 harbor.abc.com,你所在构建镜像的主机已经进行了 docker login harbor.abc.com, 且已经建立和授权私仓下面新建 apache 项目。


执行 shell 命令


  docker pull apache/dolphinscheduler:1.3.9  dock tag apache/dolphinscheduler:1.3.9 harbor.abc.com/apache/dolphinscheduler:1.3.9  docker push apache/dolphinscheduler:1.3.9
复制代码


再替换 value 文件中的镜像信息,这里我们推荐使用 Always 的方式拉取镜像,生产环境中尽量每次去检查是否是最新的镜像内容,保证软件制品的正确性。此外,很多同学会把 tag 写成 latest(制作镜像不写 tag 信息,这样在生产环境非常危险,任何人 push 了镜像,就相当于改变了 latest 的 tag 的镜像,而且也无法判断 latest 是什么版本,所以建议要明确每次发版的 tag,并且使用 Always。


  image:    repository: "harbor.abc.com/apache/dolphinscheduler"    tag: "1.3.9"    pullPolicy: "Always"GitHub
复制代码


https://GitHub.com/apache/dolphinscheduler/tree/1.3.9-release/docker/Kubernetes/dolphinscheduler 整个目录 copy 到可以执行 helm 命令的主机,然后按照官网执行


  kubectl create ns ds139Git   MySQL install dolphinscheduler . -n ds139
复制代码


即可实现离线安装。


  • 集成 DataX MySQL Oracle 客户端组件,首先下载以下组件

  • https://repo1.maven.org/maven2/MySQL/MySQL-connector-java/5.1.49/MySQL-connector-java-5.1.49.jar

  • https://repo1.maven.org/maven2/com/Oracle/database/jdbc/ojdbc8/

  • https://GitHub.com/alibaba/DataX/blob/master/userGuid.md 根据提示进行编译构建,文件包位于 {DataX_source_code_home}/target/DataX/DataX/

  • 基于以上 plugin 组件新建 dockerfile,基础镜像可以使用已经 push 到私仓的镜像。


  FROM harbor.abc.com/apache/dolphinscheduler:1.3.9  COPY *.jar /opt/dolphinscheduler/lib/  RUN mkdir -p /opt/soft/DataX  COPY DataX /opt/soft/DataX
复制代码


保存 dockerfile,执行 shell 命令


  docker build -t harbor.abc.com/apache/dolphinscheduler:1.3.9-MySQL-Oracle-DataX .  #不要忘记最后一个点  docker push harbor.abc.com/apache/dolphinscheduler:1.3.9-MySQL-Oracle-DataX
复制代码


修改 value 文件


  image:    repository: "harbor.abc.com/apache/dolphinscheduler"    tag: "1.3.9-MySQL-Oracle-DataX"    pullPolicy: "Always"
复制代码


执行 helm install dolphinscheduler . -n ds139,或者执行 helm upgrade dolphinscheduler -n ds139,也可以先 helm uninstall dolphinscheduler -n ds139,再执行 helm install dolphinscheduler . -n ds139。


  • 通常生产环境建议使用独立外置 postgresql 作为管理数据库,并且使用独立安装的 zookeeper 环境(本案例使用了 zookeeper operator https://GitHub.com/pravega/zookeeper-operator,与海豚调度在同一个 Kubernetes 集群中)。


  ## If not exists external database, by default, Dolphinscheduler's database will use it.  postgresql:    enabled: false    postgresqlUsername: "root"    postgresqlPassword: "root"    postgresqlDatabase: "dolphinscheduler"    persistence:      enabled: false      size: "20Gi"      storageClass: "-"
## If exists external database, and set postgresql.enable value to false. ## external database will be used, otherwise Dolphinscheduler's database will be used. externalDatabase: type: "postgresql" driver: "org.postgresql.Driver" host: "192.168.1.100" port: "5432" username: "admin" password: "password" database: "dolphinscheduler" params: "characterEncoding=utf8" ## If not exists external zookeeper, by default, Dolphinscheduler's zookeeper will use it. zookeeper: enabled: false fourlwCommandsWhitelist: "srvr,ruok,wchs,cons" persistence: enabled: false size: "20Gi" storageClass: "storage-nfs" zookeeperRoot: "/dolphinscheduler"
## If exists external zookeeper, and set zookeeper.enable value to false. ## If zookeeper.enable is false, Dolphinscheduler's zookeeper will use it. externalZookeeper: zookeeperQuorum: "zookeeper-0.zookeeper-headless.zookeeper.svc.cluster.local:2181,zookeeper-1.zookeeper-headless.zookeeper.svc.cluster.local:2181,zookeeper-2.zookeeper-headless.zookeeper.svc.cluster.local:2181" zookeeperRoot: "/dolphinscheduler"
复制代码

基于 argo-cd 的 Gitops 部署方式

argo-cd 是基于 Kubernetes 的声明式 Gitops 持续交付工具。argo-cd 是 CNCF 的孵化项目,Gitops 的最佳实践工具。关于 Gitops 的解释可以参考https://about.Gitlab.com/topics/Gitops/



Gitops 可以为海豚调度的实施带来以下优点:


  • 图形化安装集群化的软件,一键安装;

  • Git 记录全发版流程,一键回滚;

  • 便捷的海豚工具日志查看;


使用 argo-cd 的实施安装步骤:


  • 从 GitHub 上下载海豚调度源码,修改 value 文件,参考上个章节 helm 安装需要修改的内容;

  • 把修改后的源码目录新建 Git 项目,并且 push 到公司内部的 Gitlab 中,GitHub 源码的目录名为 docker/Kubernetes/dolphinscheduler;

  • 在 argo-cd 中配置 Gitlab 信息,我们使用 https 的模式;


  • argo-cd 新建部署工程,填写相关信息




  • 对 Git 中的部署信息进行刷新和拉取,实现最后的部署工作;可以看到 pod,configmap,secret,service 等等资源全自动拉起。



  • 通过 kubectl 命令可以看到相关资源信息;


  [root@tpk8s-master01 ~]# kubectl get po -n ds139  NAME                                     READY   STATUS    RESTARTS   AGE  dolphinscheduler-alert-96c74dc84-72cc9   1/1     Running   0          22m  dolphinscheduler-api-78db664b7b-gsltq    1/1     Running   0          22m  dolphinscheduler-master-0                1/1     Running   0          22m  dolphinscheduler-master-1                1/1     Running   0          22m  dolphinscheduler-master-2                1/1     Running   0          22m  dolphinscheduler-worker-0                1/1     Running   0          22m  dolphinscheduler-worker-1                1/1     Running   0          22m  dolphinscheduler-worker-2                1/1     Running   0          22m
[root@tpk8s-master01 ~]# kubectl get statefulset -n ds139 NAME READY AGE dolphinscheduler-master 3/3 22m dolphinscheduler-worker 3/3 22m
[root@tpk8s-master01 ~]# kubectl get cm -n ds139 NAME DATA AGE dolphinscheduler-alert 15 23m dolphinscheduler-api 1 23m dolphinscheduler-common 29 23m dolphinscheduler-master 10 23m dolphinscheduler-worker 7 23m
[root@tpk8s-master01 ~]# kubectl get service -n ds139 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dolphinscheduler-api ClusterIP 10.43.238.5 <none> 12345/TCP 23m dolphinscheduler-master-headless ClusterIP None <none> 5678/TCP 23m dolphinscheduler-worker-headless ClusterIP None <none> 1234/TCP,50051/TCP 23m
[root@tpk8s-master01 ~]# kubectl get ingress -n ds139 NAME CLASS HOSTS ADDRESS dolphinscheduler <none> ds139.abc.com
复制代码


  • 可以看到所有的 pod 都分撒在 Kubernetes 集群中不同的 host 上,例如 worker1 和 2 都在不同的节点上。




  • 我们配置了 ingress,公司内部配置了泛域名就可以方便的使用域名进行访问;



  • 可以登录域名进行访问。



  • 具体配置可以修改 value 文件中的内容:


  ingress:    enabled: true    host: "ds139.abc.com"    path: "/dolphinscheduler"    tls:      enabled: false      secretName: "dolphinscheduler-tls"
复制代码


  • 对部署好的系统进行检查,3 个 master,3 个 worker,zookeeper 都配置正常;




  • 使用 argo-cd 可以非常方便的进行修改 master,worker,api,alert 等组件的副本数量,海豚的 helm 配置也预留了 cpu 和内存的设置信息。这里我们修改 value 中的副本值。修改后,提交公司内部 Gitlab。


  master:    ## PodManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down.    podManagementPolicy: "Parallel"    ## Replicas is the desired number of replicas of the given Template.    replicas: "5"      worker:    ## PodManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down.    podManagementPolicy: "Parallel"    ## Replicas is the desired number of replicas of the given Template.    replicas: "5"          alert:    ## Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.    replicas: "3"      api:    ## Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.    replicas: "3"
复制代码


只需要在 argo-cd 点击 sync 同步,对应的 pods 都按照需求进行了增加




  [root@tpk8s-master01 ~]# kubectl get po -n ds139  NAME                                     READY   STATUS    RESTARTS   AGE  dolphinscheduler-alert-96c74dc84-72cc9   1/1     Running   0          43m  dolphinscheduler-alert-96c74dc84-j6zdh   1/1     Running   0          2m27s  dolphinscheduler-alert-96c74dc84-rn9wb   1/1     Running   0          2m27s  dolphinscheduler-api-78db664b7b-6j8rj    1/1     Running   0          2m27s  dolphinscheduler-api-78db664b7b-bsdgv    1/1     Running   0          2m27s  dolphinscheduler-api-78db664b7b-gsltq    1/1     Running   0          43m  dolphinscheduler-master-0                1/1     Running   0          43m  dolphinscheduler-master-1                1/1     Running   0          43m  dolphinscheduler-master-2                1/1     Running   0          43m  dolphinscheduler-master-3                1/1     Running   0          2m27s  dolphinscheduler-master-4                1/1     Running   0          2m27s  dolphinscheduler-worker-0                1/1     Running   0          43m  dolphinscheduler-worker-1                1/1     Running   0          43m  dolphinscheduler-worker-2                1/1     Running   0          43m  dolphinscheduler-worker-3                1/1     Running   0          2m27s  dolphinscheduler-worker-4                1/1     Running   0          2m27s
复制代码


海豚调度与 s3 对象存储技术集成

许多同学在海豚的社区中提问,如何配置 s3 minio 的集成。这里给出基于 Kubernetes 的 helm 配置。


  • 修改 value 中 s3 的部分,建议使用 ip+端口指向 minio 服务器。


  common:    ## Configmap    configmap:      DOLPHINSCHEDULER_OPTS: ""      DATA_BASEDIR_PATH: "/tmp/dolphinscheduler"      RESOURCE_STORAGE_TYPE: "S3"      RESOURCE_UPLOAD_PATH: "/dolphinscheduler"      FS_DEFAULT_FS: "s3a://dfs"      FS_S3A_ENDPOINT: "http://192.168.1.100:9000"      FS_S3A_ACCESS_KEY: "admin"      FS_S3A_SECRET_KEY: "password"
复制代码


  • minio 中存放海豚文件的 bucket 名字是 dolphinscheduler,这里新建文件夹和文件进行测试。

海豚调度与 kube-prometheus 的技术集成

  • 我们在 Kubernetes 使用 kube-prometheus operator 技术,实现了在部署海豚后,自动实现了对海豚各个组件的资源监控。

  • 请注意 kube-prometheus 的版本,需要对应 Kubernetes 主版本。https://GitHub.com/prometheus-operator/kube-prometheus



海豚调度与 Service Mesh 的技术集成

  • 通过 Service Mesh 技术可以实现对海豚内部的服务调用,以及海豚 api 外部调用的可观测性分析,以实现海豚调度产品的自身服务优化。

  • 我们使用 linkerd 作为 Service Mesh 的产品进行集成,linkerd 也是 CNCF 优秀的毕业项目。

  • 只需要在海豚 helm 的 value 文件中修改 annotations,重新部署,就可以快速实现 mesh proxy sidecar 的注入。可以对 master,worker,api,alert 等组件都注入。


    annotations: #{}      linkerd.io/inject: enabled
复制代码




未来海豚调度基于云原生技术的展望

海豚调度作为面向新一代云原生大数据工具,未来可以在 Kubernetes 生态集成更多的优秀工具和特性,满足更多的用户群体和场景。


  • 和 argo-workflow 的集成,可以通过 api,cli 等方式在海豚调度中调用 argo-workflow 单个作业,dag 作业,以及周期性作业;

  • 使用 hpa 的方式,自动扩缩容 worker,实现无人干预的水平扩展方式;

  • 集成 Kubernetes 的 spark operator 和 Hadoopoperator 工具,全面的云原生化;

  • 实现多云和多集群的分布式作业调度;

  • 采用 sidecar 实现定期删除 worker 作业日志;


作者简介

杨滇,深圳交通中心数据和算法平台架构师

2022-02-22 15:084152

评论

发布
暂无评论
发现更多内容

混合办公-疫情之下,远程办公靠谱吗?

BeeWorks

在武汉学习web前端开发课程哪家比较好

小谷哥

Optional的使用详解

echoes

# 重要-即时通讯IM开源项目OpenIM关于版本管理及v2.3.0发布计划

Geek_1ef48b

移动互联网未来发展的五大趋势

BeeWorks

web前端开发技术前景怎么样好不好

小谷哥

SpringBoot的SpringBootApplication注解

技术小生

springboot 7月月更

究竟谁更需要已读功能?用户还是即时通讯本身?

BeeWorks

自动化测试如何实施落地?

老张

软件测试 自动化测试 项目落地

在线SQL转JSON工具

入门小站

工具

SAP Fiori 应用 Adapt UI 动态显示或者隐藏的技术设计细节解析

汪子熙

JavaScript 前端开发 web开发 SAP 7月月更

企事业单位建设知识管理的七条建议

Baklib

知识管理 企事业单位

如何深入学习Html5前端技术知识

小谷哥

实践丨手把手教你用STM32设计WiFi语音播报日程表

华为云开发者联盟

开发

leetcode 435. Non-overlapping Intervals 无重叠区间(中等)

okokabcd

LeetCode 数据结构与算法 贪心算法

大模型训练难于上青天?效率超群、易用的“李白”模型库来了

OneFlow

机器学习 gpu 模型训练

开发实践丨昇腾CANN的推理应用开发体验

华为云开发者联盟

Python 人工智能

在线多行文本批量正则替换添加后缀工具

入门小站

工具

灵雀云加入LF机密计算联盟,推进机密计算在云原生场景的应用

York

灵雀云 云原生 机密计算

【开课预告】7~9月学习课程《基于MASA Framework的EShop实战》

MASA技术团队

WorkPlus SE | 全国第1个永久免费的即时通讯软件!

BeeWorks

SaaS应用:实现企业数字化转型的最佳途径

Baklib

在上海想学web前端课程如何选择

小谷哥

C 语言入门(五)

逝缘~

7月月更

学习WEB前端去哪里培训比较好

小谷哥

Free自由协议系统Dapp开发(锁仓复利)

薇電13242772558

智能合约 dapp

自定义spring boot starter三部曲之二:实战开发

程序员欣宸

Java springboot 7月月更

linux远程复制文件命令小总结

入门小站

ST 端侧人工智能之视觉检测课程

贾献华

7月月更

2022年智能运维企业50强,博睿数据实力入选

博睿数据

数字化 智能运维 博睿数据 性能监测

海豚调度在 Kubernetes 体系中的技术实战_架构_杨滇_InfoQ精选文章