Byzer on K8S 部署 - 微软云

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

image.png

storage.SecretKey
Base 64 编码的 Azure Blob Secret Key; 可以在 portal.azure.cn 的页面查到.

image.png

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 codetenant name 都填 root

image.png
image.png

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 权限太高,请不要用于执行任务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容