亚马逊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


$ tar -zxvf apache-DolphinScheduler--src.tar.gz
$ cd apache-DolphinScheduler--src/deploy/kubernetes/DolphinScheduler

2.4.2 修改配置文件values.yaml


##修改镜像仓库地址为AWS ecr
image:  registry: "xxxxxx.dkr.ecr.us-east-1.amazonaws.com"  -- ECR镜像地址  
tag: "3.1.2"
##使用外部数据源
postgresql:  
   enabled: false
mysql:  
  enabled: fals
eexternalDatabase:  
  type: "postgresql"  
  host: "DolphinScheduler.cluster-xxxxx.us-east-1.rds.amazonaws.com"
  port: "5432" 
   username: "postgres" 
   password: "xxxxxxxx"  
  database: "DolphinScheduler"  
  params: "characterEncoding=utf8" ## 使用S3 存储资源文件
conf:  
  common:    
    resource.storage.type: S3    
    resource.aws.access.key.id: xxxxxxx    
    resource.aws.secret.access.key: xxxxxxxxx    
    resource.aws.region: us-east-1    
    resource.aws.s3.bucket.name: DolphinScheduler-resourse
    resource.aws.s3.endpoint: https://S3.us-east-1.amazonaws.com

2.4.3 设置alert、api、worker、master服务资源需求:


master:
  resources:
    limits:
      memory: "8Gi"
      cpu: "4"
    requests:
      memory: "2Gi"
      cpu: "500m"
worker:
  resources:
    limits:
      memory: "8Gi"
      cpu: "4"
    requests:
      memory: "2Gi"
      cpu: "500m"
api:
  ...
alert:
  ...

2.4.4 创建命名空间DolphinScheduler


$ kubectl create namespace 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的命名空间中


$ cd apache-DolphinScheduler--src/deploy/kubernetes/DolphinScheduler
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm dependency update .
$ helm install DolphinScheduler . --set image.tag=3.1.2 -n  DolphinScheduler --set region=us-east-1 --set vpcId=vpc-xxx

2.4.7. 创建网络负载均衡器,提供外部访问uri


$ echo "
apiVersion: v1
kind: Service
metadata:
  namespace: DolphinScheduler
  name: service-DolphinScheduler
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/subnets: subnet-xxx,subnet-xxx
spec:
  ports:
    - port: 12345
      targetPort: 12345
      protocol: TCP
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: DolphinScheduler-api
" | kubectl apply -f -

获取负载均衡DNS服务地址


$ kubectl get service  service-DolphinScheduler -n DolphinScheduler
NAME            TYPE           CLUSTER-IP         EXTERNAL-IP                                                                    PORT(S)        AGE
sample-service  LoadBalancer   10.9.240.137   k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.region-code.amazonaws.com  12345:32400/TCP   16h

访问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仓库中。


##示例worker镜像 DokcerFile
FROM DolphinScheduler.docker.scarf.sh/apache/DolphinScheduler-worker:3.1.2
RUN apt-get update && \
    apt-get install -y --no-install-recommends python3 && \
    apt-get install -y --no-install-recommends python3-pip && \
    rm -rf /var/lib/apt/lists/*
RUN cd /opt/DolphinScheduler/libs/ && \
    wget https://s3---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/athena-downloads-cn/drivers/JDBC/SimbaAthenaJDBC-2.0.31.1000/AthenaJDBC42.jar

2.5.2 更新DolphinScheduler


$ helm upgrade dolphinScheduler

2.5.3 创建Athena连接并测试

2.5.4 创建工作流

2.5.5 执行工作流查看日志

3 FAQ

3.1 如何安装依赖包及插件?

通过重新编辑镜像进行依赖包安装,通常仅需更新worker server镜像即可。示例参考本文2.5章节。

3.2 如何进行节点扩缩容?

在跳板机执行kubectl命令进行扩缩容


## 扩缩容 api 至3个副本
$ kubectl scale --replicas=3 deploy DolphinScheduler-api -n DolphinScheduler
## 扩缩容 master 至2个副本
$ kubectl scale --replicas=2 sts DolphinScheduler-master  -n DolphinScheduler
## 扩缩容 worker 至2个副本
$ kubectl scale --replicas=6 sts DolphinScheduler-worker  -n DolphinScheduler

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


$ echo "
apiVersion: v1
kind: PersistentVolume
metadata:
  name: dolphin-efs-pv
spec:
  capacity:
    storage: 100Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-xxx::fsap-xxx   // fsap
" | kubectl apply -f -

3.3.4 修改values.yaml 及template/pvc-xx.yaml文件


sharedStoragePersistence:
    enabled: true
    mountPath: "/opt/soft"
    accessModes:
    - "ReadWriteMany"
    ## storageClassName must support the access mode: ReadWriteMany
    storageClassName: "efs-sc"
storage: "20Gi"

开启服务持久化存储并关联PersistentVolume


{{- if .Values.common.sharedStoragePersistence.enabled }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ include "DolphinScheduler.fullname" . }}-shared
  labels:
    app.kubernetes.io/name: {{ include "DolphinScheduler.fullname" . }}-shared
    {{- include "DolphinScheduler.common.labels" . | nindent 4 }}
  annotations:
    "helm.sh/resource-policy": keep
spec:
  accessModes:
  {{- range .Values.common.sharedStoragePersistence.accessModes }}
    - {{ . | quote }}
  {{- end }}
  storageClassName: {{ .Values.common.sharedStoragePersistence.storageClassName | quote }}
  volumeName: dolphin-efs-pv
  resources:
    requests:
      storage: {{ .Values.common.sharedStoragePersistence.storage | quote }}
{{- end }}

3.3.5 使用helm部署或更新


$ helm upgrade DolphinScheduler

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/

本篇作者

张鑫

AWS解决方案架构师,负责基于AWS云平台的解决方案咨询和设计,在系统架构、数仓和实时离线计算领域有丰富的研发和架构实践经验。