欢迎来到 BAETYL 文档!

_images/logo-with-name.png

Baetyl,将计算、数据和服务从中心无缝延伸到边缘。

简介

BaetylLinux Foundation Edge 旗下的边缘计算项目,旨在将云计算能力拓展至用户现场。 提供临时离线、低延时的计算服务,包括设备接入、消息路由、数据遥传、函数计算、视频采集、AI推断、状态上报、配置下发等功能。

Baetyl v2 提供了一个全新的边云融合平台,采用云端管理、边缘运行的方案,分成边缘计算框架云端管理套件两部分,支持多种部署方式。可在云端管理所有资源,比如节点、应用、配置等,自动部署应用到边缘节点,满足各种边缘计算场景,特别适合新兴的强边缘设备,比如 AI 一体机、5G 路侧盒子等。

v2 和 v1 版本的主要区别如下:

  • 边缘和云端框架全部向云原生演化,已支持运行在 K8S 或 K3S 之上。
  • 引入声明式的设计,通过影子(Report/Desire)实现端云同步(OTA)。
  • 边缘框架暂不支持进程(native)运行模式,由于运行在 K3S 上,所以整体的资源开销会有增加。
  • 边缘框架将来会支持边缘节点集群。

架构

_images/baetyl-arch-v2.svgArchitecture

边缘计算框架

边缘计算框架(Edge Computing Framework)运行在边缘节点的 Kubernetes 上, 管理和部署节点的所有应用,通过应用服务提供各式各样的能力。 应用包含系统应用和普通应用,系统应用全部由 Baetyl 官方提供,用户无需配置。

目前有如下几个系统应用:

  • baetyl-init:负责激活边缘节点到云端,并初始化 baetyl-core,任务完成后就会退出。
  • baetyl-core:负责本地节点管理(node)、端云数据同步(sync)和应用部署(engine)。
  • baetyl-function: 所有函数运行时服务的代理模块,函数调用都到通过这个模块。

目前框架支持 Linux/amd64、Linux/arm64、Linux/armv7, 如果边缘节点的资源有限,可考虑使用轻量版 Kubernetes:K3S

边缘节点的硬件要求取决于你要部署的应用,推荐的最低要求如下:

  • 内存 1GB
  • CPU 1核

云端管理套件

云端管理套件(Cloud Management Suite)负责管理所有资源,包括节点、应用、配置、部署等。所有功能的实现都插件化,方便功能扩展和第三方服务的接入,提供丰富的应用。云端管理套件的部署非常灵活,即可部署在公有云上,又可部署在私有化环境中,还可部署在普通设备上,支持 K8S/K3S 部署,支持单租户和多租户。

开源版云端管理套件提供的基础功能如下:

  • 边缘节点管理
    • 在线安装
    • 端云同步(影子)
    • 节点信息
    • 节点状态
    • 应用状态
  • 应用部署管理
    • 容器应用
    • 函数应用
    • 节点匹配(自动)
  • 配置管理
    • 普通配置
    • 函数配置
    • 密文
    • 证书
    • 镜像库凭证

开源版本包含上述所有功能的 RESTful API,暂不包含前端界面(Dashboard)。

联系我们

Baetyl 作为中国首发的开源边缘计算框架, 我们旨在打造一个 轻量、安全、可靠、可扩展性强 的边缘计算社区, 为边缘计算技术的发展和不断推进营造一个良好的生态环境。 为了更好的推进 Baetyl 的发展,如果您有更好的关于 Baetyl 的发展建议, 欢迎选择如下方式与我们联系。

测试环境

下面是我们部署在百度云上的测试环境,提供给大家试玩。

http://106.12.34.129:30494/

免责申明:该测试环境只用于测试目的,我们会定期升级服务和清理数据,请不要用于生产环境。

欢迎大家反馈问题,提供建议,让 Baetyl 发展的更好,查看联系方式

边缘节点

功能简介

节点是边缘设备在云端的映射,云端一个节点代表一个边缘设备。通过在云端创建节点,在边缘设备完成节点安装后,就可以对边缘设备进行管理。此外,还可以在云端查看已有的节点,编辑节点的信息,删除节点。

使用说明

对节点的操作包括创建节点,删除节点,对节点编辑,以及安装节点。

创建节点

左侧菜单栏点击边缘节点,进入边缘节点页面并点击 创建节点,进入节点创建页面

_images/01-create-node-11.png创建节点1

_images/02-create-node-21.png创建节点2

  • 名称: 节点名称,不可为空,不可重复
  • 描述:描述可以为空
  • 标签:对节点进行标识,用于关联应用,可以不绑定标签,也可以绑定多个标签
  • 认证方式: 节点端云同步使用证书(强制)

点击确定完成节点创建后可以在节点列表看到已创建节点。

_images/03-node-list.png节点列表

删除节点

在节点列表页面点击删除,弹出确定窗口

_images/04-delete-node.png删除节点

点击确定后完成节点删除。

节点编辑

点击节点进入节点详情页可对节点描述信息和标签进行编辑,可以添加新的标签,修改已有标签键值,或删除已有标签。

_images/05-node-update-labels.png编辑节点标签

节点安装

节点安装目前支持 Kube 模式在线安装。baetyl运行模式包括 k3s+dockerk3s+containerd 两种,用户根据实际需要选择运行环境安装命令,需要注意的是,若用户选择 k3s+docker 运行环境,需先安装 docker 后再安装 k3s。

  • 节点安装-containerd _images/06-node-install-command-containerd.png节点安装-containerd
  • 节点安装-docker _images/07-node-install-command-docker.png节点安装-docker

运行环境准备就绪后,执行节点安装命令,即可安装边缘节点,效果如下:

_images/08-node-install.png节点安装效果

采用上述两种模式安装都会在 baetyl-edge-system 部署 baetyl-corebaetyl-function 两个服务。查看 baetyl-edge-system 命名空间下的pod均处于运行状态即表示节点安装完成。

_images/10-node-check.png节点检查

查看节点

在节点详情页可以看到节点已连接,显示了节点的详细信息与资源使用情况,这里需要手动刷新状态,默认20秒会上报一次状态,无需频繁刷新。

_images/11-node-detail-1.png节点详情1

点击左边栏应用部署菜单可以查看已部署的应用相关信息和资源使用情况。

_images/12-node-detail-2.png节点详情2

应用部署

名词定义

  • 容器应用:由容器服务配置和数据卷配置组成的应用。
  • 函数应用:由函数服务配置和数据卷配置组成的应用。

功能简介

应用是用于定义在一个或一组边缘节点上的部署任务,会将服务配置存储卷配置下发到匹配的目标设备上,并进行部署。应用根据边缘节点的标签来匹配目标设备,每一次应用信息的更改都会自动地下发到目标设备,并进行服务重部署及配置的更新。

应用分为容器应用和函数应用。

使用流程

创建应用流程有两种,分别为创建容器应用流程和创建函数应用流程。

应用列表

应用列表分页展示出当前实例下所有的应用信息。

在实例详情页的左侧菜单中点击应用部署,您将看到如下界面

_images/01-create-app.png01-create-app.png

右上角搜索框支持对应用名称进行模糊查询。

创建容器应用

基本信息

应用列表页面点击创建应用进入应用创建页面。

_images/02-create-container-app.png02-create-container-app.png

填写应用基本信息

  • 【名称】表示应用的名称,不可为空,不可重复
  • 【应用类型】表示应用的类型,此处选择容器应用
  • 【描述】表示应用的文字性描述
  • 【标签】表示用来标识应用的信息

点击添加标签进入标签设置界面,填写应用标签。

_images/03-create-container-app.png03-create-container-app.png

服务配置

点击下一步进入服务配置界面。

_images/04-create-container-app-config.png04-create-container-app-config.png

点击添加服务进入服务配置页面

_images/05-create-container-app-config.png05-create-container-app-config.png

填写容器服务基本信息

  • 【名称】表示服务的名称,不可为空。同一个应用中的服务名称不可重复,包含相同服务名称的不同应用部署到同一个节点会导致其中一个部署报错
  • 【镜像地址】表示服务对应的镜像地址,不可为空。该地址应该填写在边缘节点(设备)上可以通过docker拉取的镜像地址
  • 【卷配置】表示容器挂载的存储卷信息,支持hostPath、配置项和密文三种卷的挂载。 hostPath:挂载宿主机目录到容器目录;配置项:配置管理的配置信息;密文:配置管理里的密文信息。配置项创建在这里, 密文创建在这里
  • 【端口映射】表示容器内与宿主机的端口映射,支持TCP和UDP两种端口映射

点击添加卷进行卷配置

_images/07-create-container-app-volume.png07-create-container-app-volume.png

点击端口映射进行端口映射配置

  • 【宿主机端口】在服务所在的宿主机上可以通过该端口访问服务。端口范围是0-65535。如果使用了host网络,宿主机端口需要与容器端口保持一致。
  • 【容器端口】服务对外暴露的端口,其它由baetyl启动的服务可以通过该端口访问服务。如果设置了宿主机端口,必须同时设置容器端口。可以仅设置容器端口而不设置宿主机端口。端口范围是0-65535。
  • 【协议】端口对应协议,支持TCP和UDP,默认TCP。

_images/08-create-container-app-port.png08-create-container-app-port.png

如果还需要更多配置,点击页面最下方的 高级设置项 进入配置设置

_images/09-create-container-app-more.png09-create-container-app-more.png

填写高级设置项

  • 【副本数】表示服务启动的容器个数(如果配置了宿主机端口,副本数不能大于1,否则会导致端口冲突)
  • 【环境变量】表示服务容器的环境变量
  • 【启动参数】表示启动时服务的参数
  • 【资源限制】表示启动服务容器的资源限制,目前支持设置CPU和内存
  • 【host网络】表示服务容器是否使用host网络,默认使用桥接网络
  • 【特权选项】表示是否使用特权模式挂载资源,一般在摄像头,GPU或FPGA等需要较高权限访问的特殊资源时,设置为是

至此服务配置设置完成,点击确定关闭服务配置界面。

如需要设置镜像库凭证,点击引入凭证进入引入镜像库凭证界面

_images/10-create-container-app-registry.png10-create-container-app-registry.png

