写点什么

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

作者:CnosDB
  • 2024-12-06
    德国
  • 本文字数:6208 字

    阅读完需:约 20 分钟

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

概述

在数字化时代,物联网(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 的云边端能力集成。

整体架构

如图所示,已部署两个 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


发布于: 2024-12-06阅读数: 6
用户头像

CnosDB

关注

还未添加个人签名 2022-04-18 加入

打造高性能、高压缩比、高可用的分布式云原生时间序列数据库,引领世界迈向万物智联 欢迎关注 https://www.cnosdb.com

评论

发布
暂无评论
KubeEdge、ThingsBoard 和 CnosDB:智能物联网平台的完美组合_时序数据库_CnosDB_InfoQ写作社区