暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

KubeEdge、ThingsBoard 和 CnosDB:智能物联网平台的完美组合

原创 CnosDB 2024-12-06
151

cover.jpg
CnosDB.gif

概述

在数字化时代,物联网(IoT)正在改变我们的生活和工作方式。KubeEdgeThingsBoard 和 CnosDB 是三个领先的开源平台,它们在物联网领域各自发挥着重要的作用,并且可以无缝集成,为用户提供强大的解决方案。

KubeEdge:边缘计算的强大引擎

KubeEdge 是一个基于 Kubernetes 的边缘计算平台,通过将云计算能力扩展到边缘设备,帮助企业实现高效的资源利用和数据处理。它允许在边缘节点上运行容器化的应用,从而降低延迟、减少带宽消耗,并提高数据处理速度。KubeEdge 的架构包括云端和边缘两个部分,支持多种边缘设备,适用于智慧城市、智能制造、智能农业等场景。

ThingsBoard:全面的物联网平台

ThingsBoard 是一个功能强大的开源物联网平台,提供设备管理、数据收集、可视化和分析等功能。它支持多种协议(如 MQTT、CoAP、HTTP),使设备能够轻松连接并与平台交互。ThingsBoard 的用户友好界面使用户能够快速创建仪表板,实时监控设备状态,分析数据趋势,并生成报告。无论是个人项目还是大规模企业应用,ThingsBoard 都能满足不同需求。

CnosDB:高效的时序数据库

CnosDB 是一个高性能的时序数据库,专为存储和查询时间序列数据而设计。它能够以极高的吞吐量处理来自物联网设备的海量数据,支持快速写入和查询。CnosDB 提供丰富的数据分析功能,允许用户实时监控和分析设备数据,为决策提供有力支持。其高效的存储和检索机制,使其成为物联网应用的理想选择。

KubeEdge、ThingsBoard 与 CnosDB 的协同效应

将 KubeEdge、ThingsBoard 和 CnosDB 结合使用,用户可以在边缘计算环境中实现更高效的物联网解决方案。KubeEdge 使边缘设备能够实时处理数据,ThingsBoard 提供强大的数据可视化和设备管理能力,而 CnosDB 则为时间序列数据提供可靠的存储和查询支持。这种组合不仅提高了设备的响应速度,还降低了云端的负担,实现更智能的决策。

ThingsBoard和CnosDB的集成在之前的文档中已经介绍过,此处不再赘述,本文主要介绍KubeEdge和ThingsBoard的云边端能力集成。

整体架构

1.png

如图所示,已部署两个k8s集群,在集群1中部署ThingsBoard的云端,在集群2部署KubeEdge来管理多个边端,同时,在边端中部署ThingsBoard-Edge,并与云端建立通信,最终实现KubeEdge管理边端,ThingsBoard云边协同采集、处理、可视化的IoT解决方案。

KubeEdge 部署

云端

此处使用keadm工具进行kubeedge云端部署。

keadm init --advertise-address="THE-EXPOSED-IP" --kubeedge-version=v1.17.0

以上命令中,version是需要部署的kubeedge版本,address是访问此云端的ip。

部署成功后,执行

kubectl get all -n kubeedge

2.png

此时,已成功部署cloudcore和cloud-iptables相关的k8s资源,注意cloudcore的service使用了NodePort类型,这与官方文档有所出入,主要是这里的环境需要公网ip和端口保证通信。

边端

考虑到边端通常会存在一些网络问题,边端join云端这里使用二进制文件手动部署。二进制文件可从KubeEdge代码仓release中获取。

在云端执行命令keadm gettoken,获取token。