填写镜像库凭证

  • 【镜像库凭证】表示拉取镜像时需要的凭证信息,一般用于需要凭证的镜像仓库配置, 镜像仓库凭证在这里创建
目标设备

服务配置设置完成之后,点击下一步进入目标设备匹配界面

_images/11-create-container-app-matcher.png11-create-container-app-matcher.png

点击匹配标签,弹出标签匹配界面

_images/12-create-container-app-kv.png12-create-container-app-kv.png

输入想要匹配的节点标签名称及值,点击确定,会自动匹配出符合条件的节点

_images/13-create-container-app-select.png13-create-container-app-select.png

点击创建完成应用的创建,跳转到应用列表界面,就可以看到刚才创建的应用信息了

_images/14-create-container-app-complete.png14-create-container-app-complete.png

容器应用创建步骤到此全部完成。

创建函数应用

基本信息

应用列表页面,点击创建应用进入应用创建页面。

_images/15-create-function-app.png15-create-function-app.png

填写应用基本信息

  • 【名称】表示应用的名称,不可为空,不可重复
  • 【应用类型】表示应用的类型,此处选择函数应用
  • 【描述】表示应用的文字性描述
  • 【标签】表示用来标识应用的信息

点击添加标签进入标签设置界面,填写应用标签。

_images/16-create-function-app-label.png16-create-function-app-label.png

函数服务

点击下一步进入函数服务界面

_images/17-create-function-app-service.png17-create-function-app-service.png

点击添加服务进入服务配置页面

_images/18-create-function-app-service-config.png18-create-function-app-service-config.png

填写函数服务基本信息

  • 【名称】表示函数服务的名称,不可为空。同一个应用中的服务名称不可重复,包含相同服务名称的不同应用部署到同一个节点会导致其中一个部署报错
  • 【函数配置项】表示选择配置管理里预先配置的函数,函数配置在这里创建
  • 【运行时】表示需要选择的函数运行时环境,目前运行时环境支持python3,nodejs10和sql
  • 【函数列表】表示设置函数配置项里选择的函数的函数调用入口,支持多个函数调用

如果还需要更多配置,点击页面最下方的 高级设置项 进入配置设置

填写高级设置项

  • 【副本数】表示服务启动的容器个数
  • 【卷配置】表示配置函数存储的容器的目录
  • 【资源限制】表示启动服务容器的资源限制,目前支持设置CPU和内存

至此函数服务设置完成,点击确定关闭服务配置界面。

_images/19-create-function-app-service.png19-create-function-app-service.png

目标设备

点击下一步进入目标设备匹配界面

_images/20-create-function-app-selector.png20-create-function-app-selector.png

点击匹配标签,弹出标签匹配界面

_images/21-create-function-app-kv.png21-create-function-app-kv.png

输入想要匹配的node标签名称及值,点击确定,会自动匹配出符合条件的节点

_images/22-create-function-app-select.png22-create-function-app-select.png

点击创建完成应用的创建,跳转到应用列表界面,就可以看到刚才创建的应用信息了

_images/23-create-function-app-complete.png23-create-function-app-complete.png

函数应用创建步骤到此全部完成。

应用修改

应用列表页面,点击准备修改的应用名称查看,例如function-test,进入应用详情页面

_images/24-modify-app.png24-modify-app.png

修改操作参考应用新建功能。

注意:应用修改后最新的应用配置会自动地下发到匹配的边缘节点,并进行更新。

应用删除

在应用列表页面,点击需要删除的应用后面的删除按钮

_images/25-delete-app.png25-delete-app.png

应用部署

应用创建后,需要了解应用在边缘节点部署情况。打开应用详情页面

_images/26-deploy-app.png26-deploy-app.png

点击目标节点里的节点名,跳转到节点详情页面,边缘节点创建在这里

_images/27-app-details.png27-app-details.png

如果当前边缘节点没有在设备上安装,点击安装按钮,弹出在线安装命令

_images/28-app-install-cmd.png28-app-install-cmd.png

复制在线安装框里的命令,在设备上执行。注意:需要设备已经连接网络,设备能够访问我们的云端服务,设备端安装k8s或k3s。

安装如下:

_images/29-app-start.png29-app-start.png

期间可能需要输入用户密码。

安装完成后,可以看到应用已部署。

_images/30-app-deployed.png30-app-deployed.png

配置管理

功能简介

配置是一种用于存储应用所需配置信息的资源类型,配置允许您将配置信息从应用容器镜像中解耦,从而增强应用的可移植性。配置资源可抽象成以下四类:

  • 配置项
  • 函数配置项
  • 密文
  • 镜像仓库凭证

配置项

配置项主要用于存储常规的配置信息,例如一组配置文件。应用将配置项以数据卷挂载的方式使用。例如,在“卷配置”中挂载配置项类型的卷,使其成为容器中的文件。对于配置项的任何更新,都会通过 Report/Desire 机制自动更新到正在使用它的容器里。配置项跟 Kubernets 中的 ConfigMap 概念类似,可参考 Kubernetes文档

配置价值如下:

  • 使用配置功能可以帮您管理不同环境、不同业务的配置
  • 方便您部署相同应用的不同环境,配置文件支持多版本,方便您进行更新和回滚应用
  • 方便您快速将您的配置以文件的形式导入到容器中

目前配置项分为普通配置项和函数配置项。函数配置项用于存储函数应用需要加载的程序脚本,支持 Python36、Nodejs10、Sql 等运行时。函数配置项通过添加函数标签来进行标识。添加函数标签后,可以在创建函数应用时选择使用。 _images/function-labels-create.png创建函数标签.png

创建配置项

  1. 选择左侧导航栏 “配置管理 > 配置项 > 创建配置项”;

    _images/config-create.png创建配置项.png

  2. 填写配置项信息

    • 名称:配置项名称,不可为空,不可重复
    • 描述:配置项描述信息,可为空
    • 配置项数据: 配置项数据是键值对形式,请输入属性名和属性值。可为空
    • 运行时:目前支持 Python36、Nodejs10、Sql 运行时,可为空

    _images/config-edit.png填写配置项信息.png

配置项挂载到应用中的服务里后,在服务对应的容器中会根据配置项的内容在挂载目录下创建文件,每条配置数据(属性名-属性值)为一个文件,其中属性名即文件的名称,属性值为文件的内容。例如某条数据的属性名为 “key”,属性值为 “value”,挂载到 /test 目录下。如果挂载成功后,在 /test 目录下就存在一个名为 “key” 的文件,其内容为 “value”。

配置项数据支持两种添加方式。

添加配置数据

手动添加配置数据。变量名为文件名,变量值为文件内容。

_images/config-add.png添加配置数据.png

引入文件

从对象存储引入文件,通常为大容量文件。支持的对象存储类型有 “百度云对象存储服务(BOS)” 或者符合 AWSS3 接口的对象存储,例如 Minio,CEPH。

_images/file-import.png引入文件.png

对于使用百度云 BOS 服务的用户,可以事先将需要引入的压缩包上传至 BOS,且需要位于同一个区域。然后选择对象存储类型为 “BOS”、bucket 名称、文件名称以及是否解压,并点击 “确定”。如果选择了 “解压”,该压缩包下发端侧时会进行解压操作。用户需要自行保证解压后的文件与其他配置项数据的冲突问题。

_images/object-import.png从对象存储引入文件.png

对于外部的对象存储,可以支持符合 AWSS3 接口的对象存储,例如 Minio,CEPH。用户需要填写 endpoint、bucket名称、文件名称、是否解压等选项。如果用户不填写 AK/SK,则认为用户提供的文件具有 “公共读” 权限,并且在下发端上的时候不会进行 MD5 文件校验。

_images/object-import-awss3.png从对象存储引入文件-awss3.png

为了保证文件在下载后的数据完整性,我们采用了 MD5 校验。在引入文件的时候支持填写 MD5 值,端侧设备在下载后将会计算文件的 MD5 值,然后与云端的 MD5 值进行比对,确保数据完整性。

查找配置项

选择左侧导航栏 “配置管理 > 配置项 > 搜索栏”;

_images/config-get.png查找配置项.png

删除配置项

选择左侧导航栏 “配置管理 > 配置项 > 删除”;

_images/config-delete.png删除配置项.png

函数配置项

函数配置项是配置项的子集,默认添加了函数标签。用于存储函数应用需要加载的程序脚本,支持 Python36、Nodejs10、Sql 等运行时。添加函数标签后,可以在创建函数应用时选择该配置项使用。

创建函数配置项

  1. 选择左侧导航栏 “配置管理 > 函数 > 创建函数”;

    _images/config-function-create.png创建函数配置项.png

  2. 填写配置项信息

    • 名称:配置项名称,不可为空,不可重复
    • 描述:配置项描述信息,可为空
    • 配置项数据: 配置项数据是键值对形式,请输入属性名和属性值。可为空
    • 运行时:目前支持 Python36、Nodejs10、Sql 运行时,可为空

    _images/config-function-edit.png填写函数配置项信息.png

添加函数脚本

我们在本地调试好函数脚本后,可以添加到配置项数据中。

  • 对于 Python36 运行时的函数配置项,我们可以添加一段 Python 脚本。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def handler(event, context):
  return "Hello world!"
  • 对于 Nodejs10 运行时的函数配置项,我们可以添加一段 js 脚本。
#!/usr/bin/env node

exports.handler = (event, context, callback) => {
  callback(null, "Hello world");
};
  • 对于 Sql 运行时的函数配置项,我们可以添加一段 sql 脚本。
select name as result where uid > 6

查找函数配置项

选择左侧导航栏 “配置管理 > 函数 > 搜索栏”;

_images/config-function-get.png查找函数配置项.png

删除函数配置项

选择左侧导航栏 “配置管理 > 函数 > 删除”;

_images/config-function-delete.png删除函数配置项.png

密文

密文用于存储敏感数据,例如密码,令牌或密钥。它们可能包含一个或多个键值对。与添加配置项一样,应用服务将密文以数据卷挂载的方式使用。例如,在“卷配置”中挂载密文类型的卷,使其成为容器中的文件。对于密文的任何更新,都会自动更新到使用他的容器中。密文跟 Kubernets 中的 Secret 概念类似,可参考 Kubernetes文档

