Byzer 是一个云原生的应用,本文以一个例子介绍在微软云(中国区)部署 Byzer。例子要求
- AKS 最少有 24 GB 内存,6 核 CPU
- 1 个 Azure Database for MySQL
- 1 个 Azure Blob Container
- 1 台安装了 Ubuntu 20.04 的机器
完成后,用户能编辑,执行,调度 Byzer 任务。个人玩家可以使用微软云提供的免费额度创建上述资源,过程请参考微软云文档。
客户机配置
云上资源到位后,我们开始第一步,配置 Ubuntu 20.04
客户机,安装 kubectl 1.23.0
helm 3.8.1
az
( azure 命令行), 配置 AKS 集群的连接信息。
## 下载 kubectl 1.23.0
curl -LO https://dl.k8s.io/release/v1.23.0/bin/linux/amd64/kubectl
## 拷贝 kubectl 至可执行文件目录
chmod +x kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
输入 kubectl
,打印帮助信息,表示安装成功。
安装 helm 至 /work/server
目录
wget https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz
tar -xf helm-v3.8.1-linux-amd64.tar.gz -C /work/server/
cd /work/server
mv linux-amd64/ helm
编辑 ~/.bashrc
文件 /work/server/helm/
加入 $PATH。 执行 helm
打印帮助信息,表示安装成功。接下来,使用 apt 安装 az
sudo apt update
sudo apt install -y azure-cli
执行下面命令配置 AKS 连接信息。az login
时需要登录 azure web页面二次认证。subscription-id 是你的微软云订阅 id , resource-group 是微软云资源组, aks-name 为 aks 集群名称,都可以在 portal.azure.cn
得到。
az cloud set --name AzureChinaCloud
az login
az account set --subscription <subscription-id>
az aks get-credentials --resource-group <resource-group> --name <aks-name>
执行 kubectl cluster-info
并检查集群连接信息。
创建 K8S namespace 和权限
K8S 一般使用 namespace
隔离多个部门/业务/应用。管理员可以为各个 namespace 设置资源隔离;不同 namespace 可以存在同名的资源。我们使用命令 kubectl create namespace byzer-qa
; 并设置为默认 namespace。
kubectl config set-context --current --namespace=byzer-qa
ServiceAccount
Role
RoleBinding
是 K8S 重要概念,用于权限管控。在这里,使用 byzer
这个 serviceaccount 部署;并绑定到 byzer-admin
role。byzer-admin
具有较高权限;能创建各类 K8S 对象。下面是创建这 3 者的命令和 yaml 。
kubectl create serviceaccount byzer
使用 kubectl apply
命令创建 role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: byzer-admin
rules:
- apiGroups: [""]
resources: ["pods","deployments", "replicas", "secrets", "configmaps","services","ingresses"]
verbs: ["*"]
绑定 Service Account byzer 到 role byzer-admin
kubectl create rolebinding byer-role-binding --role=byzer-admin --serviceaccount=byzer-qa:byzer --namespace=byzer-qa
Byzer-lang 部署
完成基础配置后,开始部署 Byzer-lang 2.2.2
Byzer-notebook 1.1.1
和 DolphinScheduler 1.3.9
3 个应用。
Byzer-lang 是 Byzer 的执行引擎,不对公网暴露, 数据存储在 Azure Blob。
Byzer 团队提供的 helm chart, 内部在微软云上部署成功。 helm chart 简化了 K8S 部署, 不需要写 deployment, service configmap yaml 文件;修改 values.yaml
再部署即可。下面是详细部署步骤。
下载 helm chart
wget https://download.byzer.org/k8s-helm/byzer-lang/2.2.2/byzer-lang-helm-charts-2.2.2.tgz
# 解压至 /work/server
tar -xf helm_chart_byzer-lang-2.2.2.tgz -C /work/server
cd /work/server/byzer-lang
helm chart 的 templates 目录包含 deployment service configmap 等模板,部署时,使用 values.yaml 文件渲染模板,并部署至 K8S。
修改配置
按照你的实际情况,修改 values.yaml
中以下配置。注意,CPU 内存不要超过 AKS 每个 worker 节点可分配数,否则 Pod 无法启动。
fs.defaultFS
预先申请的 Azure Blob 地址,Byzer-lang 基于 HDFS API 访问它。格式为 wasb://<container_name>@<account_name>.blob.core.chinacloudapi.cn/
。core.chinacloudapi.cn 表示中国区微软云,其他区域有不同地址。Azure Blob jar 已经集成在 byzer 镜像,且经过测试。
clusterUrl
Base 64 编码的AKS APIServer 地址。可以在 AKS overview 页面查到,例如 https://hello-k8s-dns.hcp.chinanorth2.cx.prod.service.azk8s.cn:443
storage.SecretKey
Base 64 编码的 Azure Blob Secret Key; 可以在 portal.azure.cn
的页面查到.
spark.driver.memory
Driver 内存,例如 8g;由于 Byzer Driver 负担较重,建议比 Executor 大。
spark.driver.cores
Driver CPU 核数
spark.driver.maxResultSize
Driver 端结果集上限,例如 2g
spark.executor.memory
Executor 内存,例如 4g
spark.executor.cores
Executor CPU 核数,例如 1
spark.executor.instances
Executor 数量,例如 2
streaming.datalake.path
Azure Blob 的 DeltaLake 目录,例如 /byzer/_delta . 无需事先创建。
helm install
执行 helm install byzer-lang .
部署 。 byzer-lang
是 helm release 名称, .
表示使用当前目录 helm chart。执行后,可以在 AKS 页面看到新的 deployment, pod, service。 执行命令 kubectl get pod -l app.kubernetes.io/instance=byzer-lang
查看 Driver pod
NAME READY STATUS RESTARTS AGE
byzer-lang-deployment-686f555dc8-l7x99 1/1 Running 0 2d5h
使用 kubectl 查看 Byzer-lang log
kubectl logs $(kubectl get pod -l app.kubernetes.io/name=byzer-lang -o name | head -1)
Nginx-Ingress Controller 部署
这里,我们为 AKS 申请一个 公网 IP,创建 Nginx-ingress Pod,为 DolphinScheduler 和 Byzer-notebook 暴露公网服务。由于我国特殊国情,无法拉取 gcr.io 上的 nginx-ingress yaml 文件。Byzer 团队维护的 nginx-ingress helm chart 使用微软云中国区的 repo 安装 nginx-ingress。
## 下载 Byzer 团队维护的 nginx-ingress 。指定镜像源为 azure cn 。
wget http://download.byzer.org/k8s-helm/nginx-ingress/1.41.3/nginx-ingress-1.41.3.tgz
tar -xf nginx-ingress-1.41.3.tgz
cd nginx-ingress
## 部署 nginx-ingress
helm install nginx-ingress .
部署后,使用命令 kubectl get pod -l app=nginx-ingress
查看
kubectl get pod -l app=nginx-ingress
NAME READY STATUS RESTARTS AGE
nginx-ingress-1648861535-controller-6f857ccb9-rnhz9 1/1 Running 0 24d
nginx-ingress-1648861535-default-backend-77bd68c866-n6kq2 1/1 Running 0 24d
DolphinScheduler 部署
DolphinScheduler 1.3.9
作为 Byzer-notebook 的调度引擎。这个例子仅部署 1 个 zookeeper 实例 ;生产环境部署至少 3 个 Zookeeper 实例,且分布在不同 K8S worker node。
我们使用 Byzer 团队维护的 helm chart 部署 DolphinScheduler , 因为它集成了 MySQL JDBC驱动。
下载 DolphinScheduler helm chart
## 下载
wget http://download.byzer.org/k8s-helm/dolphinscheduler/1.3.0/dolphinscheduler-1.3.0.tgz
## 解压缩至 /work/server
tar -xf dolphinscheduler-1.3.0.tgz -C /work/server
cd /work/server/dolphinscheduler
创建 DolphinScheduler 数据库表
登录你的微软云 MySQL,执行语句创建数据库
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8mb4;
-- {mysql_username} 是 values.yaml 配置的 MySQL 用户,
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO '{mysql_username}'@'%';
然后下载 DolphinScheduler 1.3.9 安装包,配置 MySQL 连接信息 后执行脚本创建 MySQL 表。
## 下载 DolphinScheduler 1.3.9
wget --no-check-certificate https://dlcdn.apache.org/dolphinscheduler/1.3.9/apache-dolphinscheduler-1.3.9-bin.tar.gz
tar -xf apache-dolphinscheduler-1.3.9-bin.tar.gz -C /work/server
cd /work/server/apache-dolphinscheduler-1.3.9-bin/
## 下载 MySQL JDBC,放到 lib 目录
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar \
--directory-prefix /work/server/apache-dolphinscheduler-1.3.9-bin/lib/
# 编辑数据源配置文件
vi conf/datasource.properties
## 注掉 PG 设置
# spring.datasource.driver-class-name=org.postgresql.Driver
# spring.datasource.url=jdbc:postgresql://localhost:5432/dolphinscheduler
## 设置 MySQL 连接信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 需要修改 ip 和端口
spring.datasource.url=jdbc:mysql://xxx:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
# 修改为你的 mysql_username
spring.datasource.username=xxx
# 修改为实际 MySQL 密码
spring.datasource.password=xxx
## 最后 wq ,保存退出
请找你的同事确认上述 MySQL 连接信息准确无误;且当前机器能访问 MySQL。 请备份数据库,再执行 DolphinScheduler 提供的脚本,创建 MySQL 表。
sh script/create-dolphinscheduler.sh
Dolphinscheduler 的 MySQL 库表创建后,我们修改 DolphinScheduler 配置并部署。
配置 MySQL 连接信息
首先,登录 Azure Portal. 在 MySQL Connection Security
界面勾选 Allow access to Azure services
, 允许 AKS 应用访问。
修改 values.yaml
postgresql:
enabled: false
externalDatabase:
type: "mysql"
driver: "com.mysql.jdbc.Driver"
host: "<your_mysql_host>"
port: "<mysql_port>"
username: "<mysql_username>"
password: "<password>"
database: "dolphinscheduler"
params: "useUnicode=true&characterEncoding=UTF-8"
配置 DolphinScheduler Pod
根据你的需要,设置 master, worker 实例数。例子设置为最小值 1.
master:
podManagementPolicy: "Parallel"
replicas: "1"
worker:
podManagementPolicy: "Parallel"
replicas: "1"
创建 DolphinScheduler Ingress 规则
我们为 DolphinScheduler 创建 Ingress 路由规则。由于是公网环境,我们设置 IP 白名单,保证安全。修改 values.yaml
ingress:
enabled: true
#host: "dolphinscheduler.org"
path: "/dolphinscheduler"
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.1.0/8
请修改 192.168.1.0/8
为你的源网段。如果你使用家庭宽带,没有固定 IP,无法设置 IP 白名单。请务必使用后,就关闭 Ingress rules。
helm install
执行 helm install dolphin .
,将部署 5 个 Pod, 我们执行命令 get pod -l app.kubernetes.io/instance=dolphin
查看
kubectl get pod -l app.kubernetes.io/instance=dolphin
NAME READY STATUS RESTARTS AGE
dolphin-alert-65c55d8b5b-j9tfj 1/1 Running 0 8d
dolphin-api-5445495cb6-gr6d2 1/1 Running 0 8d
dolphin-master-0 1/1 Running 0 8d
dolphin-worker-0 1/1 Running 0 8d
dolphin-zookeeper-0 1/1 Running 0 8d
创建 DolphinScheduler token
DolphinScheduler ingress-rules 创建后,登录 Azure Portal, 选择 你的 AKS 集群,在 Services & Ingresses
菜单,能看到 1 个 LoadBalancer 及其 公网IP。使用 http://<公网IP>/dolphinscheduler/ui/view/login/index.html
输入账号 admin
默认密码 dolphinscheduler123
登录 DolphinScheduler . 参考 DolphinScheduler Quick Start 创建 DolphinScheduler 用户,token tenant。请注意,token 默认有效期较短,根据你的需求调整。记录 token,稍后配置到 Byzer-notebook . tenant code
和 tenant name
都填 root
image.png
Byzer-notebook 部署
Byzer-notebook 提供了交互式编程环境。我们依然使用 helm chart 部署。
创建 MySQL 数据库表
CREATE DATABASE notebook DEFAULT CHARACTER SET utf8mb4;
-- {mysql_username} 是 values.yaml 配置的 MySQL 用户,
GRANT ALL PRIVILEGES ON notebook .* TO '{mysql_username}'@'%';
配置 Byzer-notebook
下载 helm chart ,解压,根据你的实际情况修改 value.yaml
https://download.byzer.org/k8s-helm/byzer-notebook/1.1.1/byzer-notebook-helm-charts-1.1.1.tgz
Notebook 基本配置
配置 | 说明 |
---|---|
notebook.security.key | 调用 byzer-notebook API时,鉴权 security key |
user.home | 用户数据根目录 |
mlsql.engine-url | Byzer-lang HTTP 接口,建议使用 K8S 内部域名, 格式为 http://<byzer-lang-service-name>.<namespace>:9003 |
mlsql.auth-client | Byzer-lang 数据权限接口,默认 streaming.dsl.auth.client.DefaultConsoleClient |
job.history.max-size | 默认 2000 Notebook 执行历史保留条数 |
job.history.max-time | 默认 30 Notebook 执行历史保留天数 |
调度配置
配置 | 说明 |
---|---|
scheduler.enable | 默认 false, 请改为 true |
scheduler.scheduler-url | DolphinScheduler URL。请使用 K8S 内部域名,格式为 http://<dolphinscheduler-service-name>.<namespace>:12345/dolphinscheduler |
scheduler.auth-token | DolphinScheduler 配置的 token |
scheduler.callback-url | Byzer-notebook 供 DolphinScheduler 回调的接口地址, 使用 K8S 内部域名 http://<byzer-notebook-service-name>.<namespace>:9002/ |
数据库配置
配置 | 说明 |
---|---|
database.port | 数据库端口,目前仅支持 MySQL 默认 3306 |
database.name | 上一步创建的 数据库名称 notebook |
database.ip | 你的数据库地址,例如 127.0.0.1,不是 jdbc 字符串 |
database.username | 上一步创建的数据库用户 |
database.password | 密码 |
Ingress 配置
配置 | 说明 |
---|---|
ingress.enabled | 请改为 true ,创建 ingress |
ingress.annotations.nginx.ingress.kubernetes.io/proxy-body-size | HTTP 上传的限制 例如 50m |
ingress.annotations.nginx.ingress.kubernetes.io/whitelist-source-range | IP 白名单网段, 例如192.168.50.0/8,10.0.0.0/8 |
AKS 部署 Byzer-notebook
执行命令 helm install byzer-notebook .
将创建 1 Deloyment 1 个 Pod, 1 个 Service, 1 Ingress . 可以使用以下命令检查
kubectl get service -l app.kubernetes.io/name=byzer-notebook
kubectl get pod -l app.kubernetes.io/name=byzer-notebook
校验
浏览器输入 http://<公网IP>/#/home
, 在注册页面填写 用户名密码注册,并登录。参考 官方文档 - 工作区 创建一个 Notebook, 输入代码select 1 AS id AS output;
并执行,应成功结束。
再根据创建调度文档 ,为 Notebook 创建调度。也应能调度成功。
FAQ
DolphinScheduler 执行任务时报错 "there is not any tenant suitable"
tenant 是 操作系统账号,DolphinScheduler 使用它执行时任务。请检查
- 创建这个任务的用户是否关联tenant
- 任务执行队列 Queue 是否关联 tenant
特别指出:DolphinScheduler 管理员账户 admin
默认没有关联 tenant, 会报错。由于 admin
权限太高,请不要用于执行任务。
网友评论