首页 » 博客 » KubeEdge、ThingsBoard和CnosDB:智能物联网平台的完美组合

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

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 社区交流群:

扫描下方二维码,加入 CC 进入 CnosDB 社区交流,CC 也会在群内分享直播链接哒
qrcode