创建密文

  1. 选择左侧导航栏 “配置管理 > 密文 > 创建密文”;

    _images/secret-create.png创建密文.png

  2. 填写密文信息

    • 名称:密文名称,不可为空,不可重复
    • 描述:密文描述信息,可为空
    • 密文数据: 密文数据是键值对形式,请输入属性名和属性值。可为空

    _images/secret-edit.png填写密文.png

查找密文

选择左侧导航栏 “配置管理 > 密文 > 搜索栏”;

_images/secret-get.png查找密文.png

删除密文

选择左侧导航栏 “配置管理 > 密文 > 删除”;

_images/secret-delete.png删除密文.png

仓库镜像凭证

镜像库凭证是用于向私有 Docker 镜像库进行身份验证的凭据。资源创建完成后,可在添加应用时选择 “镜像库凭证” 引入凭证。 镜像库凭证本质上也是一个 Kubernets Secret,可参考 Kubernetes文档

创建凭证

  1. 选择左侧导航栏 “配置管理 > 镜像仓库凭证 > 创建凭证”;

    _images/registry-create.png创建凭证.png

  2. 填写凭证信息。

    • 名称:凭证名称,不可为空,不可重复
    • 描述:凭证描述信息,可以为空
    • 凭证数据: 私有 Docker 镜像库登录信息,分别为镜像地址、用户名、密码

    _images/registry-edit.png填写凭证信息.png

查找凭证

选择左侧导航栏 “配置管理 > 镜像仓库凭证 > 搜索栏”。

_images/registry-get.png查找凭证.png

重设密码

对于已创建的凭证,可以重设凭证数据中的密码。更新后的密码都会通过 Report/Desire 机制自动更新到正在使用它的容器里。

_images/password-reset.png重设密码.png

删除凭证

选择左侧导航栏 “配置管理 > 镜像仓库凭证 > 删除”;

_images/registry-delete.png删除凭证.png

应用部署实践

通过云端创建应用并部署至边缘设备上,需要完成 节点创建,节点安装,应用创建,应用节点匹配 等操作。其中,节点安装可以在应用创建并匹配节点之前或之后完成。应用与节点匹配则是通过为应用配置和节点标签相同的“匹配标签”实现(需要注意与应用标签并不相同)。通过该方式,一个应用可以匹配到多个节点,一个节点也可以关联多个应用。云端基于“匹配标签”监测目标节点,对于所有满足匹配条件的节点执行应用部署。支持多标签匹配,多标签之间是“与”的关系。 应用分为容器应用和函数应用,以容器应用为例,一个应用包含有服务配置,数据卷,镜像仓库凭证,匹配节点标签等。一个应用可以包含有多个服务,但推荐一个应用仅包含一个服务。一个服务需要对服务的端口,副本数量等进行配置,此外也可能需要对服务所使用的配置文件,相关数据等进行管理。 以在边缘设备部署一个mosquitto broker应用为例,应用中包含有一个broker的服务,服务所使用的配置文件数据卷,匹配应用标签等。

创建节点

依次点击 边缘节点 > 创建节点 打开创建节点页面,输入节点名,描述信息,添加节点标签 node=node-1

_images/01-create-node-1.png创建节点1

点击确定,返回节点列表页查看该节点已创建

_images/02-create-node-2.png创建节点2

创建配置

  • broker配置

选择菜单栏的配置管理, 在配置项栏点击创建配置项,创建应用所使用的的配置,配置名为 broker-conf , 选择添加配置数据,变量名为mosquitto.conf,即服务运行时所加载的配置文件名字,变量值即为配置文件内容。

_images/03-node-broker-conf.pngbroker配置

(变量值)文件内容如下,具体配置项说明可以参考 mosquitto配置,主要配置了mqtt broker开放1883端口,数据存储路径等

port 1883
autosave_interval 180
autosave_on_changes true
persistence true
persistence_file mosquitto.db
persistence_location /mosquitto/data/
log_type all
connection_messages true
log_dest file /mosquitto/log/mosquitto.log
allow_anonymous true

点击确定返回配置列表查看该配置项已创建

_images/04-conf-list.png配置列表

创建应用

创建应用包含有4个步骤,第一步基本信息是对添加应用配置名字与标签等基本信息;第二步是对应用所包含的服务模块进行配置,不仅包括服务启动的端口,副本数量等参数,也包括服务所使用的配置文件,镜像仓库凭证等;第三步是对应匹配的标签进行配置(需要注意匹配标签与第一步所配置的标签并不相同),通过配置与期望部署节点相同的匹配标签项,可以将应用与节点进行匹配,从而达到将应用部署到期望边缘设备的目标;第四步是对应用创建进行确认,完成应用的创建。

依次点击 应用部署 > 创建应用。在添加应用的第1步基本信息中输入应用名称,描述信息,添加应用标签(可选),然后点击下一步

_images/05-create-application-1.png创建应用1

在第2步模块配置中点击 添加容器服务

_images/06-application-add-service-1.png应用添加服务1

在创建容器服务页面对应用进行配置,配置服务名称、镜像地址

_images/07-application-add-service-2.png应用添加服务2

卷配置中对服务所使用的配置进行配置,关联之前创建的配置 broker-conf。点击 添加卷 输入卷名称conf, 卷类型选择配置项。配置项选择已创建的 broker-conf, 容器目录为/mosquitto/config,这是mosquitto应用启动后加载配置文件的路径,文件名为配置项中的配置名(在这里即为mosquitto.conf)。配置项的读写权限设置为只读类型。

_images/08-application-add-conf.png应用添加配置

端口配置项点击 添加端口映射,宿主机和容器内端口都使用 1883

_images/09-application-configure-port.png应用配置端口

点击确定完成服务配置, 然后点击下一步

在第3步目标设备页点击匹配标签,输入之前创建节点的标签键 node 和标签值 node-1,点击确定

_images/10-application-add-labels-1.png应用添加标签1

查看已匹配的节点为之前创建的节点 node-1

_images/11-application-add-labels-2.png应用添加标签2

最后第4步点击创建完成应用创建,在应用列表查看该应用已创建。

_images/12-application-list.png完成应用创建

节点安装

点击左侧菜单栏边缘节点,点击已创建的节点 node-1,在节点详情页点击 安装,复制在线安装的命令,baetyl运行模式包括 k3s+dockerk3s+containerd 两种,用户根据实际需要选择运行环境安装命令,需要注意的是,若用户选择 k3s+docker 运行环境,需先安装 docker 后再安装 k3s。

  • 节点安装-containerd _images/13-node-install-command-containerd.png节点安装1
  • 节点安装-docker _images/14-node-install-command-docker.png节点安装2

运行环境准备就绪后,执行节点安装命令,即可安装边缘节点,效果如下:

_images/15-node-install.png节点安装3

确认系统应用的服务已经启动并处于Running状态,其中系统应用位于 baetyl-edge-system 命名空间下,包括 baetyl-corebaetyl-function,用户应用位于 baetyl-edge 命名空间下, 确认之前所创建的broker应用为Running状态,表示应用已正常启动了。

_images/16-node-installation-4.png节点安装4

在节点详情页可以查看边缘设备与云端已处于连接转态,设备相关信息也已上报,可以在该页面查看设备硬件信息以及资源使用情况。这里需要手动刷新状态,默认20秒会上报一次状态,无需频繁刷新。

_images/17-node-detail-1.png节点详情1

点击左侧菜单栏的应用部署,可以查看应用部署情况以及应用资源使用情况,可以看到系统应用 baetyl-corebaetyl-function 和 用户应用 broker 的部署状态都是已部署,服务状态栏显示了3个应用各自的资源使用情况。

_images/18-node-detail-2.png节点详情2

使用mqtt.box客户端连接边缘设备,连接配置中Host填边缘设备的实际IP地址,部署的mqtt broker开放端口为1883,对订阅主题不做限制,订阅test主题后往test主题发消息验证可以接收到消息,即说明 mqtt broker 已正常运行。

_images/19-application-test.png应用测试

[注意] 如果是Mac系统的边缘设备,由于Mac系统下宿主机端口映射无法正常工作,所以连接会失败

modbus模块

简介

modbus模块基于MODBUS协议采集解析数据, 该模块支持配置多个从设备(简称为slave),设置采集周期定时采集数据。 连接方式可选TCP或RTU模式。采集数据点可以通过采集设备的id, 数据起始地址,数据单元长度,功能码,字段信息定义。 采集后的数据会以二进制流的形式发送到配置的MQTT broker主题。模块可以通过配置仅从设备采集数据,将数据以二进制流 发送到指定MQTT主题。也可以配置将采集后的数据进行解析得到所需的数据,以JSON格式发送到指定的MQTT主题。 modbus模块可以通过 baetylbaetyl-cloud 部署, 并结合baetyl-broker使用,baetyl会自动配置modbus与 baetyl-broker 之间的双向TLS连接。 可以参考 baetyl文档最佳实践

路径配置: 模块配置文件路径应为etc/baetyl/conf.yml, 日志文件路径为var/log/baetyl/service.log, 应用模块使用baetylbaetyl-cloud 部署时, 针对设备映射需要开启应用高级配置中的特权模式,并添加hostpath卷配置映射设备。例如使用/dev/ttyS0设备时,需要添加hostpath卷,其宿主机目录和 容器目录均为/dev/ttyS0。

针对模块的配置可以分为3个部分:1. slave配置 2. 任务配置 3. 数据发送配置,此外,还可以通过该模块反控设备。

slave配置

slaves用于配置与模块连接的slave, 支持配置多个slave, 每个slave必须有唯一的id,否则后定义的slave会覆盖先定义的slave连接配置信息。 slave连接可以通过TCP或RTU模式连接,默认为RTU模式。此外,模块也支持自动重连机制,即slave因故障与模块连接断开后,从故障恢复后,模块 会自动重连设备并继续采集数据

  • TCP模式:
id: 1 # 设备id
address: tcp://127.0.0.1:502 # 设备地址
mode: tcp # tcp模式
timeout: 10s # 超时时间,默认10s
idletimeout: 1m # 空闲tcp连接保留时间,默认1分钟
  • RTU模式:
