
1. 背景介绍

2. 部署说明

EKS 集群位于两个可用区,部署在私有子网内,使用 ECR 镜像仓库管理 DolphinScheduler 镜像; EKS 使用 fargate 节点,持久化存储挂载在 EFS,资源存储使用 S3 对象存储服务,使用 Aurora Serverless pgsql 提供元数据库; DolphinScheduler api、worker 及 master 节点通过跳板机 kubectl 命令进行扩缩容; 使用 aws load balancer controller 部署 internet-facing 负载均衡,代理api ui 对外提供访问。
网络规划,以美东 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),并在跳板机中配置与集群通信。本文使用 EKS 1.24 版本。 数据库及存储服务 同样使用 AWS console 在 VPC 私有子网中创建无服务器Aurora PostgreSQL 数据库集群(参考:https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.create-cluster.html)。本文使用 aurora-postgresql 14.4 版本。 
构建 DolphinScheduler 自定义镜像 为了后续基于官方开源镜像做定制化,使用 AWS ECR 进行镜像管理,分别创建 DolphinScheduler 镜像 ECR 仓库,将官方镜像 push 上去(参考:https://docs.aws.amazon.com/zh_cn/AmazonECR/latest/userguide/docker-push-ecr-image.html)。本文使用 DolphinScheduler 3.1.2版本。 
在 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)
$ tar -zxvf apache-dolphinscheduler-<version>-src.tar.gz$ cd apache-dolphinscheduler-<version>-src/deploy/kubernetes/dolphinscheduler
##修改镜像仓库地址为AWS ecrimage:registry: "xxxxxx.dkr.ecr.us-east-1.amazonaws.com" -- ECR镜像地址tag: "3.1.2"##使用外部数据源postgresql:enabled: falsemysql:enabled: falseexternalDatabase: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: S3resource.aws.access.key.id: xxxxxxxresource.aws.secret.access.key: xxxxxxxxxresource.aws.region: us-east-1resource.aws.s3.bucket.name: dolphinscheduler-resourseresource.aws.s3.endpoint: https://S3.us-east-1.amazonaws.com
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:...
$ kubectl create namespace dolphinscheduler
$ cd apache-dolphinscheduler-<version>-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
$ echo "apiVersion: v1kind: Servicemetadata:namespace: dolphinschedulername: service-dolphinschedulerannotations:service.beta.kubernetes.io/aws-load-balancer-type: externalservice.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ipservice.beta.kubernetes.io/aws-load-balancer-scheme: internet-facingservice.beta.kubernetes.io/subnets: subnet-xxx,subnet-xxxspec:ports:- port: 12345targetPort: 12345protocol: TCPtype: LoadBalancerselector:app.kubernetes.io/name: dolphinscheduler-api" | kubectl apply -f -
$ kubectl get service service-dolphinscheduler -n dolphinschedulerNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEsample-service LoadBalancer 10.9.240.137 k8s-nlbsampl-nlbsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.region-code.amazonaws.com 12345:32400/TCP 16h


##示例worker镜像 DokcerFileFROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.1.2RUN 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
helm upgrade dolphinscheduler


3. FAQ
## 扩缩容 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
echo "apiVersion: v1kind: PersistentVolumemetadata:name: dolphin-efs-pvspec:capacity:storage: 100GivolumeMode: FilesystemaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: RetainstorageClassName: efs-sccsi:driver: efs.csi.aws.comvolumeHandle: fs-xxx::fsap-xxx // fsap" | kubectl apply -f -
sharedStoragePersistence: enabled: true mountPath: "/opt/soft" accessModes: - "ReadWriteMany" ## storageClassName must support the access mode: ReadWriteMany storageClassName: "efs-sc" storage: "20Gi"
{{- if .Values.common.sharedStoragePersistence.enabled }}apiVersion: v1kind: PersistentVolumeClaimmetadata:name: {{ include "dolphinscheduler.fullname" . }}-sharedlabels:app.kubernetes.io/name: {{ include "dolphinscheduler.fullname" . }}-shared{{- include "dolphinscheduler.common.labels" . | nindent 4 }}annotations:"helm.sh/resource-policy": keepspec:accessModes:{{- range .Values.common.sharedStoragePersistence.accessModes }}- {{ . | quote }}{{- end }}storageClassName: {{ .Values.common.sharedStoragePersistence.storageClassName | quote }}volumeName: dolphin-efs-pvresources:requests:storage: {{ .Values.common.sharedStoragePersistence.storage | quote }}{{- end }}
4. 参考链接
Dolphinschduler架构设计: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/
参与贡献
随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。
社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689
非新手问题列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22
如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html
来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。
参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。

添加社区小助手微信(Leonard-ds)
添加小助手微信时请说明想参与贡献。
来吧,开源社区非常期待您的参与。
☞Apache Spark + 海豚调度:PB 级数据调度挑战,教你如何构建高效离线工作流
☞Apache Dolphinscheduler 任务插件版图再添 Linkis,大幅提高计算治理能力
☞Apache DolphinScheduler 动态任务组件设计实现方案,减少前端代码





