华为云 K8S 部署 Byzer

华为云 K8S 称 CCE -- Cloud Container Engine。我们部署 Byzer-lang , Byzer-Notebook。版本如下:

  • byzer-lang-k8s:3.3.0-2.4.0-SNAPSHOT

  • byzer-notebook:1.2.3

我们将需要以下华为云资源:

  • VPC 虚拟网络:部署其他云资源。

  • CCE (K8S 集群): 部署 Byzer-Notebook Byzer-lang

  • RDS for MySQL: 存储 Byzer-Notebook 元数据

  • OBS:对象存储,作为 Byzer-lang 的存储。

另外,华为 ELB Ingress Controller 需要一个域名,因国内需要备案,请事先准备。

创建 VPC

为简单起见,仅创建一个子网,网段为 192.168.0.0/24。K8S 集群,RDS for MySQL, SNAT , ELB 都部署在该 VPC。


image.png

创建 K8S 集群

参考华为云文档, 创建K8S 集群。

设置客户机,以连接K8S 集群

官方文档

有两者方式, CloudShell 和客户机,都通过 kubectl 命令操作。CloudShell 通过网页,但有效期仅1天且当前仅北京一、北京四、上海一、上海二、广州和乌兰察布一支持使用CloudShell登录容器。我们选择客户机方式。

由于客户机访问 CCE 走公网,我们为 K8S APIServer 绑定一个公网地址。首先参考文档购买公网IP。然后进入CCE 详情页面,左下角为“连接信息”,可以看到公网地址为空。点击"绑定",选择刚申请的公网IP。

然后回到 CCE 列表页。点击“连接”图标,在弹出页面下载 config 文件。存为客户机的~/.kube/config文件。执行命令:kubectl config use-context external 设置公网访问上下文。执行命令 kubectl cluster-info ,会输出 CCE 集群的连接信息。

创建 Namespace Role Service Account

登录华为云portal,找到集群,在页面上点击创建 namespace。然后设置客户机的默认 Namespace

kubectl config set-context --current --namespace=byzer

创建 service account

kubectl create serviceaccount byzer -n byzer

创建 Role byzer-admin 并赋予它在 byzer namespace 高权限

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 到 flag-qa namespace 的 role byzer-admin

kubectl create rolebinding byer-role-binding --role=byzer-admin --serviceaccount=byzer:byzer --namespace=byzer

创建 OBS Bucket

根据 华为云文档-- 快速入门操作,可以得到一个 OBS Bucket 和 AKSK。Byzer-lang 将使用 AKSK 访问 OBS Bucket。

配置 SNAT

默认情况,CCE 的 Node 无法访问Internet,造成镜像拉取失败。Byzer 也无法拉取公网数据。因而,我们配置 SNAT 规则。
首先,申请 NAT,根据你的网络流量选择规格,并选择与 CCE相同的VPC。然后,配置 SNAT 规则。
使用场景:选择 VPC - 虚拟私有云;网段: 选择前面创建的 VPC 的网段。

弹性公网IP:选择一个可用的,注意带宽是否符合你的流量需求。若没有公网IP,需要创建一个。


image.png

最后,点击确定。生成的SNAT 规则如下:


image.png

使用容器镜像服务 SWR 管理镜像

拉取境外的镜像,有时很慢甚至失败。 拉取镜像时也可能碰到 registry-1.docker.io 限流。搭建 SWR 可以较好解决这一问题;也能节省一笔公网带宽和流量费用。

上传镜像

在华为云控制台找到 SWR,点击创建组织,完成后,点击上传自有镜像。首先,创建 byzer-lang 镜像的 tar 包。命令 docker save byzer-lang-k8s:3.3.0-2.4.0-SNAPSHOT > ./byzer.tar.gz

然后使用客户端上传,跟着华为云文档指引,先登录,再上传。

完成后,可以在 我的镜像页面看到新镜像。

制作拉取镜像的凭证

默认情况,私有SWR需要凭证才能拉取镜像。我们参考 K8S 文档

首先获取凭证,创建为 K8S Secrets 对象,最后在 Byzer-lang 的 helm chart 声明。

获取凭证

根据华为文档 - 获取长期有效登录指令

获得AKSK,并执行docker login命令登录你的镜像仓库。登录成功后,检查~/.docker/config.json ,多了一条 SWR 的记录。

创建 Secrets