id: 1 # 设备id
address: /dev/ttyUSB4 # 设备地址   timeout: 10s # 超时时间,默认10s
mode: rtu # rtu模式
idletimeout: 1m # 空闲tcp连接保持时间,默认1分钟
baudrate: 19200 # 波特率 默认为19200
databits: 8 # 数据位,可选(5,6,7,8) 默认为8 
stopbits: 1 # 停止位,可选(1,2) 默认为1
parity: E # 奇偶校验类型,可选N(无,对应stopbits应配置为2),E(奇校验),O(偶校验) 默认为E

任务配置

任务提供了对一系列数据点和采集周期,仅采集或采集并解析的定义。在模块配置中可以定义多个任务, 一个任务对应一个slave, 在任务定义中可以配置采集周期,指定任务为采集或是采集并解析。

配置详情如下:

slaveid: 1 # 任务采集的设备id
interval: 20s # 采集周期
encoding: json # 编码,可配置为binary或json,binary即采集后以二进制流发送,json即采集并解析以JSON发送 
time: # 任务采集的时间信息, encoding为binary时仅支持配置precision
  name: time # 时间field名,默认为'time'
  type: integer # 可配置为integer和string,默认为integer
  format: '2006-01-02 15:04:05' # 时间格式,需配置为与2006-01-02 15:04:05相同时间的格式,默认为2006-01-02 15:04:05
  precision: s # 可配置为s或ns,即精确到秒或者纳秒,默认为s
maps:
- function: 3 # 功能码 可配置为(1,2,3,4),下文有详细说明
  address: 40011 # 起始地址
  quantity: 4 # 采集数量,encoding为json时无需配置,会自动推断
  field: # encoding为json时必须配置field
    name: temperature # 解析field名
    type: float64 # 解析数据类型
publish:
  topic: # 发送的主题
  qos: #发送qos

该配置解释为,从slave id 为1的slave上定时采集数据,采集周期为20s。采集起始地址为40011, 由于功能码为3,对应采集保持寄存器的数据。 quantity定义为4,单个寄存器的数据长度为16bit(2字节),表示从起始地址开始采集8字节的数据。 采集后的数据会按照大端字节序解析为float64类型的value, key通过field.name指定,在这里是temperature。因此待发送数据(非真实数据)格式为

{
    "slaveid": 1, 
    "time": "2020-05-20 15:04:05",
    "attr": {
        "temperature": 35.32 
    }
}

该数据会发送至jobs中定义的主题。当运行在baetyl中时,可以不配置主题,默认为 ${service-name}/${slaveid}。

  • 解析类型 模块支持的解析数据类型包括有bool、int16、uint16、int32、uint32、int64、uint64、float32、float64。在 指定解析项type时,应为以上类型之一。此外,解析时使用大端字节序。

  • 功能码 ​Modbus​可​访问​的​数据​存储​在​四​个​数据​库​或​地址​范围​的​其中​一个: 线圈​状态、​离散​量​输入、​保持​寄存器​和​输入​寄存器。 其中线圈转态和离散量输入的数据以bit为单位,解析后的数据仅支持bool类型。线圈状态对应功能码1,离散量输入对应 功能码2。保持寄存器和输入寄存器的数据以双字节(16bit)为单位,解析数据支持前文所有数据类型。保持寄存机对应 功能码3,输入寄存器对应功能码4。

  • 采集数量 任务的encoding指定为json时,map必须对field进行配置,指定以JSON解析时的name和数据类型, map中的quantity无需 配置。因为各种数据类型对应的quantity是固定的。例如当配置field.type为int32时,即4字节,而保持寄存器或输入寄存器 的单位是16bit(2字节),因此quantity必然为2(32/16)。当配置field.type为float64时,即8字节,quantity必然为 4(64/16)。此外,当任务encoding指定为binary时,即仅进行采集,不对采集后数据进行解析。map对field配置是无效的, 且quantity必须进行配置。

  • 仅采集数据 将任务的encoding配置为json(默认值),模块会将采集后的数据进行解析并以JSON发送,将encoding配置为binary,模块 会将采集后的数据直接发送(不进行解析)。 具体格式为:

    |----|----|----|----|---------|----|---------|  
    |    ts   | id |a+l |  data   |a+l |  data   |
    

    8字节(时间戳)+ 4字节(采集设备id)+ 2字节(采集起始地址)+ 2字节(采集数量)+ 采集数据 + …

数据发送配置

modbus模块目前支持将采集解析后的数据通过MQTT协议发送至MQTT broker。连接broker支持tcp/ws/ssl/wss等方式。通过 指定待发送的MQTT主题,采集或解析后的数据会发送至该主题。 MQTT连接配置:

broker:
 clientid: Client 连接 Hub 的 Client ID。cleansession 为 false 则不允许为空
 address: [必须] Client 连接Hub的地址
 username: Client 连接Hub的用户名
 password: 如果采用账号密码,必须填 Client 连接Hub的密码,否者不用填写
 ca: 如果采用证书双向认证,必须填 Client 连接Hub的CA证书路径
 key: 如果采用证书双向认证,必须填 Client 连接Hub的客户端私钥路径
 cert: 如果采用证书双向认证,必须填 Client 连接Hub的客户端公钥路径
 timeout: 默认值:30s,Client 连接 Hub 的超时时间
 maxReconnectInterval: 默认值:3m,Client 连接 Hub 的重连最大间隔时间,从500微秒翻倍增加到最大值
 keepalive: 默认值:30s,Client 连接Hub的保持连接时间
 cleansession: 默认值:false,Client 连接 Hub 的是否保持 Session
 disableAutoAck: 默认值:false,禁用自动ack
 subscriptions: 订阅hub的主题列表
 maxCacheMessages: 默认值:10,Client 发送消息给 Hub 的内存队列大小,异常退出会导致消息丢失,恢复后 QoS 为1的消息依赖 Hub 重发    

配置示例

采集

broker:
  address: tcp://127.0.0.1:1883 # 连接mqtt hub的地址 
  clientid: modbus-1 # 连接mqtt hub时使用的client id,基于baetyl框架运行时可不配置
slaves:
  - id: 1 # slave id
    address: tcp://127.0.0.1:502 # 基于tcp连接slave时的地址
    mode: tcp # tcp模式
jobs:
  - slaveid: 1 # 采集任务的对应设备
    encoding: binary # 指定仅采集数据,数据以二进制流发送
    maps:
      - function: 1 # 功能码,对应线圈状态
        address: 32 # 起始地址
        quantity: 1 # 采集数量,线圈状态对应1bit,encoding为binary时,quantity不可缺失
      - function: 3 # 功能码,对应保持寄存器
        address: 40011 # 起始地址
        quantity: 1 # 采集数量,保持寄存器对应16bit,encoding为binary时,quantity不可缺失
    publish:
      topic: test # 采集数据发送的mqtt主题
logger:
  filename: var/log/baetyl/service.log # 日志路径 
  level: info # 日志级别

采集并解析

broker:
  address: tcp://127.0.0.1:1883 # 连接mqtt hub的地址 
  clientid: modbus-1 # 连接mqtt hub时使用的client id,基于baetyl框架运行时可不配置
slaves:
  - id: 1 # slave id
    address: tcp://127.0.0.1:502 # 基于tcp连接slave时的地址
    mode: tcp # tcp模式
jobs:
  - slaveid: 1 # 采集任务的对应设备
    encoding: json # 指定采集解析数据,数据以JSON发送,默认为json
    maps:
      - function: 2 # 功能码,对应离散量输入
        address: 47 # 起始地址
        quantity: 1 # 采集数量,离散量输入对应1bit, 当解析数据时模块可自动确定
        field:
          name: switch # 解析后数据field名
          type: bool # 针对float32数据类型解析数据
      - function: 4 # 功能码,对应输入寄存器
        address: 30027 # 起始地址
        quantity: 1 # 采集数量,输入寄存器对应16bit
        field:
          name: humidity # 解析后数据field名
          type: float32 # 针对float32数据类型解析数据
    publish:
      topic: test # 采集数据发送的mqtt主题
logger:
  filename: var/log/baetyl/service.log # 日志路径 
  level: info # 日志级别

以上述配置读取modbus从设备为例,发送到MQTT broker的test主题中数据结构为

{
  "slaveid": 1,
  "attr": {
    "switch": false,
    "humidity": 43.2 
  },
  "time": 234435345,
}

其中,slaveid是在配置文件中定义的从设备id, 标识数据是从哪一个从设备读取。attr域即采集并 解析后的数据。最后,time是读取数据时的时间戳,如前文所述,可以在配置文件中对该字段的格式进行 配置。

反控

从modbus从设备读取数据是常用功能,但有时也需要通过一定方式控制modbus从设备中的数据。前者是通过该模块读取设备 的数据,而后者则是通过该模块向设备写入数据。读取时需要通过配置文件指定所需要读取的数据相关信息以及解析变量,写入 数据至modbus设备主要是通过MQTT发送数据。即配置模块订阅MQTT broker的topic, 接收写入数据的消息(类指令),再将 消息中的数据写入设备中。

需要注意的是,反控针对的是解析数据,当且仅当模块配置中存在jobs的encoding为json时,即定义了相关变量名与变量类型, 反控才能生效,还是以上述采集与解析的典型配置为例,在jobs中定义了两个变量switch和humidity, 数据类型为bool和float32 需要注意的是,需要在MQTT中配置订阅反控主题,反控主题可以为多个, 代表可以通过多个主题对设备进行控制。

配置示例:

broker:
  address: tcp://127.0.0.1:1883 # 连接mqtt hub的地址 
  clientid: modbus-1 # 连接mqtt hub时使用的client id,基于baetyl框架运行时可不配置
  subscriptions:
      - topic: control # 反控向从设备写入数据时订阅的主题
slaves:
  - id: 1 # slave id
    mode: tcp # tcp模式
    address: tcp://127.0.0.1:502 # 基于tcp连接slave时的地址
jobs:
  - slaveid: 1 # 采集任务的对应设备
    encoding: json # 指定采集解析数据,数据以JSON发送,默认为json
    maps:
      - function: 2 # 功能码,对应离散量输入
        address: 47 # 起始地址
        quantity: 1 # 采集数量,离散量输入对应1bit, 当解析数据时模块可自动确定
        field:
          name: switch # 解析后数据field名
          type: bool # 针对float32数据类型解析数据
      - function: 4 # 功能码,对应输入寄存器
        address: 30027 # 起始地址
        quantity: 1 # 采集数量,输入寄存器对应16bit
        field:
          name: humidity # 解析后数据field名
          type: float32 # 针对float32数据类型解析数据
    publish:
      topic: test # 采集数据发送的mqtt主题
