美文网首页白泽
Byzer on K8S 部署 - 微软云

Byzer on K8S 部署 - 微软云

作者: 你的样子999 | 来源:发表于2022-05-04 23:44 被阅读0次

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

    相关文章

      网友评论

        本文标题:Byzer on K8S 部署 - 微软云

        本文链接:https://www.haomeiwen.com/subject/eetzertx.html