执行命令base64 ~/.docker/config.json,得到编码后的 凭证。如果输出有多行,请合并为一行。

创建一个 yaml,base64 编码的凭证填入data.dockerconfigjson。metadata.name请酌情替换。

apiVersion: v1

kind: Secret

metadata:

  name: ap-southeast-3-huaweicloud

  namespace: byzer

data:

  .dockerconfigjson: ewxxxxxxxxx

type: kubernetes.io/dockerconfigjson

部署 Byzer-lang

我们使用 helm 部署 byzer-lang 3.3.0-2.4.0-SNAPSHOT.

下载 byzer-lang chart 并解压

wget https://download.byzer.org/k8s-helm/byzer-lang/nightly-build/byzer-lang-helm-charts-2.4.0-SNAPSHOT.tgz

编辑 values.yaml,填写下面的参数后,执行 helm install byzer-lang . -f ./values.yaml 部署至 K8S

K8S 集群地址

values.yaml 文件的 clusterUrl 参数为 K8S ApiServer 地址,Byzer 的 Spark Driver Pod 启动时读取它,并申请 Executor Pod。如果你的 K8S 集群不能访问公网,请勿填写公网地址。建议填写私有地址,避免出错。例子如下:

clusterUrl: https://192.168.0.3:5443

华为云 OBS

Byzer-lang 使用 obs 存储数据。配置如下

fs:
  cloud:
    storage:
      enabled: true
  defaultFS: obs://obs-byzer-1/
  obs.access.key: xxx
  obs.secret.key: xxx
  obs.endpoint: obs.ap-southeast-3.myhuaweicloud.com
  obs.impl: org.apache.hadoop.fs.obs.OBSFileSystem

fs.defaultFS的格式是: obs://<obs-bucket-name>,根据实际情况修改。

fs.obs.access.keyfs.obs.secret.key 改成你的账号的AKSK。fs.obs.endpoint 根据OBS 所处区域,有所不同,可以在OBS 概览页面查询。例如:

image.png

镜像

我们从上面配置的 SWR 拉取 Byzer-lang 镜像。

imagePullSecrets:
  - name: ap-southeast-3-huaweicloud
spark.
  kubernetes.container.image.pullSecrets: ap-southeast-3-huaweicloud

image:
  repository: swr.ap-southeast-3.myhuaweicloud.com/byzer/byzer-lang-k8s
  pullPolicy: Always
  # Overrides the image tag whose default is the chart appVersion.
  tag: "3.3.0-latest"   

DeltaLake

OBS 目前不支持 DeltaLake,报下面错误。我们关闭DeltaLake。

The error typically occurs when the default LogStore implementation, that
is, HDFSLogStore, is used to write into a Delta table on a non-HDFS storage system.
In order to get the transactional ACID guarantees on table updates, you have to use the
correct implementation of LogStore that is appropriate for your storage system.
See https://docs.delta.io/latest/delta-storage.html for details.
java.io.IOException: The error typically occurs when the default LogStore implementation, that
is, HDFSLogStore, is used to write into a Delta table on a non-HDFS storage system.
In order to get the transactional ACID guarantees on table updates, you have to use the
correct implementation of LogStore that is appropriate for your storage system.
See https://docs.delta.io/latest/delta-storage.html for details.
io.delta.storage.internal.LogStoreErrors.incorrectLogStoreImplementationException(LogStoreErrors.java:41)
io.delta.storage.HDFSLogStore.writeInternal(HDFSLogStore.java:94)
io.delta.storage.HDFSLogStore.write(HDFSLogStore.java:68)
org.apache.spark.sql.delta.storage.LogStoreAdaptor.write(LogStore.scala:414)
org.apache.spark.sql.delta.storage.DelegatingLogStore.write(DelegatingLogStore.scala:119)
org.apache.spark.sql.delta.OptimisticTransactionImpl.doCommit(OptimisticTransaction.scala:1194)

classpath

Classpath 包含Byzer-lang 插件,Byzer-lang 主类,访问S3 OBS Azure ADLS 的jar 。

