DolphinScheduler 在 KubeSphere 平台部署指南
概述
DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统,致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。本文档将详细介绍如何在 KubeSphere 平台中通过 YAML 文件部署 DolphinScheduler,使用外部 PostgreSQL 数据库和 NFS 本地映射存储方案。
目录
- 环境准备
- 1.1 KubeSphere 平台要求
- 1.2 必需组件启用
- 1.3 创建企业空间和项目
- 1.4 配置 NFS 动态供应存储类
- 外部数据库准备
- 通过 YAML 文件部署 DolphinScheduler
- 3.1 部署准备
- 3.2 镜像源配置
- 3.3 创建部署文件
- 3.4 ZooKeeper 存储和部署
- 3.5 DolphinScheduler Master 部署
- 3.6 DolphinScheduler Worker 部署
- 3.7 DolphinScheduler API 部署
- 3.8 DolphinScheduler Alert 部署
- 网络配置
- 4.1 创建 Ingress
- 部署验证与访问
- 5.1 检查服务状态
- 5.2 访问 DolphinScheduler Web 界面
- 5.3 功能验证
1. 环境准备
1.1 KubeSphere 平台要求
- KubeSphere 版本: 3.3.0+
- Kubernetes 版本: 1.20+
- 节点配置: 至少 3 个节点,每个节点最少 2 核 4GB 内存
1.2 必需组件启用
登录 KubeSphere 控制台,确保以下组件已启用:
1.3 创建企业空间和项目
创建企业空间
- 登录KubeSphere控制台
- 进入企业空间
- 点击创建,填写以下信息:
- 企业空间名称:
dolphinscheduler-workspace - 别名:
DolphinScheduler工作空间 - 描述:
DolphinScheduler分布式任务调度系统
- 企业空间名称:
创建项目
- 进入刚创建的企业空间
- 点击项目 → 创建
- 填写项目信息:
- 项目名称:
dolphinscheduler - 别名:
DolphinScheduler - 描述:
DolphinScheduler部署项目
- 项目名称:
1.4 配置 NFS 动态供应存储类
请集群管理员在集群管理界面中创建以下完整配置:
- 进入集群管理 → 应用负载 → 工作负载 → 部署
- 点击创建 → 通过YAML创建
- 复制以下完整配置并一次性创建:
# 创建存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "true" # 删除pv的时候,pv的内容是否要备份
---
# 创建DolphinScheduler专用存储类(使用相同的NFS服务器和路径)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: dolphinscheduler-nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "false" # 不设为默认,避免冲突
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "true" # 删除pv的时候,pv的内容是否要备份
# 指定特定的路径模式,直接使用命名空间和PVC名称,不再添加dolphinscheduler前缀
# 这样数据将直接存储在/NFSData/${.PVC.namespace}/${.PVC.name}路径下
pathPattern: "${.PVC.namespace}/${.PVC.name}"
---
# 部署NFS Subdir External Provisioner
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# 部署在default命名空间
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
# resources:
# limits:
# cpu: 10m
# requests:
# cpu: 10m
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.100.5 # 指定自己nfs服务器地址
- name: NFS_PATH
value: /NFSData # nfs服务器共享的目录
volumes:
- name: nfs-client-root
nfs:
server: 192.168.100.5
path: /NFSData
---
# 创建ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
# 部署在default命名空间
namespace: default
---
# 创建ClusterRole
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
# 创建ClusterRoleBinding
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# 部署在default命名空间
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
# 创建Role(用于leader选举)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
# 部署在default命名空间
namespace: default
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
# 创建RoleBinding(用于leader选举)
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
# 部署在default命名空间
namespace: default
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# 部署在default命名空间
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
重要配置说明:
-
默认存储类:
- 名称:
nfs-storage(设置为默认存储类) - 用途: 用于集群中的一般存储需求
- 路径模式: 默认路径模式,直接在NFS根目录下创建子目录
- 名称:
-
DolphinScheduler专用存储类:
- 名称:
dolphinscheduler-nfs-storage - 用途: 专门用于DolphinScheduler组件的存储需求
- 路径模式: 将所有PVC存储在NFS服务器的
dolphinscheduler子目录下,便于管理
- 名称:
-
共同配置:
- NFS服务器:
192.168.100.5(请替换为您的实际NFS服务器IP) - NFS路径:
/NFSData(请替换为您的实际NFS共享路径) - 镜像源: 使用阿里云镜像源以提高下载速度
- 命名空间: Provisioner部署在
default命名空间中 - 备份策略:
archiveOnDelete: "true"表示删除PVC时会备份数据
- NFS服务器:
存储类使用说明:
- 两个存储类使用相同的NFS服务器和路径,但有不同的路径模式和用途
- 在PVC配置中通过
storageClassName字段指定要 使用的存储类 - 如果不指定存储类,将默认使用
nfs-storage - 为避免混淆,建议在DolphinScheduler相关的PVC中明确指定
dolphinscheduler-nfs-storage
第四步:验证部署
- 检查Provisioner状态:
# 检查Provisioner Pod状态
kubectl get pods -n kube-system | grep nfs-subdir-external-provisioner
# 查看Provisioner日志
kubectl logs -n kube-system deployment/nfs-subdir-external-provisioner
- 检查存储类状态:
# 查看所有存储类
kubectl get storageclass
# 查看默认存储类详情
kubectl describe storageclass nfs-storage
# 查看DolphinScheduler专用存储类详情
kubectl describe storageclass dolphinscheduler-nfs-storage
验证部署
- 检查Provisioner状态:
# 检查Provisioner Pod状态
kubectl get pods -n default | grep nfs-client-provisioner
# 查看Provisioner日志
kubectl logs -n default deployment/nfs-client-provisioner
- 检查存储类状态:
# 查看存储类
kubectl get storageclass nfs-storage
# 查看存储类详情
kubectl describe storageclass nfs-storage
1.4.2 配置说明
环境变量说明
- PROVISIONER_NAME: 必须与StorageClass中的provisioner字段匹配
- NFS_SERVER: NFS服务器的IP地址
- NFS_PATH: NFS服务器上的共享路径
存储类参数说明
- archiveOnDelete:
"false": 删除PVC时直接删除数据目录"true": 删除PVC时将目录重命名为archived-xxx格式保留
- pathPattern: 目录命名模式
"${.PVC.namespace}/${.PVC.name}": 按命名空间和PVC名称创建目录"${.PVC.name}": 仅使用PVC名称创建目录
目录结构示例
使用上述配置,当创建名为zookeeper-pvc的PVC时,会在NFS服务器上自动创建:
/NFSData/
└── dolphinscheduler/ # 命名空间名称
└── zookeeper-pvc/ # PVC名称
└── (ZooKeeper数据文件)
说明:由于修改了pathPattern为${.PVC.namespace}/${.PVC.name},数据将直接存储在NFS服务器的/NFSData/dolphinscheduler/zookeeper-pvc/目录下,而不是/NFSData/dolphinscheduler/dolphinscheduler/zookeeper-pvc/目录下。
2. 外部数据库准备
2.1 外部 PostgreSQL 数据库信息
本部署方案使用外部 PostgreSQL 数据库,无需在 Kubernetes 中部署 PostgreSQL。
外部数据库信息:
- 数据库地址: 使用 Secret 中的 database-host 和 database-port
- 数据库名称: 使用 Secret 中的 database-name
- 用户名: 使用 Secret 中的 database-username
- 密码: 使用 Secret 中的 database-password
重要说明: 由于使用外部 PostgreSQL 数据库,不需要在 Kubernetes 集群中部署 PostgreSQL 容器。请确保外部数据库服务正常运行且网络连通。
# 创建Secret存储敏感信息
kind: Secret
apiVersion: v1
metadata:
name: dolphinscheduler-secrets
namespace: dolphinscheduler
type: Opaque
data:
# 以下是Base64编码的值,实际部署时请替换为您自己的值
admin-password: ZG9scGhpbnNjaGVkdWxlcjEyMw== # dolphinscheduler123
database-host: cG9zdGdyZXNxbC5leGFtcGxlLmNvbQ== # postgresql.example.com
database-port: NTQzMg== # 5432
database-name: ZG9scGhpbnNjaGVkdWxlcg== # dolphinscheduler
database-username: ZG9scGhpbnNjaGVkdWxlcg== # dolphinscheduler
database-password: ZG9scGhpbnNjaGVkdWxlcjEyMw== # dolphinscheduler123
生成Base64编码值的方法:
# Linux/Mac
echo -n "要编码的值" | base64
# Windows PowerShell
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("要编码的值"))
- 创建DolphinScheduler数据库:
CREATE DATABASE dolphinscheduler;
- 下载并执行初始化脚本:
# 下载DolphinScheduler数据库初始化脚本
wget https://raw.githubusercontent.com/apache/dolphinscheduler/3.2.0/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
- 授予数据库权限:
# 授予所有权限给dolphinscheduler用户
-- 授予用户创建数据库的权限
ALTER USER dolphinscheduler CREATEDB;
-- 创建数据库并指定所有者
CREATE DATABASE dolphinscheduler OWNER dolphinscheduler;
-- 授予用户对数据库的所有权限
GRANT ALL PRIVILEGES ON DATABASE dolphinscheduler TO dolphinscheduler;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dolphinscheduler;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dolphinscheduler;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO dolphinscheduler;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO dolphinscheduler;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO dolphinscheduler;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO dolphinscheduler;