概述
在数字化时代,物联网(IoT)正在改变我们的生活和工作方式。KubeEdge、ThingsBoard 和 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 的云边端能力集成。
整体架构
如图所示,已部署两个 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
此时,已成功部署 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
可以看到成功 join 进来的边端 edge-002。
EdgeMesh
EdgeMesh 作为 KubeEdge 集群的数据面组件,为应用程序提供了简单的服务发现与流量代理功能,从而屏蔽了边缘场景下复杂的网络结构。
EdgeMesh 通过部署代码仓下对应的 k8s 资源实现。
k8s apply 部署后,即可看到成功部署的 edgemesh-agent 资源。
ThingsBoard 部署
云端部署请参考往期 CnosDB 生态中的直播内容。此处主要分享边端的部署。
打开云端 Web 界面。
左边栏找到边缘管理下面的边缘实例,并添加一个。
点击新添加的实例,在安装和链接说明下面的 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 页面中,点开实例的属性栏,可以看到如下信息。
此即表明 ThingsBoard-Edge 端注册成功。
通过 kubeedge cloudcore 处也可以查询到成功部署到 edge-002 节点的资源组件。
获取 CnosDB 可观测性白皮书请点击以下链接或者点击阅读原文:https://jsj.top/f/qyV9DC
CnosDB 简介
CnosDB 是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。欢迎关注我们的社区网站:https://cn.cnosdb.com
评论