logger:
  filename: var/log/baetyl/service.log # 日志路径 
  level: info # 日志级别

通过发送消息至MQTT broker的control主题,可以向从设备写入数据

{
  "slaveid": 1,
  "attr": {
    "switch": true,
    "humidity": 23.43
  }
}

和读取时的数据结构类似,slaveid标识需要反控的从设备id, 与配置文件中定义的slaveid一致。attr域中包含了期望 控制的变量,变量名也与配置文件中jobs中定义的变量一致。需要注意,如果发送配置文件中未定义的变量名与值、数据 类型与配置文件中定义不一致会被忽略。

opcua模块

简介

opcua模块基于OPCUA协议读取与写入数据, 该模块支持配置多个从设备,设置读取周期定时读取数据。 读取数据点可以通过采集设备的nodeid, 变量名称,变量类型定义。 读取的数据会以JSON发送到配置的MQTT broker主题。模块可以通过配置仅从设备采集数据,将数据进行JSON序列化后 发送到指定MQTT主题。 opcua模块可以通过 baetylbaetyl-cloud 部署, 并结合baetyl-broker使用,baetyl会自动配置opcua与 baetyl-broker 之间的双向TLS连接。 可以参考 baetyl文档最佳实践

路径配置: 模块配置文件路径相对可执行文件的相对路径应为etc/baetyl/conf.yml, 日志文件相对可执行文件路径为var/log/baetyl/service.log。

针对模块的配置可以分为3个部分:1. 连接设备配置 2. 任务配置 3. 数据发送配置,此外,还可以通过该模块反控设备。

连接设备配置

devices配置项用于配置与模块连接的设备, 支持配置多个设备, 每个设备必须有唯一的id,否则后定义的设备会覆盖先定义的设备连接配置信息。 一个设备基本连接需要包括设备id和设备端点。此外,对设备的配置还包括连接超时时间、安全、认证、证书等选项。 另外,模块也支持自动重连机制,即设备因故障与模块连接断开后,从故障恢复后,模块会自动重连设备并继续读取数据。

id: 1 # 设备id
endpoint: opc.tcp://test.local:53530/OPCUA/Server # 设备端点
timeout: 20s # 默认为10s
security:
  policy: None # 可选None、Basic128Rsa15、Basic256、Basic256Sha256、Aes128Sha256RsaOaep、Aes256Sha256RsaPss
  mode: None # 可选Invalid、None、Sign、SignAndEncrypt
auth:
  username: test # 用户名
  password: test # 密码

任务配置

任务提供了对一系列数据点和读取周期的定义。在模块配置中可以定义多个任务, 一个任务对应一个设备, 此外,任务还需要配置读取后数据将发送的MQTT broker主题。

配置详情如下:

deviceid: 1 # 任务对应设备id
interval: 20s # 读取周期
time: # 任务的时间信息
  name: time # 时间field名,默认为'time'
  type: integer # 可配置为integer和string,默认为integer
  format: '2006-01-02 15:04:05' # 时间格式,需配置为与2006-01-02 15:04:05相同时间的格式,默认为2006-01-02 15:04:05
  precision: s # 可配置为s或ns,即精确到秒或者纳秒,默认为s
properties:
- name: var # 读取数据的变量名
  type: float64 # 读取数据的数据类型
  nodeid: ns=1;i=1001 # 读取数据点对应的nodeid
publish:
  topic: # 发送的主题
  qos: #发送qos

该配置解释为,从设备id为1的设备上定时读取数据,周期为20s。读取数据的nodeid为ns=1;i=1001, 采集后的数据会与配置数据类型进行校验, key通过变量名称指定,在这里是var。因此待发送数据(非真实数据)格式为

{
    "deviceid": 1, 
    "time": "2020-05-20 15:04:05",
    "attr": {
        "var": 35.32 
    }
}

该数据会发送至jobs中定义的主题。当运行在baetyl中时,可以不配置主题,默认为${service-name}/${deviceid}。

  • nodeid NodeId的标识符部分唯一地标识名称空间中的节点,需要名称空间加上标识符才能形成完全限定的标识符。
  • 数据类型 模块支持的解析数据类型包括有bool、int16、uint16、int32、uint32、int64、uint64、float32、float64、string。在 指定解析项type时,应为以上类型之一。

数据发送配置

opcua模块目前支持将采集解析后的数据通过MQTT协议发送至MQTT broker。连接broker支持tcp/ws/ssl/wss等方式。通过 指定待发送的MQTT主题,采集或解析后的数据会发送至该主题。 MQTT连接配置:

broker:
 clientid: Client 连接 Hub 的 Client ID。cleansession 为 false 则不允许为空
 address: [必须] Client 连接Hub的地址
 username: Client 连接Hub的用户名
 password: 如果采用账号密码,必须填 Client 连接Hub的密码,否者不用填写
 ca: 如果采用证书双向认证,必须填 Client 连接Hub的CA证书路径
 key: 如果采用证书双向认证,必须填 Client 连接Hub的客户端私钥路径
 cert: 如果采用证书双向认证,必须填 Client 连接Hub的客户端公钥路径
 timeout: 默认值:30s,Client 连接 Hub 的超时时间
 maxReconnectInterval: 默认值:3m,Client 连接 Hub 的重连最大间隔时间,从500微秒翻倍增加到最大值
 keepalive: 默认值:30s,Client 连接Hub的保持连接时间
 cleansession: 默认值:false,Client 连接 Hub 的是否保持 Session
 disableAutoAck: 默认值:false,禁用自动ack
 subscriptions: 订阅hub的主题列表
 maxCacheMessages: 默认值:10,Client 发送消息给 Hub 的内存队列大小,异常退出会导致消息丢失,恢复后 QoS 为1的消息依赖 Hub 重发    

配置示例

broker:
  address: tcp://127.0.0.1:1883 # 连接mqtt hub的地址 
  clientid: opcua-1 # 连接mqtt hub时使用的client id,基于baetyl框架运行时可不配置
devices:
  - id: 1 # 设备id
    address: opc.tcp://test.local:53530/OPCUA/Server # 设备端点 
jobs:
  - deviceid: 1 # 读取任务的对应设备
    properties:
      - name: var1 # 变量名
        type: int16 # 数据类型
        nodeid: ns=3;i=1001 # 读取数据的nodeid
      - name: var2 # 变量名
        type: float64 # 数据类型
        nodeid: ns=2;i=1002 # 读取数据的nodeid
    publish:
      topic: test # 读取数据发送的mqtt主题
logger:
  filename: var/log/baetyl/service.log # 日志路径 
  level: info # 日志级别

以上述配置读取opcua设备为例,发送到MQTT broker的test主题中数据结构为

{
  "deviceid": 1,
  "attr": {
    "var1": 43,
    "var2": 23.24 
  },
  "time": 234435345,
}

其中,deviceid是在配置文件中定义的从设备id, 标识数据是从哪一个从设备读取。attr域即读取的的数据。 最后,time是读取数据时的时间戳,如前文所述,可以在配置文件中对该字段的格式进行配置。

反控

通过opcua设备读取数据是常用功能,但有时也需要通过一定方式控制opcua设备中的数据。前者是通过该模块读取设备 的数据,而后者则是通过该模块向设备写入数据。读取时需要通过配置文件指定所需要读取的数据相关信息以及解析变量,写入 数据至opcua设备主要是通过MQTT发送数据。即配置模块订阅MQTT broker的topic, 接收写入数据的消息(类指令),再将 消息中的数据写入设备中。

需要注意的是,反控使用的是配置中的相关变量,即在配置文件汇总定义了相关变量名与变量类型后,反控才能生效, 还是以上述采集与解析的典型配置为例,在jobs中定义了两个变量var1和var2, 数据类型为int16和float64 需要注意的是,需要在MQTT中配置订阅反控主题,反控主题可以为多个, 代表可以通过多个主题对设备进行控制。

broker:
  address: tcp://127.0.0.1:1883 # 连接mqtt hub的地址 
  clientid: opcua-1 # 连接mqtt hub时使用的client id,基于baetyl框架运行时可不配置
  subscriptions:
      - topic: control # 反控向从设备写入数据时订阅的主题
devices:
  - id: 1 # 设备id
    address: opc.tcp://test.local:53530/OPCUA/Server # 设备端点 
jobs:
  - deviceid: 1 # 读取任务的对应设备
    properties:
      - name: var1 # 变量名
        type: int16 # 数据类型
        nodeid: ns=3;i=1001 # 读取数据的nodeid
      - name: var2 # 变量名
        type: float64 # 数据类型
        nodeid: ns=2;i=1002 # 读取数据的nodeid
    publish:
      topic: test # 读取数据发送的mqtt主题
logger:
  filename: var/log/baetyl/service.log # 日志路径 
  level: info # 日志级别

通过发送消息至MQTT broker的control主题,可以向从设备写入数据

{
  "deviceid": 1,
  "attr": {
    "var1": 12,
    "var2": 89.87 
  }
}

和读取时的数据结构类似,deviceid标识需要反控的从设备id, 与配置文件中定义的deviceid一致。attr域中包含了期望 控制的变量,变量名也与配置文件中jobs中定义的变量一致。需要注意,如果发送配置文件中未定义的变量名与值、数据 类型与配置文件中定义不一致会被忽略。

broker 模块

简介

Baetyl-Broker 基于 Golang 语言开发,是一个单机版的消息订阅和发布中心,采用 MQTT3.1.1 协议,可在低带宽、不可靠网络中提供可靠的消息传输服务。其作为 Baetyl 框架端侧的消息中间件,为所有服务提供消息驱动的互联能力。

目前支持 4 种接入方式:TCP、SSL(TCP + SSL)、WS(Websocket)及 WSS(Websocket + SSL),MQTT 协议支持度如下:

  • 支持 ConnectDisconnectSubscribePublishUnsubscribePing 等功能
  • 支持 QoS 等级 0 和 1 的消息发布和订阅
  • 支持 RetainWillClean Session
  • 支持订阅含有 +# 等通配符的主题
  • 支持符合约定的 ClientID 和 Payload 的校验
  • 支持认证鉴权,在传输层使用 tls 证书做双向认证,在应用层支持 ACL 权限控制
  • 暂时 不支持 发布和订阅以 $ 为前缀的主题
  • 暂时 不支持 Client 的 Keep Alive 特性以及 QoS 等级 2 的发布和订阅

