概述
在数字化时代,物联网(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/v1alpha2database: aliasName: default dataSource: /var/lib/kubeedge/edgecore.db driverName: sqlite3kind: EdgeCoremodules: 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/v1kind: Deploymentmetadata: name: mytbedge namespace: tb-edgespec: 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/v1kind: Deploymentmetadata: name: postgres namespace: tb-edgespec: 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: v1kind: Servicemetadata: name: mytbedge namespace: tb-edgespec: 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: v1kind: Servicemetadata: name: postgres namespace: tb-edgespec: 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
评论