spark:
  driver.extraClassPath: local:///home/deploy/byzer-lang/plugin/mlsql-assert-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-excel-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-ext-ets-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-shell-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-mllib-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/main/byzer-lang-3.3.0-2.12-2.4.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/libs/juicefs-hadoop-1.0.0.jar:local:///home/deploy/byzer-lang/libs/byzer-objectstore-obs-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/libs/byzer-objectstore-blob-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/libs/byzer-objectstore-s3-3.3_2.12-0.1.0-SNAPSHOT.jar

  executor.extraClassPath: local:///home/deploy/byzer-lang/plugin/mlsql-assert-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-excel-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-ext-ets-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-shell-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/plugin/mlsql-mllib-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/main/byzer-lang-3.3.0-2.12-2.4.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/libs/juicefs-hadoop-1.0.0.jar:local:///home/deploy/byzer-lang/libs/byzer-objectstore-obs-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/libs/byzer-objectstore-s3-3.3_2.12-0.1.0-SNAPSHOT.jar:local:///home/deploy/byzer-lang/libs/byzer-objectstore-blob-3.3_2.12-0.1.0-SNAPSHOT.jar

资源配置

Byzer-lang 的资源配置即Spark 的配置。请根据需要修改下面参数.

spark:
  driver.memory: 8g
  driver.cores: 2
  driver.maxResultSize: 4g
  executor.memory: 4g
  executor.cores: 1
  executor.instances: 1

创建 RDS for MySQL

登录华为云,在顶部搜索栏搜索”rds for mysql",并选中后,进入 RDS for MySQL 页面。再点击右上角“购买数据库实例”。参考华为云文档。注意虚拟私有云(VPC) 必须与 K8S (CCE)一致。数据库版本建议 8.0 或者5.7。5.6 版本比较老,可能存在兼容性问题。由于仅保存 Byzer-Notebook 元数据,存储空间 100GB 足够。

创建后,请使用 root 账号创建一个数据库,可以取名“ notebook";并创建一个 Byzer-Notebook 访问 RDS for MySQL 的 用户。

部署 Byzer-Notebook

使用 Helm chart 部署。先下载。解压后,按照下面的指引编辑 values.yaml ,并执行helm install byzer-notebook . -f ./values.yaml 部署至 K8S

ingress

helm chart 内置 Nginx Ingres controller,这里不使用。配置如下:

ingress:
  enabled: false

镜像

从上文配置的 SWR 拉取镜像,我的SWR 地址为:swr.ap-southeast-3.myhuaweicloud.com 。请修改为你实际的地址。

image:
  repository: swr.ap-southeast-3.myhuaweicloud.com/byzer/byzer-notebook
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "1.2.3"

Service

本例子Service为 NodePort 型。如果你使用了华为云共享型 ELB,请配置为 NodePort 类型Service,独享型,请配置为 ClusterIP 型 Service。

service:
  type: NodePort
  port: 9002

用户数据隔离

不同 Byzer-Notebook 用户的 的数据,例如上传的文件,将被隔离,意味着 用户A 无法查看用户 B 的数据。我们配置下面参数:

notebook:
  user.home: /work/data

这意味着用户数据被存放在 Byzer-lang 的 /work/data/{user_name} 目录下。对于本例子,意味着 OBS Bucket 上该前缀的对象。

Byzer-lang url

Byzer-Notebook 调用 Byzer-lang 的HTTP 接口,执行 SQL,获取结果等。在 K8S 上我们配置为 Byzer-lang 的Service。例如:

notebook.
  mlsql.engine-url: http://byzer-lang-service.byzer:9003

其中 byzer-lang-service 是 Byzer-lang的service名称,byzer 是 Namespace。9003 为 Service 的端口。

数据库

使用刚创建的 RDS for MySQL。请根据你的实际情况填写端口,数据库名,IP,用户名密码。参考如下:

notebook:
  database.port: 3306
  database.name: notebook
  database.ip: "192.168.0.188"
  database.username: "notebook"
  database.password: "notebook"

配置公网访问 Byzer-Notebook

由于 Notebook Pod 和 Service 网络地址都是私有网络,公网无法访问。我们使用华为云 ELB (Elastic LoadBalancer) + ELB Ingress Controller 实现。其原理如下:


image.png

然后,跟着华为云的文档https://support.huaweicloud.com/usermanual-cce/cce_10_0251.html,创建 ELB 并配置 ELB Ingress Controller。由于价格因素,选择共享型ELB 。路由规则如下所示:

image.png

Byzer-Notebook 暂时只支持 "/" URL。完成后,访问域名,即可公网访问 Byzer-Notebook。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容