配置

Baetyl-Broker 的全量配置文件如下,并对配置字段做了相应解释:

listeners: # [必须]监听地址,例如:
  - address: tcp://0.0.0.0:1883 # tcp 连接
  - address: ssl://0.0.0.0:1884 # ssl 连接,ssl 连接必须配置证书
    ca: example/var/lib/baetyl/testcert/ca.crt # Server 的 CA 证书路径
    key: example/var/lib/baetyl/testcert/server.key # Server 的服务端私钥路径
    cert: example/var/lib/baetyl/testcert/server.crt # Server 的服务端公钥路径
    anonymous: true # 如果 anonymous 为 true,服务端对该端口不进行 ACL 验证
  - address: ws://0.0.0.0:8883/mqtt # ws 连接
  - address: wss://0.0.0.0:8884/mqtt # wss 连接,wss 连接必须配置证书
    ca: example/var/lib/baetyl/testcert/ca.crt # Server 的 CA 证书路径
    key: example/var/lib/baetyl/testcert/server.key # Server 的服务端私钥路径
    cert: example/var/lib/baetyl/testcert/server.crt # Server 的服务端公钥路径
    anonymous: false # 如果 anonymous 为 true,服务端对该端口不进行 ACL 验证
principals: # ACL 权限控制,支持账号密码和证书认证
  - username: test # 用户名
    password: hahaha # 密码
    permissions: # 权限控制
      - action: pub # pub 权限
        permit: ["test"] # 允许的 topic,支持通配符
      - action: sub # pub 权限
        permit: ["test"] # 允许的 topic,支持通配符
  - username: client # 如果密码为空,username 表示客户端证书的 common name,用于做证书连接的客户端的 ACL 验证
    permissions: # 权限控制
      - action: pub # pub 权限
        permit: ["#"] # 允许的 topic,支持通配符
      - action: sub # pub 权限
        permit: ["#"] # 允许的 topic,支持通配符
session: # 客户端 session 相关的设置
  maxClients: 0 # 服务端最大客户端连接数,如果为 0 或者负数表示不做限制
  maxMessagePayloadSize: 32768 # 可允许传输的最大消息长度,默认 32768 字节(32K),最大值为 268,435,455字节(约256MB) - 1
  maxInflightQOS0Messages: 100 # QOS0 消息的飞行窗口
  maxInflightQOS1Messages: 20 # QOS1 消息的飞行窗口
  resendInterval: 20s # 消息重发间隔,如果客户端在消息重发间隔内没有回复确认(ack),消息会一直重发,直到客户端回复确认或者 session 关闭
  persistence: # 消息持久化相关配置
    store: # 底层存储插件配置
      driver: boltdb # 底层存储插件,默认 boltdb
      source: var/lib/baetyl/broker.db # 存储文件路径
    queue: # 存储
      batchSize: 10 # 消息通道缓存大小
      expireTime: 24h # 消息过期时间间隔,在此间隔前的消息在下次清理时会被清理掉
      cleanInterval: 1h # 消息清理间隔,后台会按照此间隔定期清理过期消息
      writeTimeout: 100ms # 批量写超时间隔,按照此间隔进行写操作,如果间隔时间内,缓存满了,也会触发写操作
      deleteTimeout: 500ms # 批量删除已确认消息超时间隔,按照此间隔进行对已确认的消息进行删除操作,如果间隔时间内,已确认消息缓存满了,也会触发删除操作 
  sysTopics: ["$link", "$baidu"] # 系统主题

logger: # 日志
  level: info # 日志等级

function 模块

简介

Baetyl-functionBaetyl 框架端侧的函数计算框架。端侧函数计算框架由前端代理和后端函数运行时两部分组成。

Baetyl-function 提供前端代理,是函数入口,通过暴露 HTTP 接口供其他服务调用,然后将请求透传给后端的函数运行时模块。

后端函数运行时提供多种选择:

用户可以编写 python、node、sql 脚本来构建自己的业务逻辑,进行消息的过滤、转换和转发等,使用非常灵活。

函数计算基于事件驱动编程模型设置。用户可以使用 Baetyl 端侧规则引擎 baetyl-rule 模块设定规则,当由消息触发某条规则的时候,可以在该条规则内调用相关函数。Baetyl-rule 会按照如下格式请求 baetyl-function 模块:

https://[baetyl-function-service]/[function-service]/[function]

其中 baetyl-function-service 是 baetyl-function 的服务地址,例如 baetyl-function:50011,function-service 是后端函数运行时服务的名称,function 表示函数入口,如果 funciton 字段不指定的话,后端函数运行时会默认选择自身函数列表中的第一个函数。函数入口表示执行函数,对于 Python/Node 运行时来说,由函数脚本和处理函数名组成,对于 SQL 运行时来说,只有函数脚本组成,函数脚本内即是用户编写的 sql 语句。

具体使用可以参考最佳实践 Baetyl 边缘规则引擎实践

配置

Baetyl-function 的全量配置文件如下,并对配置字段做了相应解释:

server: # server 相关设置,由于把请求代理到后端的 Runtimes 模块
  address: ":50011" # 监听地址
  concurrency: # 服务端并发连接数,如果不设置的话将使用默认值
  disableKeepalive: true # 是否启用 keep-alive 连接,默认值为 false
  tcpKeepalive: false # 是否主动发送 keep-alive 消息,默认为 false
  maxRequestBodySize: # Body 最大数据量,默认为 4 * 1024 * 1024 Byte
  readTimeout: 1h # 服务端连接的读超时时间,默认值为无限制
  writeTimeout: 1h # 服务端连接的写超时时间,默认值为无限制
  idleTimeout: 1h # 在 keep alive 启动条件下,服务端等待下次消息的空闲超时时间,如果值为0,复用读超时时间
  ca: example/var/lib/baetyl/testcert/ca.crt # Server 的 CA 证书路径
  key: example/var/lib/baetyl/testcert/server.key # Server 的服务端私钥路径
  cert: example/var/lib/baetyl/testcert/server.crt # Server 的服务端公钥路径

client: # 请求后端 Runtimes 模块的客户端相关设置
  grpc: # Grpc 客户端设置
    port: 80 # 后端 Runtimes 端口
    timeout: 5m # 请求超时时间
    retries: 3 # 请求重试次数

logger: # 日志
  level: info # 日志等级

rule 模块

简介

Baetyl-Rule 可以实现 Baetyl 框架端侧的消息流转,在 Baetyl-Broker(端侧消息中心)、函数服务、Iot Hub(云端 Mqtt Broker) 进行消息交换。

支持以下的消息流转方式:

  • 订阅 Baetyl-Broker 的消息主题,发送到自身的其他消息主题,支持函数处理
  • 订阅 Baetyl-Broker 的消息主题,发送到其他消息节点(比如Iot Hub)的消息主题,支持函数处理
  • 订阅其他消息节点的消息主题,发送到 Baetyl-Broker 的消息主题,支持函数处理

其中 Baetyl 支持 Python、Node、Sql 等多种运行时,可以配置相关的脚本函数对消息进行过滤、处理、转换以及丰富等,具体可以参考 Baetyl-Function 模块。

配置

Baetyl-Rule 的全量配置文件如下,并对配置字段做了相应解释:

clients: # 消息节点,可以从节点订阅消息,也可以发送消息节点
  - name: iothub # 名称
    kind: mqtt # mqtt 类型
    address: 'ssl://u7isgiz.mqtt.iot.bj.baidubce.com:1884' # 地址
    username: client.example.org # 用户名
    ca: ../example/var/lib/baetyl/testcert/ca.pem # 连接节点的 CA
    key: ../example/var/lib/baetyl/testcert/client.key # 连接节点的私钥
    cert: ../example/var/lib/baetyl/testcert/client.pem # 连接节点的公钥
    insecureSkipVerify: true # 是否跳过服务端证书校验
rules: # 消息规则
  - name: rule1 # 规则名称,必须保持唯一
    source: # 消息源
      topic: broker/topic1 # 消息主题
      qos: 1 # 消息质量
    target: # 消息目的地
      client: iotcore # 消息节点,如果不设置,默认为 baetyl-broker
      topic: iotcore/topic2 # 消息主题
      qos: 0 # 消息质量
  - name: rule2 # 规则名称,必须保持唯一
    source: # 消息源
      topic: broker/topic5 # 消息主题
      qos: 0 # 消息质量
    target: # 消息目的地
      topic: broker/topic6 # 消息主题
      qos: 1 # 消息质量
    function: # 处理函数
      name: node85 # 函数名称

其中,Baetyl-Rule 会自动在节点信息列表中添加 Baetyl-Broker 的节点信息。当一条规则的的 client 字段未配置时,会默认设置为 Baetyl-Broker,从 Baetyl-Broker 订阅消息或者转发消息到 Baetyl-Broker。

Baetyl-cloud 安装


准备工作

声明

  • 撰写本文时所用 k8s 相关信息如下:
// kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.6", GitCommit:"dff82dc0de47299ab66c83c626e08b245ab19037", GitTreeState:"clean", BuildDate:"2020-07-15T23:30:39Z", GoVersion:"go1.14.4", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3", GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-20T12:43:34Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
  • 撰写本文使用 baetyl-cloud 版本信息如下:
// git log
commit be8687f858b5c70d8dcdd55a120949fd64668588

因为 baetyl-cloud 代码在快速迭代,最新的代码无法做到实时适配。所以用户在下载 baetyl-cloud 代码后需要切换到此版本:

git reset --hard be8687f858b5c70d8dcdd55a120949fd64668588

另外本文会定期更新来适配最新的 baetyl-cloud 代码。


Helm 快速安装

本文支持使用 helm v2/v3 版本进行安装,测试时相关版本信息如下:

// helm v3: helm version
version.BuildInfo{Version:"v3.2.3", GitCommit:"8f832046e258e2cb800894579b1b3b50c2d83492", GitTreeState:"clean", GoVersion:"go1.13.12"}

