部署无服务器 DolphinScheduler

本教程提供了在 AWS 平台上使用完全无服务器的 AWS EKS on Fargate 容器服务及 Amazon Aurora Serverless PostgreSQL 数据库进行部署,并给出详细的部署步骤及维护指南。

Amazon EKS
Amazon Aurora
Serverless
Amazon RDS for PostgreSQL
无服务器
教程
亚马逊云科技
Olawale Olaleye
难度
200 - 中级
时间
30 分钟
前提条件

海外区域: 注册 / 登录 亚马逊云科技

上次更新时间
2023 年 1 月 11 日

在数仓 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 数据库进行部署,并给出详细的部署步骤及维护指南。

1. 部署说明

1.1 整体部署架构

  • EKS 集群位于两个可用区,部署在私有子网内,使用 ECR 镜像仓库管理 DolphinScheduler 镜像;
  • EKS 使用 Fargate 节点,持久化存储挂载在 EFS,资源存储使用 S3 对象存储服务,使用 Aurora Serverless PostgreSQL 提供元数据库;
  • DolphinScheduler api、worker 及 master 节点通过跳板机 Kubectl 命令进行扩缩容;
  • 使用 AWS Load Balancer Controller 部署 internet-facing 负载均衡,代理 api 及 UI 服务对外提供访问。

1.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 版本。

1.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

1.4 使用 helm 部署 DolphinScheduler

1.4.1 下载并解压 DolphinScheduler

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

1.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

1.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:
  ...

1.4.4 创建命名空间 DolphinScheduler

$ kubectl create namespace DolphinScheduler

1.4.5 创建 fargate 配置文件

分别定义关联命名空间 DolphinScheduler 与 kube-system 的 Fargate 配置文件,以指定在启动时哪些 pods 使用 Fargate,然后在集群中的 Fargate 上安排 pods。(参考:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/fargate-profile.html

1.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

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

$ 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

1.5 连接 Amazon Athena 数据源测试

1.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.cn/athena-downloads-cn/drivers/JDBC/SimbaAthenaJDBC-2.0.31.1000/AthenaJDBC42.jar

1.5.2 更新 DolphinScheduler

$ helm upgrade dolphinScheduler

1.5.3 创建 Athena 连接并测试

1.5.4 创建工作流

1.5.5 执行工作流查看日志

2. FAQ

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

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

2.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

2.3 如何持久化服务存储?

2.3.1 安装 EFS CSI 驱动程序

2.3.2 创建 EFS 文件系统及接入点

2.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 -

2.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 }}

2.3.5 使用 helm 部署或更新

$ helm upgrade DolphinScheduler

2.4 如何寻求支持帮助?

有关 AWS 平台服务通过 AWS Support 寻求专家指导https://aws.amazon.com/cn/premiumsupport/

有关 DolphinScheduler 通过 github issue 进行交流:https://github.com/apache/DolphinScheduler

3. 总结

本文介绍了在 AWS 平台使用无服务器的容器服务 Amazon Elastic Kubernetes Service (EKS)、Aurora serverless PostgreSQL 数据库为主要服务搭建开源可视化任务调度系统 Apache DolphinScheduler。对于系统存储持久化,节点扩缩容,插件及依赖包安装给出了操作指引。使用 DolphinScheduler 可以实现可视化拖拉拽定义数据任务工作流,管理复杂的任务调度依赖关系,降低任务管理及日志监控的复杂度。

参考链接