K3s 上的 EdgeX Foundry - 启动
这篇博文是关于如何部署和操作 EdgeX Foundry 的系列文章的第 2 部分——EdgeX Foundry 是一个用于 K3s 上的 IoT Edge 的开源软件框架——一个轻量级、高可用性和安全的编排器。 在本系列的第一部分中,我们已经了解了进行动手操作所需的所有先决条件。我们将扩展 Jonas Werner 的EdgeX Foundry 教程并在 K3s 上部署 EdgeX Found
这篇博文是关于如何部署和操作 EdgeX Foundry 的系列文章的第 2 部分——EdgeX Foundry 是一个用于 K3s 上的 IoT Edge 的开源软件框架——一个轻量级、高可用性和安全的编排器。
在本系列的第一部分中,我们已经了解了进行动手操作所需的所有先决条件。我们将扩展 Jonas Werner 的EdgeX Foundry 教程并在 K3s 上部署 EdgeX Foundry 服务。我们已经了解到,K3s 将是管理和编排 EdgeX 微服务的一个很好的轻量级解决方案。我们将使用Geneva
版本的 EdgeX Foundry。
这篇文章的范围是演示一个将使用传感器数据的边缘用例,例如环境温度。然后,这些传感器数据将由托管在 K3s 上的 EdgeXFoundry 服务处理。此传感器数据将被推送到名为HiveMQ的基于云的 MQTT 代理。从这里,数据可以在云中存储和处理。这些帖子中使用的配置和清单在这个存储库中可用。
设置
端到端设置如图 1 所示。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--xUEA3xL4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/1fbqug2w5ebb0gxzrlx0.png)
DHT-22 与 Raspberry-Pi(边缘设备)
我们将使用捕捉环境温度和湿度的 DHT-22 传感器。请注意,传感器不需要面包板或电阻器,它全部安装在 SMD(表面安装设备)上。 DHT 传感器将连接到 Raspberry Pi 的 GPIO(通用 I/O)引脚。
在捕获温度并将传感器数据发送到 EdgeX 的脚本中进行了以下更改。树莓派的EdgeX IP
、DHT sensor type
、GPIO
引脚,edge-device-rest
服务的NodePort如下图。
import sys, time, requests, json, Adafruit_DHT
edgexip = "192.168.1.179"
while True:
# Update to match DHT sensor type and GPIO pin
rawHum, rawTmp = Adafruit_DHT.read_retry(22, 4)
urlTemp = 'http://%s:32536/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/temperature' % edgexip
urlHum = 'http://%s:32536/api/v1/resource/Temp_and_Humidity_sensor_cluster_01/humidity' % edgexip
进入全屏模式 退出全屏模式
[](https://res.cloudinary.com/practicaldev/image/fetch/s--8YSbDWtR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// /dev-to-uploads.s3.amazonaws.com/uploads/articles/10uqubzzogpzpkqhliwc.jpg)
如何在K3s上部署EdgeX?
让我们首先部署一个 K3s 集群,K3s-server 和 K3s-agent 在两个独立的 VM 上,如图 3 所示。K3s 上的 EdgeX 服务将更像一个网关(参见图 4 inpart-1)。对于虚拟机,我们将使用 Ubuntu-20.04 操作系统。创建 VM 后,继续执行以下步骤来部署 K3。
请注意,最好在两个 VM 上配置静态 IP。
K3s server/master
要配置 K3s 服务器,我们将使用以下步骤
export K3s_NODE_NAME=${HOSTNAME//_/-}
export K3s_EXTERNAL_IP=<host-ip>
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | sh -
进入全屏模式 退出全屏模式
复制生成的节点令牌
cat /var/lib/rancher/k3s/server/node-token
进入全屏模式 退出全屏模式
检查K3s服务器是否启动并运行
systemctl status k3s
进入全屏模式 退出全屏模式
K3s代理
要配置 K3s 代理,我们将使用以下步骤
export K3S_TOKEN=<node-token of K3s server>
export K3s_URL=https://<ip of k3s server>:6443
export INSTALL_K3S_EXEC="--docker --token $K3S_TOKEN --server $K3S_URL"
export K3S_NODE_NAME=${HOSTNAME//_/-}
curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | sh -
进入全屏模式 退出全屏模式
检查K3s服务器是否启动并运行
systemctl status k3s-agent
进入全屏模式 退出全屏模式
确保您已安装 cli 工具,如kubectl
和helm
。同时确保您已设置正确的权限。 K3S 的kubeconfig
文件存储在/etc/rancher/k3s/k3s.yaml
中。在继续之前设置 KUBECONFIG 环境变量。
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
进入全屏模式 退出全屏模式
如何在K3s上部署EdgeX Foundry?
一旦 K3s 启动并运行,克隆这个存储库用于部署 EdgeX Foundry。
git clone https://github.com/rutu-k/edgex-k3s.git
进入全屏模式 退出全屏模式
请注意,EdgeX Foundry 有一个 docker-compose 清单来尝试和测试其服务。使用kompose
我们可以将 docker-compose 清单转换为 Kubernetes 清单。
此外,在转换为 Kubernetes 清单后,使用卷的应用程序可能无法正确配置,最终无法在 Kubernetes 中运行。因此,必须正确更正相应的清单。为简单起见,配置了emptyDir
个卷。
首先,我们将从 Consul 开始。 Consul 被 EdgeX Foundry 用作注册表。
helm --kubeconfig /etc/rancher/k3s/k3s.yaml upgrade --install consul ./consul-helm
进入全屏模式 退出全屏模式
一旦 Consul 处于运行状态,您可以访问仪表板http://[K3s server ip]:[NodePort of service]
请注意,如果您访问 Key-Value 存储,它将是空的。我们需要为 EdgeX Foundry 服务提供相应的配置。为此,我们将导入键值并将其存储在 Consul 中。
在完成教程的 docker-compose 部署时,我已经从 Consul 导出了 Key/Value JSON 文件。
consul kv import --http-addr=http://[K3s server ip]@edgex-kv.json
进入全屏模式 退出全屏模式
现在您将在 Key-Value 存储中看到配置。
部署 EdgeX Foundry 应用服务
kubectl apply -f /k3s/.
进入全屏模式 退出全屏模式
请注意,所有应用程序服务都已启动并正在运行。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 4d1h
edgex-redis ClusterIP 10.43.56.89 <none> 6379/TCP 3d23h
edgex-core-consul ClusterIP None <none> 8500/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP 25h
consul NodePort 10.43.193.246 <none> 80:32688/TCP 25h
edgex-app-service-configurable-mqtt NodePort 10.43.102.126 <none> 48101:32294/TCP 4h26m
edgex-app-service-configurable-rules NodePort 10.43.138.76 <none> 48100:30136/TCP 4h26m
edgex-core-command NodePort 10.43.52.70 <none> 48082:32400/TCP 4h26m
edgex-device-rest NodePort 10.43.167.127 <none> 49986:32536/TCP 4h26m
edgex-core-metadata NodePort 10.43.132.29 <none> 48081:30220/TCP 4h26m
edgex-support-notifications NodePort 10.43.39.183 <none> 48060:32680/TCP 4h26m
edgex-kuiper NodePort 10.43.231.24 <none> 48075:30082/TCP,20498:31868/TCP 4h26m
edgex-support-scheduler NodePort 10.43.6.49 <none> 48085:31497/TCP 4h26m
edgex-sys-mgmt-agent NodePort 10.43.250.114 <none> 48090:31736/TCP 4h25m
edgex-core-data NodePort 10.43.251.191 <none> 5563:32220/TCP,48080:31931/TCP
进入全屏模式 退出全屏模式
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
edgex-redis-54fb576f64-bdv9x 1/1 Running 1 3d12h
consul-0 1/1 Running 0 25h
edgex-core-metadata-5bd45879cf-h9tbs 1/1 Running 0 4h25m
edgex-kuiper-bbc6cf47-trkdl 1/1 Running 0 4h25m
edgex-sys-mgmt-agent-7fb78c6fc5-qmqc2 1/1 Running 0 4h25m
edgex-support-notifications-7b45446cbc-bqhvb 1/1 Running 0 4h25m
edgex-app-service-configurable-mqtt-59b5c7b6c8-8zhfc 1/1 Running 1 4h25m
edgex-app-service-configurable-rules-58c6846d54-s29hp 1/1 Running 1 4h25m
edgex-core-command-78b5ff9864-hb6wr 1/1 Running 0 4h25m
edgex-core-data-86f5864db6-cvbl7 1/1 Running 0 4h25m
edgex-support-scheduler-755b5779dc-br2d8 1/1 Running 0 4h25m
edgex-device-rest-599c579bf5-zbrg8 1/1 Running 0 4h25m
进入全屏模式 退出全屏模式
EdgeX Foundry 工作流程
EdgeX 工作流程可分为三个主要部分:设备、核心数据服务和应用服务。驱动的另一部分可以通过分析传感器数据来采取行动,但这超出了本文的范围。
- 设备工作流程:这是添加特定传感器设备、其配置文件、选择适当的设备协议、创建事件对象并将其发送到核心数据服务的过程。如果要向 EdgeX Foundry 添加任何设备,则需要三个配置,如图 3 所示:
[](https://res.cloudinary.com/practicaldev/image/fetch/s--YMM-yxTg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/ddbf9nqcj5316ur8e8yx.png)
-
ValueDescriptor:接下来,设备服务需要通知 EdgeX 它将代表设备发送的数据类型。如果给你数字 5,这对你意味着什么?什么都没有,没有一些上下文和度量单位。例如,如果我现在说 5 英尺是相机的扫描深度,那么您对数字 5 所代表的含义会有更好的理解。在 EdgeX 中,值描述符为发送到设备和从设备发送的任何数据(或值)提供上下文和度量单位。顾名思义,值描述符描述了一个值——它的度量单位、它的最小值和最大值(如果有的话)、在屏幕上显示该值时的显示方式等等。从设备获得的任何数据(我们称其为来自设备的 GET)或发送到设备以进行驱动的任何数据(我们称此为设备的 SET 或 PUT)都需要与该数据相关联的值描述符。
-
设备配置文件:设备配置文件描述了 EdgeX 系统中的一种设备。由设备服务管理的每个设备都与设备配置文件关联,该配置文件根据其支持的操作定义该设备类型。
-
设备定义:设备信息,如制造商、它将使用的协议、设备配置文件等。
-
CoreData 服务工作流程:数据作为
Event
对象提交给核心数据。事件是在特定时间点从设备(通过其 ID 或名称与设备关联)的传感器读数的集合。Event
对象中的Reading
对象是设备感测的特定值,并与值描述符相关联,以便为读取提供上下文。 -
应用程序服务工作流:应用程序服务是一种将数据从 EdgeX Foundry 获取到外部系统和流程(无论是分析包、企业或本地应用程序、Azure IoT、AWS IoT 或 Google IoT Core 等云系统等)的方法。 )。应用程序服务为数据在发送到所选端点之前进行准备(转换、丰富、过滤等)和整理(格式化、压缩、加密等)提供了手段。今天开箱即用的端点包括 HTTP 和 MQTT 端点,但将来会包括其他产品,并且可能包括自定义端点。
让我们看看它的实际应用
触发脚本以激活 DHT 传感器并将温度值发送到 EdgeX Foundry。
$ python rpiPutTempHum.py
Temp: 27.7999992371C, humidity: 77.5%
Temp: 28.2000007629C, humidity: 75.5999984741%
Temp: 28.1000003815C, humidity: 75.5%
Temp: 28.1000003815C, humidity: 75.4000015259%
Temp: 28.2000007629C, humidity: 75.3000030518%
Temp: 28.2000007629C, humidity: 75.3000030518%
Temp: 28.2000007629C, humidity: 75.3000030518%
进入全屏模式 退出全屏模式
随着传感器读数的增加,EdgeX Foundry 中的事件计数也会增加。
└─ $ ▶ curl http://192.168.1.179:31931/api/v1/event/count
2043
进入全屏模式 退出全屏模式
我们还可以得到最新的温度值。
└─ $ ▶ curl http://192.168.1.179:31931/api/v1/reading | json_pp -json_opt pretty,canonical | tail -n 10
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 396k 0 396k 0 0 9660k 0 --:--:-- --:--:-- --:--:-- 9660k
{
"created" : 1632159295863,
"device" : "Temp_and_Humidity_sensor_cluster_01",
"id" : "ffcf2a3b-6ecc-4476-9ab6-e17ae983886f",
"name" : "temperature",
"origin" : 1632159295861600937,
"value" : "28",
"valueType" : "Int64"
}
]
进入全屏模式 退出全屏模式
为了演示应用程序服务,我们将配置 Application-Mqtt-service 以将温度值发送到 MQTT 代理。edgex-app-service-configurable-mqtt
服务(查看“EdgeX Foundry on K3s”部分中部署的服务)是一个社区提供的导出器,它将 EdgeX 传感器数据发送到由 HiveMQ 托管的公共 MQTT 代理(http://broker.mqttdashboard.com) 在端口 1883 上。然后可以通过 HiveMQ 提供的 MQTT 浏览器客户端通过发布和订阅特定的topic
来可视化此传感器数据。
主题名称在edgex-app-service-configurable-mqtt
部署的环境变量中配置(参考这里)。
- name: WRITABLE_PIPELINE_FUNCTIONS_MQTTSEND_ADDRESSABLE_TOPIC
value: DHT-SENSOR
进入全屏模式 退出全屏模式
转到HiveMQ MQTT 浏览器客户端。使用默认配置单击Connect
。接下来,单击Add New Topic Subscription
,键入主题名称DHT-SENSOR
并单击Subscribe
。您将在 Messages 中看到传感器数据。
[](https://res.cloudinary.com/practicaldev/image/fetch/s---psKhu79--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/n0fi5f00a7st2lefo7nt.png)
结论
在这篇文章中,我们看到了以下内容:
-
如何部署K3s?
-
如何将 docker-compose manifest 转换为 Kubernetes manifest?
-
如何在K3s上部署EdgeX Foundry?
-
如何将传感器数据从 Raspberry Pi 发送到 EdgeX Foundry?
到目前为止,我们已经了解了如何处理从传感器接收到的数据。我们还可以通过进一步分析数据来采取预定义的行动。 EdgeX Foundry 通过整合eKuiper
规则引擎为边缘分析提供支持。我们将尝试在下一部分中介绍它。
我希望你发现这篇文章内容丰富且引人入胜。如需更多类似这样的帖子,请订阅我们的每周通讯。我很想听听您对这篇文章的看法,所以请在Twitter或LinkedIn上开始对话 :)。
参考文献和延伸阅读
-
值描述符
-
设备配置文件
-
EdgeX Foundry 定义
-
棒
更多推荐
所有评论(0)