// helm v2: helm version
Client: &version.Version{SemVer:"v2.16.9", GitCommit:"8ad7037828e5a0fca1009dabe290130da6368e39", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.9", GitCommit:"8ad7037828e5a0fca1009dabe290130da6368e39", GitTreeState:"clean"}

关于 helm 的安装,可以参考 helm 安装链接

1. 安装数据库

在安装 baetyl-cloud 之前,我们需要先安装数据库,可执行如下命令安装。

// helm v3
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install mariadb --set rootUser.password=secretpassword,db.name=baetyl_cloud bitnami/mariadb
helm install phpmyadmin bitnami/phpmyadmin 

// helm v2
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install --name mariadb --set rootUser.password=secretpassword,db.name=baetyl_cloud bitnami/mariadb
helm install --name phpmyadmin bitnami/phpmyadmin 

注意:这里为了演示方便,我们 hardcode 了密码,请自行修改,可全局替换 secretpassword。

2. 初始化数据

确认 mariadb 和 phpmyadmin 都进入 Runing 状态。

kubectl get pod
# NAME                            READY   STATUS             RESTARTS   AGE
# mariadb-master-0                1/1     Running            0          2m56s
# mariadb-slave-0                 1/1     Running            0          2m56s
# phpmyadmin-55f4f964d7-ctmxj     1/1     Running            0          117s

然后执行如下命令,保持终端不要退出。

export POD_NAME=$(kubectl get pods --namespace default -l "app=phpmyadmin,release=phpmyadmin" -o jsonpath="{.items[0].metadata.name}")
echo "phpMyAdmin URL: http://127.0.0.1:8080"
kubectl port-forward --namespace default svc/phpmyadmin 8080:80

然后用浏览器打开 http://127.0.0.1:8080/index.php , 服务器输入:mariadb,账号输入:root,密码输入:secretpassword。登录后选择数据库 baetyl-cloud,点击 SQL按钮,先后将 baetyl-cloud 项目下 scripts/common/tables.sql 和 scripts/native/sql/data.sql 输入到页面执行。如果执行没有报错,则数据初始化成功。如果之前使用本教程安装过,再次安装时请注意删除 baetyl-cloud 数据库下的历史数据。

3. 安装 baetyl-cloud

对于 helm v3,直接进入 baetyl-cloud 项目所在目录,执行如下命令。

# helm v3
helm install baetyl-cloud ./scripts/charts/baetyl-cloud/

对于 helm v2, 在上述目录下用户需要额外做些操作:

  • 将 ./scripts/charts/baetyl-cloud/Chart.yaml 中 apiVersion 版本从 v2 修改为 v1 并保存,如下所示:
apiVersion: v1
name: baetyl-cloud
description: A Helm chart for Kubernetes

...
  • 手动导入 crd:
# k8s版本为v1.16或更高版本
# k3s版本为v1.17.4或更高版本执行
kubectl apply -f ./scripts/charts/baetyl-cloud/apply/
# k8s版本小于v1.16
# k3s版本小于v1.17.4
kubectl apply -f ./scripts/charts/baetyl-cloud/apply_v1beta1/
  • helm v2 安装 baetyl-cloud:
// helm v2
helm install --name baetyl-cloud ./scripts/charts/baetyl-cloud/

接下来需要确认 baetyl-cloud 处于 Running 状态,也可查看日志是否报错。

kubectl get pod
# NAME                            READY   STATUS    RESTARTS   AGE
# baetyl-cloud-57cd9597bd-z62kb   1/1     Running   0          97s

kubectl logs -f baetyl-cloud-57cd9597bd-z62kb

成功后可通过 http://0.0.0.0:30004 操作 baetyl-cloud API。

4. 安装边缘节点

调用 RESTful API 创建节点。

curl -d "{\"name\":\"demo-node\"}" -H "Content-Type: application/json" -X POST http://0.0.0.0:30004/v1/nodes
# {"namespace":"baetyl-cloud","name":"demo-node","version":"1931564","createTime":"2020-07-22T06:25:05Z","labels":{"baetyl-node-name":"demo-node"},"ready":false}

获取边缘节点的在线安装脚本。

curl http://0.0.0.0:30004/v1/nodes/demo-node/init
# {"cmd":"sudo mkdir -p -m 666 /var/lib/baetyl/host /var/lib/baetyl/object /var/lib/baetyl/store /var/lib/baetyl/log /var/lib/baetyl/run && curl -skfL 'https://0.0.0.0:30003/v1/init/baetyl-init-deployment.yml?token=b98c8499f57b2265223a313630323831393239382c226e223a22313233222c226e73223a2262616574796c2d636c6f7564227d' -oinit.yml && kubectl delete clusterrolebinding baetyl-edge-system-rbac --ignore-not-found=true && kubectl delete ns baetyl-edge-system --ignore-not-found=true && kubectl apply -f init.yml"}

在 baetyl-cloud 部署地机器上执行安装脚本.

sudo mkdir -p -m 666 /var/lib/baetyl/host /var/lib/baetyl/object /var/lib/baetyl/store /var/lib/baetyl/log /var/lib/baetyl/run && curl -skfL 'https://0.0.0.0:30003/v1/init/baetyl-init-deployment.yml?token=b98c8499f57b2265223a313630323831393239382c226e223a22313233222c226e73223a2262616574796c2d636c6f7564227d' -oinit.yml && kubectl delete clusterrolebinding baetyl-edge-system-rbac --ignore-not-found=true && kubectl delete ns baetyl-edge-system --ignore-not-found=true && kubectl apply -f init.yml

注意:如果需要在 baetyl-cloud 部署地机器以外的设备上安装边缘节点,请修改数据库将 baetyl_property 表中的 sync-server-address 和 init-server-address 修改成真实的地址。

查看边缘节点的状态,最终会有两个边缘服务处于 Running 状态,也可调用云端 RESTful API 查看边缘节点状态,可以看到边缘节点已经在线(”ready”:true)。

kubectl get pod -A
# NAMESPACE            NAME                                      READY   STATUS    RESTARTS   AGE
# baetyl-edge-system   baetyl-core-8668765797-4kt7r              1/1     Running   0          2m15s
# baetyl-edge-system   baetyl-function-5c5748957-nhn88           1/1     Running   0          114s

curl http://0.0.0.0:30004/v1/nodes/demo-node
# {"namespace":"baetyl-cloud","name":"demo-node","version":"1939112",...,"report":{"time":"2020-07-22T07:25:27.495362661Z","sysapps":...,"node":...,"nodestats":...,"ready":true}

5. 卸载baetyl-cloud

helm delete baetyl-cloud
# 边缘节点删除
kubectl delete ns baetyl-edge baetyl-edge-system

K8s 安装

1. 安装数据库

安装 mysql 数据库,并初始化数据如下:

  • 创建 baetyl-cloud 数据库及表,具体 sql 语句见:scripts/common/tables.sql

  • 初始化表数据,数据相关 sql 语句见:scripts/k8s/sql/data.sql

    # 注意修改 baetyl_property 中 sync-server-address 和 init-server-address 为实际的服务器地址:
    # 比如服务部署在本机,则地址可配置如下:
    # sync-server-address : https://宿主机ip:30005
    # init-server-address : https://0.0.0.0:30003
    # 若服务部署在非本机,请将IP更改为实际的服务器IP地址
    
  • 修改 baetyl-cloud-configmap.yml 中的数据库配置

    database:
    type: "mysql"
    # 数据库账号密码及地址根据用户实际配置
    url:"root:secretpassword@(宿主机ip:3306)/baetyl_cloud?charset=utf8&parseTime=true"
    

2. 安装 baetyl-cloud

cd scripts/k8s
# k8s版本为v1.16或更高版本
# k3s版本为v1.17.4或更高版本执行
kubectl apply -f ./apply/
# k8s版本小于v1.16
# k3s版本小于v1.17.4
kubectl apply -f ./apply_v1beta1/

执行成功之后,可以通过kubectl get pods |grep baetyl-cloud 命令看到程序运行情况,之后就可以通过 http://0.0.0.0:30004 操作 baetyl-cloud API。

3. 安装边缘节点

调用 RESTful API 创建节点。

curl -d "{\"name\":\"demo-node\"}" -H "Content-Type: application/json" -X POST http://0.0.0.0:30004/v1/nodes
# {"namespace":"baetyl-cloud","name":"demo-node","version":"1931564","createTime":"2020-07-22T06:25:05Z","labels":{"baetyl-node-name":"demo-node"},"ready":false}

获取边缘节点的在线安装脚本。

curl http://0.0.0.0:30004/v1/nodes/demo-node/init
# {"cmd":"sudo mkdir -p -m 666 /var/lib/baetyl/host /var/lib/baetyl/object /var/lib/baetyl/store /var/lib/baetyl/log /var/lib/baetyl/run && curl -skfL 'https://0.0.0.0:30003/v1/init/baetyl-init-deployment.yml?token=b98c8499f57b2265223a313630323831393239382c226e223a22313233222c226e73223a2262616574796c2d636c6f7564227d' -oinit.yml && kubectl delete clusterrolebinding baetyl-edge-system-rbac --ignore-not-found=true && kubectl delete ns baetyl-edge-system --ignore-not-found=true && kubectl apply -f init.yml"}

在 baetyl-cloud 部署地机器上执行安装脚本.

sudo mkdir -p -m 666 /var/lib/baetyl/host /var/lib/baetyl/object /var/lib/baetyl/store /var/lib/baetyl/log /var/lib/baetyl/run && curl -skfL 'https://0.0.0.0:30003/v1/init/baetyl-init-deployment.yml?token=b98c8499f57b2265223a313630323831393239382c226e223a22313233222c226e73223a2262616574796c2d636c6f7564227d' -oinit.yml && kubectl delete clusterrolebinding baetyl-edge-system-rbac --ignore-not-found=true && kubectl delete ns baetyl-edge-system --ignore-not-found=true && kubectl apply -f init.yml

注意:如果需要在 baetyl-cloud 部署地机器以外的设备上安装边缘节点,请修改数据库将 baetyl_property 表中的 sync-server-address 和 init-server-address 修改成真实的地址。

查看边缘节点的状态,最终会有两个边缘服务处于 Running 状态,也可调用云端 RESTful API 查看边缘节点状态,可以看到边缘节点已经在线(”ready”:true)。

kubectl get pod -A
# NAMESPACE            NAME                                      READY   STATUS    RESTARTS   AGE
# baetyl-edge-system   baetyl-core-8668765797-4kt7r              1/1     Running   0          2m15s
# baetyl-edge-system   baetyl-function-5c5748957-nhn88           1/1     Running   0          114s

curl http://0.0.0.0:30004/v1/nodes/demo-node
# {"namespace":"baetyl-cloud","name":"demo-node","version":"1939112",...,"report":{"time":"2020-07-22T07:25:27.495362661Z","sysapps":...,"node":...,"nodestats":...,"ready":true}

4. 卸载baetyl-cloud

cd scripts/k8s
# k8s版本为v1.16或更高版本
# k3s版本为v1.17.4或更高版本执行
kubectl delete -f ./apply/
# k8s版本小于v1.16
# k3s版本小于v1.17.4
kubectl delete -f ./apply_v1beta1/
# 边缘节点删除
kubectl delete ns baetyl-edge baetyl-edge-system

进程安装

1.安装数据库

安装 mysql 数据库,并初始化数据如下:

  • 创建 baetyl-cloud 数据库及表,具体sql语句见:scripts/common/tables.sql

  • 初始化表数据,数据相关 sql 语句见:scripts/native/sql/data.sql

    # 注意修改 baetyl_property 中 sync-server-address 和 init-server-address 为实际的服务器地址:
    # 比如服务部署在本机,则地址可配置如下:
    # sync-server-address : https://宿主机ip:9005
    # init-server-address : https://0.0.0.0:9003
    # 若服务部署在非本机,请将IP更改为实际的服务器IP地址
    
  • 修改 conf/conf.yml 中的数据库配置

    database:
    type: "mysql"
    # 数据库账号密码及地址根据用户实际配置
    url:"root:secretpassword@(localhost:3306)/baetyl_cloud?charset=utf8&parseTime=true"
    

2. 源码编译

参考源码编译

3. 启动 baetyl-cloud

cd scripts/native
# 导入 k8s crd 资源
# k8s版本为v1.16或更高版本
# k3s版本为v1.17.4或更高版本执行
kubectl apply -f ./apply/
# k8s版本小于v1.16
# k3s版本小于v1.17.4
kubectl apply -f ./apply_v1beta1/
# 执行如下命令,然后替换 conf/kubeconfig.yml 文件中的 example
kubectl config view --raw
# 然后执行如下命令:
nohup ../../output/baetyl-cloud -c ./conf/conf.yml > /dev/null &
# 执行成功后会返回成功建立的 baetyl-cloud 进程号

执行成功后可以通过 http://0.0.0.0:9004 操作 baetyl-cloud API。

4. 安装边缘节点

调用 RESTful API 创建节点。

curl -d "{\"name\":\"demo-node\"}" -H "Content-Type: application/json" -X POST http://0.0.0.0:9004/v1/nodes
# {"namespace":"baetyl-cloud","name":"demo-node","version":"1931564","createTime":"2020-07-22T06:25:05Z","labels":{"baetyl-node-name":"demo-node"},"ready":false}

获取边缘节点的在线安装脚本。

curl http://0.0.0.0:9004/v1/nodes/demo-node/init
# {"cmd":"sudo mkdir -p -m 666 /var/lib/baetyl/host /var/lib/baetyl/object /var/lib/baetyl/store /var/lib/baetyl/log /var/lib/baetyl/run && curl -skfL 'https://0.0.0.0:9003/v1/init/baetyl-init-deployment.yml?token=b98c8499f57b2265223a313630323831393239382c226e223a22313233222c226e73223a2262616574796c2d636c6f7564227d' -oinit.yml && kubectl delete clusterrolebinding baetyl-edge-system-rbac --ignore-not-found=true && kubectl delete ns baetyl-edge-system --ignore-not-found=true && kubectl apply -f init.yml"}

在 baetyl-cloud 部署地机器上执行安装脚本.

sudo mkdir -p -m 666 /var/lib/baetyl/host /var/lib/baetyl/object /var/lib/baetyl/store /var/lib/baetyl/log /var/lib/baetyl/run && curl -skfL 'https://0.0.0.0:9003/v1/init/baetyl-init-deployment.yml?token=b98c8499f57b2265223a313630323831393239382c226e223a22313233222c226e73223a2262616574796c2d636c6f7564227d' -oinit.yml && kubectl delete clusterrolebinding baetyl-edge-system-rbac --ignore-not-found=true && kubectl delete ns baetyl-edge-system --ignore-not-found=true && kubectl apply -f init.yml

注意:如果需要在 baetyl-cloud 部署地机器以外的设备上安装边缘节点,请修改数据库将 baetyl_property 表中的 sync-server-address 和 init-server-address 修改成真实的地址。

查看边缘节点的状态,最终会有两个边缘服务处于 Running 状态,也可调用云端 RESTful API 查看边缘节点状态,可以看到边缘节点已经在线(”ready”:true)。

kubectl get pod -A
# NAMESPACE            NAME                                      READY   STATUS    RESTARTS   AGE
# baetyl-edge-system   baetyl-core-8668765797-4kt7r              1/1     Running   0          2m15s
# baetyl-edge-system   baetyl-function-5c5748957-nhn88           1/1     Running   0          114s

curl http://0.0.0.0:9004/v1/nodes/demo-node
# {"namespace":"baetyl-cloud","name":"demo-node","version":"1939112",...,"report":{"time":"2020-07-22T07:25:27.495362661Z","sysapps":...,"node":...,"nodestats":...,"ready":true}

5. 进程退出

kubectl delete -f ./apply/
# 根据创建baetyl-cloud进程成功时的进程号杀死进程:
sudo kill 进程号
# 边缘节点删除
kubectl delete ns baetyl-edge baetyl-edge-system

配置说明

baetyl-cloud 配置

默认配置文件是工作目录下的 etc/baetyl/service.yml,配置释义如下:

adminServer:
  port: #云管理服务端口

nodeServer:
  port: #端云同步服务端口
  ca: #端云同步服务根证书路径
  cert: #端云同步服务证书路径
  key: #端云同步服务key文件路径

activeServer:
  port: #设备激活服务端口
  ca: #服务根证书路径
  cert: #服务端证书路径
  key: #服务端key文件路径

plugin: #在baetyl-cloud中,auth,lincese,pki,shadow,modelStorage是以插件形式实现,支持自定义
  auth: #鉴权插件,默认使用 defaultauth,不进行登录鉴权认证
  license: #license插件,默认使用 defaultlicense,不进行license限制
  pki: #证书管理插件,默认使用 defaultpki,自签证书
  shadow: #影子资源存储插件,默认使用 database
  modelStorage: #应用模型存储插件,默认使用 kubernetes
  databaseStorage: #数据库配置,默认使用 database

logger:
  filename: #日志文件路径
  level: #日志级别

kubernetes:
  inCluster: #是否使用k8s集群配置,true为使用,false为不使用
  configPath: #k8s配置文件路径,inCluster为true的情况下,不需要配置

database:
  type: #数据库类型,例如:mysql,sqlite3等
  url: #数据库的连接url

defaultpki:
  rootCAFile: #根证书路径,用于签发节点与云端连接证书的根证书,
  rootCAKeyFile: #根证书key文件路径,用于签发节点与云端连接证书的key文件
  persistent:
    kind: #存储类型 默认数据库:database
    database:
      type: #数据库类型,例如:mysql,sqlite3等
      url: #数据库的连接url
      
defaultauth:
  namespace: # baetyl-cloud使用的namespace,默认为baetyl-cloud
  keyFile: # 生成节点安装脚本时,签名token的key文件

源码编译

云端管理套件源码编译介绍。

准备工作

  • 安装 Golang 工具并启用 Modules 管理

Golang 的最低版本要求为 1.13。 下载安装 Golang 可参考 golang.org 或者 golang.google.cn。我们现在采用 Go Modules 来管理依赖包,为了能够正常下载墙外的代码,可以参考 goproxy.baidu.com 来设置 GOPROXY,如下:

# 使用 go1.13 以上版本 
go env -w GONOPROXY=\*\*.baidu.com\*\*              ## 配置GONOPROXY环境变量,所有百度内代码,不走代理
go env -w GONOSUMDB=\*                              ## 配置GONOSUMDB,暂不支持sumdb索引
go env -w GOPROXY=https://goproxy.baidu.com         ## 配置GOPROXY,可以下载墙外代码
  • 安装 Docker Engine 并打开 Buildx 功能

Docker 的最低版本要求为 19.03,因为从该版本开始内置了 Buildx 功能,可用于制作多平台的镜像。 安装 Docker 可参考 docker.com/install,打开 Buildx 功能参考 github.com/docker/buildx

下载代码

Baetyl Github 下载代码,执行如下命令:

git clone https://github.com/baetyl/baetyl-cloud.git

编译 baetyl-cloud

进入 baetyl-cloud 项目目录,执行 make 即可编译出当前系统平台的 baetyl-cloud 主程序。

make 

注意:国内请设置GOPROXY,否则可能导致依赖包下载不下来,参考开头的准备工作

上述命令执行完后,baetyl-cloud 主程序会生成在项目的 output 目录下。

制作镜像

如果使用容器模式运行 baetyl-cloud,我们推荐使用正式发布的官方镜像。如果你想自己制作镜像,可以使用下面提供的命令,但是前提是打开了最前面的准备工作中提到的 Buildx 功能。

进入 baetyl-cloud 项目目录,执行 make image 即可生成当前系统平台的模块镜像。

make image

注意:为了制作多平台的镜像,我们采用了 docker 的 buildx,参考开头的准备工作

执行结束后,你可以执行 docker images 来查看生成的镜像。

docker images

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
cloud                    git-be2c5a9         d70a7faf5443        About an hour ago   40.7MB

修改 scripts/demo/charts/baetyl-cloud/values.yaml 里的 image 配置项为上述镜像地址,执行 helm 安装,即可运行。

FAQ

Q: 在Mac系统下进行应用部署实践–部署mosquitto broker应用时,用户应用broker的状态显示已部署,最后使用mqtt.box连接边缘设备时,遇到Connection Error,请问是什么原因?

A: 由于Mac系统下宿主机端口映射无法正常工作,会导致mqtt.box连接失败。