连接边缘节点本地baetyl-broker
背景描述
从 baetyl 2.1.1 版本开始,所有官方应用(baetyl-broker,baetyl-function,baetyl-rule)都默认集成baetyl-go-sdk,由baetyl-core负责这些官方应用的证书签发,服务间调用默认使用baetyl-core签发的证书进行认证。
开发者如果要想访问本地baetyl-broker,主要有两种方式:
- 方案一:对baetyl-broker进行配置,开发外部访问。设置访问broker用户名和密码,并绑定宿主机监听端口,这样在任何机器上使用MQTT Client都可以使用
host_machne_ip:port访问baetyl-broker服务。 - 方案二:MQTT Client模拟应用的身份,使用从baetyl-core那边获取访问baetyl-broker的证书访问broker。MQTT Client只能运行在边缘节点那台设备上,不能运行在其他工作PC上。
本文会对以上两种方案进行讲解。
操作指南
节点安装
参考快速入门安装边缘节点。在边缘端执行完安装命令以后,通过kubectl命令查看baetyl-edge-system命名空间内的系统应用。
1root@userver-desk:~# kubectl get pod -n baetyl-edge-system
2NAME READY STATUS RESTARTS AGE
3baetyl-init-d968b7bb9-c8b22 1/1 Running 0 3h24m
4baetyl-core-7d5995f956-7jszr 1/1 Running 0 3h24m
5baetyl-rule-5f4d7f964-xprx8 1/1 Running 0 3h24m
6baetyl-function-6c7fd69f44-xwnxk 1/1 Running 0 3h24m
7baetyl-broker-6f9cbbd794-rb9p7 1/1 Running 0 3h24m
方案一:配置baetyl-broker开放外部访问
1.baetyl-broker端口绑定本地8883端口
进入到边缘节点,点击应用部署,找到baetyl-broker应用,点击查看,如下图所示:

进入到baetyl-broker应用界面,点击配置,如下图所示:

在端口映射——>宿主机端口那里添加一条端口映射记录,如下图所示:

- 宿主机端口:8883
- 容器端口:8883
- 协议:TCP
返回应用配置界面,切到数据卷页面,点击baetyl-broker-conf这个配置卷,如下图所示:

进入配置项配置页面,点击编辑,如下图所示:

在conf.yaml配置界面,输入以下配置信息,下图所示:

1session:
2 sysTopics:
3 - $link
4 - $baetyl
5logger:
6 level: debug
7 encoding: console
8listeners:
9 - address: 'tcp://0.0.0.0:8883'
10principals:
11 - username: test
12 password: test
13 permissions:
14 - action: pub
15 permit:
16 - '#'
17 - action: sub
18 permit:
19 - '#'
配置解析:
- 为baetyl-broker增加
8883监听端口,使用test/test这样的用户名密码进行访问,该用户具有#这个topic的pub/sub权限。- 这里不一定必须是8883,可以是其他任何没有用过的端口,可以使用
netstat -ap | grep 8883这个命令查看8883端口是否被占用
2.使用MQTT Box访问
在工作PC上安装MQTT Box,配置连接信息,如下图所示:

返回MQTT Box,可以看到连接状态是Connected,测试消息订阅与发送,如下图所示:

方案二:模拟应用身份访问
1.baetyl-broker系统默认50010端口映射本地1883端口
进入到边缘节点,点击应用部署,找到baetyl-broker应用,点击查看。

进入到baetyl-broker应用界面,点击配置

在端口映射——>宿主机端口那里填写1883,将baetyl-broker的容器内端口映射到宿主机。这里不一定必须是1883,可以是其他任何没有用过的端口,只是mqtt通过用1883,所以此处用1883,最后点击确定。

2.获取证书
访问baetyl-broker的证书在baetyl-core这个pod当中,
方案一:在边缘端执行kubectl exec
通过kubectl exec命令进入到baetyl-core当中获取证书,证书保存在/var/lib/baetyl/system/certs目录下。执行命令如下。
1root@userver-desk:~# kubectl exec -it baetyl-core-7d5995f956-7jszr -n baetyl-edge-system /bin/sh
2kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
3/ # cd /var/lib/baetyl/system/certs
4/var/lib/baetyl/system/certs # ls
5ca.pem crt.pem key.pem
复制上面3本证书的文件内容到本地,如下图所示:

方案二:通过云端远程调试直接进入baetyl-core
点击远程调试

进入到/var/lib/baetyl/system/certs目录下,查看证书文件

3.使用mqtt box连接本地broker
主要说明:只能在部署baetyl-broker的那个边缘节点机器上使用mqtt box连接baetyl-broker,其他机器即使有证书也无法连接。
当前边缘节点是ubuntu desktop,下载安装mqtt box,然后进行连接配置,配置如下:

- Protocol:mqtts/tls
- Host:必须是
127.0.0.1:1883,或者是localhost:1883,使用其他ip地址无效- 证书:使用前面保存的3本证书。
4.使用mosquitto连接本地broker
如果你的linux不是桌面系统,无法安装mqtt box,可以使用mosquitto。操作如下:
- 安装mosquitto-clients
1sudo apt-get install mosquitto-clients
- 订阅baetyl-broker
进入证书保存的目录,执行如下命令
1mosquitto_sub -h 127.0.0.1 -p 1883 --cafile ca.pem --cert crt.pem --key key.pem -t topic -i adsf
- 发布消息到baetyl-broker:
新建一个会话session,进入证书保存的目录,执行如下命令
1mosquitto_pub -h 127.0.0.1 -p 1883 --cafile ca.pem --cert crt.pem --key key.pem -t topic -i adsfasd -m test

- 查看订阅消息
返回到订阅baetyl-broker的那个session,可以接收到消息test
- -i 参数后面跟随一个随机码,用于标识mqtt client身份,如果不带-i参数,可能会报
Connection Refused: identifier rejected.这样的错误- 如果不进入证书目录,可以使用证书绝对路径
