部署无服务器 DolphinScheduler
本教程提供了在 AWS 平台上使用完全无服务器的 AWS EKS on Fargate 容器服务及 Amazon Aurora Serverless PostgreSQL 数据库进行部署,并给出详细的部署步骤及维护指南。
在数仓 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.thinkwithwp.com/zh_cn/eks/latest/userguide/create-cluster.html),并在跳板机中配置与集群通信。本文使用 EKS1.24 版本。
- 数据库及存储服务
同样使用 AWS Console 在 VPC 私有子网中创建无服务器 Aurora PostgreSQL 数据库集群(参考:https://docs.thinkwithwp.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.create-cluster.html)。本文使用 Aurora-PostgreSQL14.4 版本。
- 构建 DolphinScheduler 自定义镜像
为了后续基于官方开源镜像做定制化,使用 AWS ECR 进行镜像管理,分别创建 DolphinScheduler 镜像 ECR 仓库,将官方镜像 push 上去(参考:https://docs.thinkwithwp.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.thinkwithwp.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.thinkwithwp.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.thinkwithwp.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
访问 DolphinScheduler 地址:http://k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.region-code.amazonaws.com:12345/dolphinScheduler/ui
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://thinkwithwp.com/cn/premiumsupport/
有关 DolphinScheduler 通过 github issue 进行交流:https://github.com/apache/DolphinScheduler
3. 总结
本文介绍了在 AWS 平台使用无服务器的容器服务 Amazon Elastic Kubernetes Service (EKS)、Aurora serverless PostgreSQL 数据库为主要服务搭建开源可视化任务调度系统 Apache DolphinScheduler。对于系统存储持久化,节点扩缩容,插件及依赖包安装给出了操作指引。使用 DolphinScheduler 可以实现可视化拖拉拽定义数据任务工作流,管理复杂的任务调度依赖关系,降低任务管理及日志监控的复杂度。