亚马逊AWS官方博客
AWS 部署无服务器 DolphinScheduler
1. 背景介绍
在数仓ETL、离线及实时计算的场景下,数据任务的依赖调度关系越来越复杂。在AWS平台上提供了托管的Apache Airflow(Amazon MWAA)与AWS Step Function、AWS Glue Workflow等服务都具有一定调度编排任务的工具,但在可视化拖拉拽操作及一体化管理上的支持有一定的不足。Apache DolphinScheduler旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种 OPS 编排中的关系。解决数据研发ETL依赖错综复杂,无法监控任务健康状态的问题。
为引入Apache DolphinScheduler,同时考虑生产的健壮性及维护简易性,本文提供了在AWS平台上使用完全无服务器的AWS EKS on Fargate容器服务及Amazon Aurora Serverless PostgreSQL数据库进行部署,并给出详细的部署步骤及维护指南。
2. 部署说明
2.1 整体部署架构
- EKS集群位于两个可用区,部署在私有子网内,使用ECR镜像仓库管理DolphinScheduler镜像;
- EKS使用Fargate节点,持久化存储挂载在EFS,资源存储使用S3对象存储服务,使用Aurora Serverless PostgreSQL提供元数据库;
- DolphinScheduler api、worker及master节点通过跳板机Kubectl命令进行扩缩容;
- 使用AWS Load Balancer Controller部署internet-facing负载均衡,代理api及UI服务对外提供访问。
2.2 准备工作
- 网络规划
以美东1(us-east-1)为例,创建vpc网络:10.9.0.0/16 ,其中公有网段处于两个AZ,10.9.1.0/24与10.9.2.0/24 ,Pod网段10.9.10.0/24与10.9.11.0/24,Node网段10.9.20.0/24与10.9.21.0/24,服务网段由EKS集群生成为虚拟网段,不在VPC子网里。在VPC中创建互联网网关,在公有子网中创建NAT网关,并创建一台跳板机服务器进行命令行管理。添加路由表,公有子网关联互联网网关,其它子网默认通过NAT网关访问互联网服务。
- EKS集群创建
方便的,使用AWS Console创建EKS集群,关联上述VPC及子网(参考:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/create-cluster.html),并在跳板机中配置与集群通信。本文使用EKS1.24版本。
- 数据库及存储服务
同样使用AWS Console在VPC私有子网中创建无服务器Aurora PostgreSQL数据库集群(参考:https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.create-cluster.html)。本文使用 Aurora-PostgreSQL14.4版本。
- 构建DolphinScheduler自定义镜像
为了后续基于官方开源镜像做定制化,使用AWS ECR进行镜像管理,分别创建DolphinScheduler镜像ECR仓库,将官方镜像push上去(参考:https://docs.aws.amazon.com/zh_cn/AmazonECR/latest/userguide/docker-push-ecr-image.html)。本文使用DolphinScheduler3.1.2版本。
2.3 安装AWS Load Balancer Controller
在EKS集群关联OIDB身份提供商。Amazon EKS支持使用 OpenID Connect (OIDC) 身份提供商作为对您的集群的用户进行身份验证的方法。EKS集群具有与其关联的 (OIDC)颁发者 URL。要将AWS Identity and Access Management(IAM)角色用于服务账户,集群必须存在 IAM OIDC提供商。使用 eksctl或AWS Management Console为集群创建 OIDC 提供商。(参考:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)
按官方文档步骤,创建IAM角色,在AWS Load Balancer Controller的kube-system命名空间中创建名为aws-load-balancer-controller的Kubernetes服务账户,并使用IAM角色的名称注释Kubernetes服务账户。使用helm安装AWS Load Balancer Controller。(参考:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/aws-load-balancer-controller.html)
2.4 使用helm部署DolphinScheduler
2.4.1 下载并解压DolphinScheduler
2.4.2 修改配置文件values.yaml
2.4.3 设置alert、api、worker、master服务资源需求:
2.4.4 创建命名空间DolphinScheduler
2.4.5 创建fargate配置文件
分别定义关联命名空间DolphinScheduler与kube-system的Fargate配置文件,以指定在启动时哪些pods使用Fargate,然后在集群中的Fargate上安排 pods。(参考:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/fargate-profile.html)
2.4.6 将DolphinScheduler发布到DolphinScheduler的命名空间中
2.4.7. 创建网络负载均衡器,提供外部访问uri
获取负载均衡DNS服务地址
访问DolphinScheduler地址:http://k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.region-code.amazonaws.com:12345/dolphinScheduler/ui
2.5 连接Amazon Athena数据源测试
2.5.1 安装Athena JDBC驱动
分别修改api server与worker server镜像,创建DockerFile重新build镜像并推送到ECR仓库中。
2.5.2 更新DolphinScheduler
2.5.3 创建Athena连接并测试
2.5.4 创建工作流
2.5.5 执行工作流查看日志
3 FAQ
3.1 如何安装依赖包及插件?
通过重新编辑镜像进行依赖包安装,通常仅需更新worker server镜像即可。示例参考本文2.5章节。
3.2 如何进行节点扩缩容?
在跳板机执行kubectl命令进行扩缩容
3.3 如何持久化服务存储?
3.3.1 安装EFS CSI驱动程序
参考:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/efs-csi.html
3.3.2 创建EFS文件系统及接入点
参考:https://docs.aws.amazon.com/zh_cn/efs/latest/ug/creating-using.html
3.3.3 创建PersistentVolume
3.3.4 修改values.yaml 及template/pvc-xx.yaml文件
开启服务持久化存储并关联PersistentVolume
3.3.5 使用helm部署或更新
3.4 如何寻求支持帮助?
有关AWS平台服务通过AWS Support寻求专家指导:https://aws.amazon.com/cn/premiumsupport/
有关DolphinScheduler通过github issue进行交流:https://github.com/apache/DolphinScheduler
4 总结
本文介绍了在AWS平台使用无服务器的容器服务Amazon Elastic Kubernetes Service(EKS)、Aurora serverless PostgreSQL数据库为主要服务搭建开源可视化任务调度系统Apache DolphinScheduler。对于系统存储持久化,节点扩缩容,插件及依赖包安装给出了操作指引。使用DolphinScheduler 可以实现可视化拖拉拽定义数据任务工作流,管理复杂的任务调度依赖关系,降低任务管理及日志监控的复杂度。
参考链接
DolphinScheduler架构设计:https://DolphinScheduler.apache.org/zh-cn/docs/3.1.2/architecture/design
EKS子网tag方案:https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-load-balancer-controller-subnets/
Running stateful workloads with Amazon EKS on AWS Fargate using Amazon EFS:https://aws.amazon.com/blogs/containers/running-stateful-workloads-with-amazon-eks-on-aws-fargate-using-amazon-efs/
AWS上的无服务器:https://aws.amazon.com/cn/serverless/