apiVersion: edgecore.config.kubeedge.io/v1alpha2 database: aliasName: default dataSource: /var/lib/kubeedge/edgecore.db driverName: sqlite3 kind: EdgeCore modules: dbTest: enable: false deviceTwin: dmiSockPath: /etc/kubeedge/dmi.sock enable: true edgeHub: enable: true heartbeat: 15 httpServer: https://43.247.178.238:32703 messageBurst: 60 messageQPS: 30 projectID: e632aba927ea4ac2b575ec1603d56f10 quic: enable: false handshakeTimeout: 30 readDeadline: 15 server: 43.247.178.238:32702 writeDeadline: 15 rotateCertificates: true tlsCaFile: /etc/kubeedge/ca/rootCA.crt tlsCertFile: /etc/kubeedge/certs/server.crt tlsPrivateKeyFile: /etc/kubeedge/certs/server.key token: "" websocket: enable: true handshakeTimeout: 30 readDeadline: 15 server: 43.247.178.238:32701 writeDeadline: 15 edgeStream: enable: true handshakeTimeout: 30 readDeadline: 15 server: 43.247.178.238:32705 tlsTunnelCAFile: /etc/kubeedge/ca/rootCA.crt tlsTunnelCertFile: /etc/kubeedge/certs/server.crt tlsTunnelPrivateKeyFile: /etc/kubeedge/certs/server.key writeDeadline: 15 edged: enable: true hostnameOverride: edge-002 maxContainerCount: -1 maxPerPodContainerCount: 1 minimumGCAge: 0s podSandboxImage: registry.cn-hangzhou.aliyuncs.com/cnosdb/pause:3.6 registerNodeNamespace: default registerSchedulable: true rootDirectory: /var/lib/edged tailoredKubeletConfig: address: 127.0.0.1 cgroupDriver: systemd cgroupsPerQOS: true clusterDNS: - 169.254.96.16 clusterDomain: cluster.local configMapAndSecretChangeDetectionStrategy: Get containerLogMaxFiles: 5 containerLogMaxSize: 10Mi containerRuntimeEndpoint: unix:///run/containerd/containerd.sock contentType: application/json cpuCFSQuota: true cpuCFSQuotaPeriod: 100ms cpuManagerPolicy: none cpuManagerReconcilePeriod: 10s enableControllerAttachDetach: true enableDebugFlagsHandler: true enableDebuggingHandlers: true enableProfilingHandler: true enableSystemLogHandler: true enforceNodeAllocatable: - pods eventBurst: 100 eventRecordQPS: 50 evictionHard: imagefs.available: 15% memory.available: 100Mi nodefs.available: 10% nodefs.inodesFree: 5% evictionPressureTransitionPeriod: 5m0s failSwapOn: false fileCheckFrequency: 20s hairpinMode: promiscuous-bridge imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 80 imageMaximumGCAge: 0s imageMinimumGCAge: 2m0s imageServiceEndpoint: unix:///run/containerd/containerd.sock iptablesDropBit: 15 iptablesMasqueradeBit: 14 localStorageCapacityIsolation: true logging: flushFrequency: 5s format: text options: json: infoBufferSize: "0" verbosity: 0 makeIPTablesUtilChains: true maxOpenFiles: 1000000 maxPods: 110 memoryManagerPolicy: None memorySwap: {} memoryThrottlingFactor: 0.9 nodeLeaseDurationSeconds: 40 nodeStatusMaxImages: 0 nodeStatusReportFrequency: 5m0s nodeStatusUpdateFrequency: 10s oomScoreAdj: -999 podPidsLimit: -1 readOnlyPort: 10350 registerNode: true registryBurst: 10 registryPullQPS: 5 resolvConf: /etc/resolv.conf runtimeRequestTimeout: 2m0s seccompDefault: false serializeImagePulls: true shutdownGracePeriod: 0s shutdownGracePeriodCriticalPods: 0s staticPodPath: /etc/kubeedge/manifests streamingConnectionIdleTimeout: 4h0m0s syncFrequency: 1m0s topologyManagerPolicy: none topologyManagerScope: container volumePluginDir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ volumeStatsAggPeriod: 1m0s eventBus: enable: false eventBusTLS: enable: false tlsMqttCAFile: /etc/kubeedge/ca/rootCA.crt tlsMqttCertFile: /etc/kubeedge/certs/server.crt tlsMqttPrivateKeyFile: /etc/kubeedge/certs/server.key mqttMode: 2 mqttPassword: "" mqttPubClientID: "" mqttQOS: 0 mqttRetain: false mqttServerExternal: tcp://127.0.0.1:1883 mqttServerInternal: tcp://127.0.0.1:1884 mqttSessionQueueSize: 100 mqttSubClientID: "" mqttUsername: "" metaManager: contextSendGroup: hub contextSendModule: websocket enable: true metaServer: apiAudiences: null dummyServer: 169.254.30.10:10550 enable: true server: 127.0.0.1:10550 serviceAccountIssuers: - https://kubernetes.default.svc.cluster.local serviceAccountKeyFiles: null tlsCaFile: /etc/kubeedge/ca/rootCA.crt tlsCertFile: /etc/kubeedge/certs/server.crt tlsPrivateKeyFile: /etc/kubeedge/certs/server.key remoteQueryTimeout: 60 serviceBus: enable: false port: 9060 server: 127.0.0.1 timeout: 60

下载好edgecore二进制文件,并在edgecore.yaml中配置好cloudcore对应ip和端口,以及token后,执行/usr/local/bin/edgecore --config edgecore.yaml即在边端启动kubeedge边端服务。随后在云端执行kubectl get nodes -owide

3.png

可以看到成功join进来的边端edge-002。

EdgeMesh

EdgeMesh 作为 KubeEdge 集群的数据面组件,为应用程序提供了简单的服务发现与流量代理功能,从而屏蔽了边缘场景下复杂的网络结构。

EdgeMesh通过部署代码仓下对应的k8s资源实现。

4.png

k8s apply部署后,即可看到成功部署的edgemesh-agent资源。

5.png

ThingsBoard 部署

云端部署请参考往期CnosDB 生态中的直播内容。此处主要分享边端的部署。

打开云端Web界面。

6.png

左边栏找到边缘管理下面的边缘实例,并添加一个。

7.png

点击新添加的实例,在安装和链接说明下面的docker栏中,找到对应的key和secret并记录保存。

--- apiVersion: apps/v1 kind: Deployment metadata: name: mytbedge namespace: tb-edge spec: replicas: 1 selector: matchLabels: app: mytbedge template: metadata: labels: app: mytbedge spec: nodeSelector: nodetype: edge containers: - name: mytbedge image: registry.cn-hangzhou.aliyuncs.com/cnosdb/tb-edge:3.7.0EDGE #command: ["/bin/sh"] #args: ["-c", "sleep infinity"] ports: - containerPort: 8080 - containerPort: 1883 - containerPort: 5683 - containerPort: 5684 - containerPort: 5685 - containerPort: 5686 - containerPort: 5687 - containerPort: 5688 env: - name: SPRING_DATASOURCE_URL value: jdbc:postgresql://postgres:5432/tb-edge - name: CLOUD_ROUTING_KEY value: 9dab66b7-87f2-c214-f4e5-201e61eb4da7 - name: CLOUD_ROUTING_SECRET value: 9st4zsnnx423b6hls6i6 - name: CLOUD_RPC_HOST value: 43.247.178.238 - name: CLOUD_RPC_PORT value: "32706" - name: CLOUD_RPC_SSL_ENABLED value: "false" volumeMounts: - name: tb-edge-data mountPath: /data - name: tb-edge-logs mountPath: /var/log/tb-edge restartPolicy: Always dnsPolicy: ClusterFirst volumes: - name: tb-edge-data emptyDir: {} - name: tb-edge-logs emptyDir: {} --- apiVersion: apps/v1 kind: Deployment metadata: name: postgres namespace: tb-edge spec: replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: nodeSelector: nodetype: edge containers: - name: postgres image: registry.cn-hangzhou.aliyuncs.com/cnosdb/postgres:15 ports: - containerPort: 5432 env: - name: POSTGRES_DB value: tb-edge - name: POSTGRES_PASSWORD value: postgres volumeMounts: - name: tb-edge-postgres-data mountPath: /var/lib/postgresql/data restartPolicy: Always volumes: - name: tb-edge-postgres-data emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: mytbedge namespace: tb-edge spec: type: ClusterIP ports: - port: 8080 name: http8080 targetPort: 8080 #nodePort: 30001 # 可以根据需要指定 - port: 1883 name: mqtt1883 targetPort: 1883 #nodePort: 30002 # 可以根据需要指定 - port: 5683 name: coap5683 targetPort: 5683 #nodePort: 30003 # 可以根据需要指定 - port: 5684 name: coaps5684 targetPort: 5684 #nodePort: 30004 # 可以根据需要指定 - port: 5685 name: coaps5685 targetPort: 5685 #nodePort: 30005 # 可以根据需要指定 - port: 5686 name: coaps5686 targetPort: 5686 #nodePort: 30006 # 可以根据需要指定 - port: 5687 name: coaps5687 targetPort: 5687 #nodePort: 30007 # 可以根据需要指定 - port: 5688 name: coaps5688 targetPort: 5688 #nodePort: 30008 # 可以根据需要指定 selector: app: mytbedge --- apiVersion: v1 kind: Service metadata: name: postgres namespace: tb-edge spec: type: ClusterIP ports: - port: 5432 name: postgres5432 targetPort: 5432 #nodePort: 30009 # 可以根据需要指定 selector: app: postgres

上述部署文件中除了key和secret外,注意配置云端的ip地址,以及rpc端口,如果云端没有开启的话,需要配置云端config文件打开对应端口。

当边端部署成功后,在云端的Web页面中,点开实例的属性栏,可以看到如下信息。

8.png

此即表明ThingsBoard-Edge端注册成功。

9.png

通过kubeedge cloudcore处也可以查询到成功部署到edge-002节点的资源组件。

获取 CnosDB 可观测性白皮书请点击以下链接或者点击阅读原文:
https://jsj.top/f/qyV9DC

CnosDB简介

CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。
欢迎关注我们的社区网站:https://cn.cnosdb.com

文章转载自CnosDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论