立即试用 商务报价
专业版
Microservices setup using AWS infrastructure

本页目录

Microservices setup using AWS infrastructure

This guide will help you to setup ThingsBoard in microservices mode in AWS EKS.

Prerequisites

工具安装

在EKS集群上部署ThingsBoard需要安装kubectl, eksctlawscli工具。

请参考指南配置访问密钥、私钥和默认区域而默认区域为所部署群集的区域的ID。

1
aws configure

Pull ThingsBoard PE images from docker hub

Run the following commands to verify that you can pull the images from the Docker hub.

1
2
3
4
5
6
7
8
9
docker pull thingsboard/tb-pe-node:3.5.1PE
docker pull thingsboard/tb-pe-web-report:3.5.1PE
docker pull thingsboard/tb-pe-web-ui:3.5.1PE
docker pull thingsboard/tb-pe-js-executor:3.5.1PE
docker pull thingsboard/tb-pe-http-transport:3.5.1PE
docker pull thingsboard/tb-pe-mqtt-transport:3.5.1PE
docker pull thingsboard/tb-pe-coap-transport:3.5.1PE
docker pull thingsboard/tb-pe-lwm2m-transport:3.5.1PE
docker pull thingsboard/tb-pe-snmp-transport:3.5.1PE

Step 1. Clone ThingsBoard PE K8S scripts repository

1
2
git clone -b release-3.5.1 https://github.com/thingsboard/thingsboard-pe-k8s.git
cd thingsboard-pe-k8s/aws/microservices

Step 2. Configure and create EKS cluster

在cluster.yml文件中找到以下群集配置的相关参数:

  • region - 集群所在的AWS区域(默认us-east-1)
  • availabilityZones - 可用区域ID(默认[us-east-1a,us-east-1b,us-east-1c])
  • instanceType - 实例类型(默认m5.xlarge)

注意:如果不更改instanceTypedesiredCapacityEKS将部署1个m5.xlarge的节点。

以下命令将为ThingsBoard集群创建新的VPC本指南假设将创建新的VPC也可以使用现有的VPC和网络,可以在此处找到有关eksctl的配置VPC的信息。

AWS集群创建命令:

1
eksctl create cluster -f cluster.yml

Step 3. Create AWS load-balancer controller

集群准备就绪后必须创建AWS负载均衡控制器,可以按照本指南进行操作。
群集配置脚本将创建多个负载均衡:

  • “tb-http-loadbalancer” - 负责Web UI、REST API和HTTP传输的AWS ALB;
  • “tb-mqtt-loadbalancer” - 负责MQTT传输的AWS NLB;
  • “tb-coap-loadbalancer” - 负责CoAP传输的AWS NLB;

配置AWS负载均衡是这些控制器正常工作所需的非常重要的步骤

Step 4. Provision Databases

Step 4.1 Amazon PostgreSQL DB Configuration

ThingsBoard将使用Amazon RDS作为主数据库来存储设备,仪表板,规则链和设备遥测需要在Amazon RDS上对PostgreSQL进行配置。
可以按照本指南进行操作但要考虑以下要求:

  • 保存postgresql密码使用YOUR_RDS_PASSWORD来引用;
  • 确保PostgreSQL版本为latest 12.x;
  • 确保PostgreSQL RDS实体与ThingsBoard集群互通;
  • 确保“thingsboard”作为初始化数据库名称;

建议:

  • 使用’Production’模板实现高可用性。默认启用许多有用的设置;
  • 使用’Provisioned IOPS’提升性能;
  • 为RDS实例创建自定义参数组使用数据库参数更容易;
  • 将RDS实例部署到内网中。

数据库切换到’Available’状态后导航’Connectivity和Security’并复制终结点值。

编辑”tb-node-db-configmap.yml”并替换YOUR_RDS_ENDPOINT_URLYOUR_RDS_PASSWORD

Step 4.2 Cassandra (optional)

使用Cassandra是一个可选步骤如果计划每秒插入超过5K的数据点或想要优化存储空间建议您使用Cassandra。

预配置节点

预置将托管Cassandra实例的其他节点组可以更改机器类型建议至少使用4个vCPU和16GB内存。

我们将创建3个单独的节点池每个区域1个节点。由于我们计划使用ebs磁盘因此我们不希望k8s在相应磁盘不可用的区域中启动pod。
这些区域将具有相同的节点标签将使用此标签来定位有状态集的部署。

在不同的区域中部署3m5.xlarge类型的节点可以更改区域以对应于的所在的地区:

1
eksctl create nodegroup --config-file=<path> --include='cassandra-*'
有状态部署Cassandra

创建命名空间:

1
2
kubectl apply -f tb-namespace.yml
kubectl config set-context $(kubectl config current-context) --namespace=thingsboard

部署到新的节点组:

1
kubectl apply -f receipts/cassandra.yml

Cassandra集群的启动需要几分钟可以使用以下方法监控该过程:

1
kubectl get pods
更新数据库设置

编辑ThingsBoard数据库设置文件并添加Cassandra设置,不要忘记将YOUR_AWS_REGION替换为你的AWS区域的名称。

1
2
3
echo "  DATABASE_TS_TYPE: cassandra" >> tb-node-db-configmap.yml
echo "  CASSANDRA_URL: cassandra:9042" >> tb-node-db-configmap.yml
echo "  CASSANDRA_LOCAL_DATACENTER: YOUR_AWS_REGION"  >> tb-node-db-configmap.yml

检查设置是否已更新:

1
cat tb-node-db-configmap.yml | grep DATABASE_TS_TYPE

执行输出结果:

1
  DATABASE_TS_TYPE: cassandra
创建键空间

使用以下命令创建thingsboard键空间:

1
2
3
4
5
6
    kubectl exec -it cassandra-0 -- bash -c "cqlsh -e \
                    \"CREATE KEYSPACE IF NOT EXISTS thingsboard \
                    WITH replication = { \
                        'class' : 'NetworkTopologyStrategy', \
                        'us-east' : '3' \
                    };\""

Step 5. Amazon MSK Configuration

ThingsBoard使用Kafka来在微服务之间进行通信存储未处理的消息,Kafka可用于并发削峰和硬件故障以确保处理来自设备的所有消息。 请打开AWS控制台并导航到MSK选择Create cluster按钮配置Custom create模式。

  • 确保Apache Kafka版本为2.6.x;
  • 确保MSK实例与ThingsBoard集群互通;
  • 使用 m5.large类型实例;
  • 选择默认安全设置确保启用’Plaintext’模式;
  • 使用默认’Monitoring’设置或启用’Enhenced topic level monitoring’。

切换到’Active’状态后的MSK集群导航到’Details’并以明文形式复制服务引导YOUR_MSK_BOOTSTRAP_SERVERS_PLAINTEXT信息。

编辑“tb-kafka-configmap.yml”文件并替换YOUR_MSK_BOOTSTRAP_SERVERS_PLAINTEXT

Step 6. Amazon ElactiCache (Redis) Configuration

ThingsBoard使用缓存来提高性能并避免频繁的数据库读取则需要设置Amazon ElastiCache (Redis)

请打开AWS控制台并导航到ElastiCache->Redis->Create。

  • 确保Redis版本为6.x并至少有1 GB的内存;
  • 确保Redis实例与ThingsBoard集群互通;
  • 禁用自动备份。

切换到’Available’状态后的Redis集群导航到’Details’并复制’Primary Endpoint’不带’:6379’后缀的YOUR_REDIS_ENDPOINT_URL_WITHOUT_PORT信息。

编辑“tb-redis-configmap.yml”替换YOUR_REDIS_ENDPOINT_URL_WITHOUT_PORT

Edit “tb-node-db-configmap.yml” and replace YOUR_RDS_ENDPOINT_URL and YOUR_RDS_PASSWORD with the values you have obtained during step 4.

Edit “tb-kafka-configmap.yml” and replace YOUR_MSK_BOOTSTRAP_SERVERS_PLAINTEXT with the values you have obtained during step 5.

Edit “tb-redis-configmap.yml” and replace YOUR_REDIS_ENDPOINT_URL_WITHOUT_PORT with the values you have obtained during step 6.

Step 8. Obtain and configure license key

We assume you have already chosen your subscription plan or decided to purchase a perpetual license. If not, please navigate to pricing page to select the best license option for your case and get your license. See How-to get pay-as-you-go subscription or How-to get perpetual license for more details.

Create docker secret with your license key:

1
2
export TB_LICENSE_KEY=PUT_YOUR_LICENSE_KEY_HERE 
kubectl create -n thingsboard secret generic tb-license --from-literal=license-key=$TB_LICENSE_KEY

Don’t forget to replace PUT_YOUR_LICENSE_KEY_HERE with the value of your license key.

Step 9. CPU and Memory resources allocation

The scripts have preconfigured values of resources for each service. You can change them in .yml files under resources submenu.

Note: if you want to allocate more resources you’ll need to increase the number of Amazon nodes or use larger machines.

Recommended CPU/memory resources allocation:

  • TB Node: 1.5 CPU / 6Gi memory
  • TB HTTP Transport: 0.5 CPU / 2Gi memory
  • TB MQTT Transport: 0.5 CPU / 2Gi memory
  • TB COAP Transport: 0.5 CPU / 2Gi memory
  • TB Web UI: 0.3 CPU / 0.5Gi memory
  • JS Executor: 0.1 CPU / 0.3Gi memory
  • Zookeeper: 0.3 CPU / 1Gi memory

Step 10. Installation

执行以下命令以运行数据库的初始设置将启动ThingsBoard来配置必要的数据库表、索引等。

1
 ./k8s-install-tb.sh --loadDemo

说明:

  • --loadDemo - 可选参数用于是否加载演示数据。

此命令完成后应该会在控制台中看到下行内容:

1
Installation finished successfully!

请检查在tb-node-db-configmap.yml是否正确设置了PostgreSQL URL和PostgreSQL密码。

Step 11. Starting

Execute the following command to deploy ThingsBoard services:

1
 ./k8s-deploy-resources.sh

After few minutes you may call kubectl get pods. If everything went fine, you should be able to see:

  • 5x tb-js-executor
  • 1x tb-node (We setup one node by default, you may scale it to many nodes if you have additional instances attached to your license key)
  • 2x tb-web-ui
  • 3x zookeeper.

Every pod should be in the READY state.

还需要部署传输微服务省略不使用的协议可以节省资源:

HTTP组件(可选)
1
kubectl apply -f transports/tb-http-transport.yml
MQTT组件(可选)
1
kubectl apply -f transports/tb-mqtt-transport.yml
CoAP组件(可选)
1
kubectl apply -f transports/tb-coap-transport.yml
LwM2M组件(可选)
1
kubectl apply -f transports/tb-lwm2m-transport.yml
SNMP组件(可选)
1
kubectl apply -f transports/tb-snmp-transport.yml

Step 12. Configure Load Balancers

12.1 Configure HTTP(S) Load Balancer

有2种基础配置选项设置HTTP(S)负载均衡访问ThingsBoard实例Web界面:

  • http - 推荐用于开发优点是配置简单,成本最低,不适合生产。
  • https - 推荐用于生产优点是配置简单,流量重定向至HTTPS端口,提高安全性,适合生产。

请参阅下面的链接/说明了解如何配置每个建议的选项。

HTTP

执行以下命令以部署http负载均衡:

1
kubectl apply -f receipts/http-load-balancer.yml

负载均衡配置过程可能需要一些时间可以使用以下命令定期检查负载均衡器的状态:

1
kubectl get ingress

配置成功后输出:

1
2
NAME                   CLASS    HOSTS   ADDRESS         PORTS   AGE
tb-http-loadbalancer   <none>   *       34.111.24.134   80      7m25s

现在可以使用地址(在命令输出中看到的地址而不是34.111.24.134)访问HTTP Web UI(端口80)并通过HTTP API连接到设备使用以下默认凭据:

  • System Administrator: sysadmin@thingsboard.org / sysadmin
  • Tenant Administrator: tenant@thingsboard.org / tenant
  • Customer User: customer@thingsboard.org / customer

HTTPS

使用AWS证书管理器创建或导入SSL证书并记信的证书ARN。

编辑负载均衡配置并将YOUR_HTTPS_CERTIFICATE_ARN替换为你的证书ARN:

1
nano receipts/https-load-balancer.yml

执行以下命令以部署https负载均衡:

1
kubectl apply -f receipts/https-load-balancer.yml

12.2. Configure MQTT Load Balancer (Optional)

如果使用MQTT协议连接设备请配置MQTT负载均衡。

执行以下命令以部署TCP负载均衡:

1
kubectl apply -f receipts/mqtt-load-balancer.yml

负载均衡将转发端口1883和8883的所有TCP流量。

One-way TLS

配置MQTTS的最简单方法是使MQTT负载均衡(AWS NLB)充当TLS端点,通过这种方式我们设置了单向TLS连接其中设备和负载均衡之间的流量是加密的而负载均衡和MQTT传输之间的流量是未加密的, 没有安全问题因为ALB/NLB正在你的VPC中运行,此选项的唯一是缺点不能使用“X.509 证书”MQTT 客户端凭据,因为有关客户端证书的信息不会从负载均衡器传输到ThingsBoard MQTT传输服务。

启用one-way TLS

使用AWS证书管理器创建或导入SSL证书并记信的证书ARN。

编辑负载均衡配置并将YOUR_MQTTS_CERTIFICATE_ARN替换为你的证书ARN:

1
nano receipts/mqtts-load-balancer.yml

执行以下命令以部署mqtts负载均衡:

1
kubectl apply -f receipts/mqtts-load-balancer.yml
Two-way TLS

启用MQTTS的更复杂的方法是获取有效(签名)TLS证书并在MQT 传输中对其进行配置此选项的主要优点是你可以将其与“X.509证书”MQTT客户端凭证结合使用。

启用two-way TLS

按照本指南创建带有SSL证书的.pem文件将文件作为server.pem存储在工作目录中。

你需要使用PEM文件创建一个配置映射可以通过调用命令来完成:

1
2
3
4
kubectl create configmap tb-mqtts-config \
 --from-file=server.pem=YOUR_PEM_FILENAME \
 --from-file=mqttserver_key.pem=YOUR_PEM_KEY_FILENAME \
 -o yaml --dry-run=client | kubectl apply -f -
  • YOUR_PEM_FILENAME是服务器证书文件的名称。
  • YOUR_PEM_KEY_FILENAME是服务器证书私钥文件的名称。

取消注释’tb-services.yml’文件中标记以启用双向MQTTS。

执行命令以应用更改:

1
kubectl apply -f tb-services.yml

部署”transparent”负载均衡:

1
kubectl apply -f receipts/mqtt-load-balancer.yml

12.3. Configure UDP Load Balancer (Optional)

如果使用CoAP或LwM2M协议连接设备请配置UDP负载均衡器。

执行以下命令以部署UDP负载均衡:

1
kubectl apply -f receipts/udp-load-balancer.yml

负载均衡器将转发以下端口的所有UDP流量:

  • 5683 - CoAP服务非安全端口
  • 5684 - CoAP服务安全DTLS端口。
  • 5685 - LwM2M服务非安全端口。
  • 5686 - LwM2M服务安全DTLS端口。
  • 5687 - LwM2M引导服务DTLS端口。
  • 5688 - LwM2M引导服务安全DTLS端口。

CoAP DTLS

这种类型的负载均衡要求自行预置和维护有效的SSL证书遵循基于DTLS的通用CoAP指南在tb-services.yml文件中配置所需的环境变量。

LwM2M DTLS

这种类型的负载均衡要求自行预置和维护有效的SSL证书遵循基于DTLS的通用CoAP指南在tb-services.yml文件中配置所需的环境变量。

Step 13. Validate the setup

验证WebUI

现在你可以使用负载均衡的DNS名称在浏览器中打开ThingsBoard Web界面。

你可以使用以下命令查看HTTP负载均衡器的DNS名称(ADDRESS):

1
kubectl get ingress

你应该看到类似的图片:

image

使用以下默认凭据:

  • System Administrator: sysadmin@thingsboard.org / sysadmin

如果使用演示数据(使用--loadDemo标志)安装了数据库则还可以使用以下凭据:

  • Tenant Administrator: tenant@thingsboard.org / tenant
  • Customer User: customer@thingsboard.org / customer

验证MQTT/CoAP

通过MQTT或COAP连接到集群需要获取相应的服务使用以下命令来完成:

1
kubectl get service

你应该看到类似的图片:

image

有两个负载均衡器

  • tb-mqtt-loadbalancer-external - MQTT协议
  • tb-coap-loadbalancer-external - COAP协议

使用EXTERNAL-IP字段连接到集群的负载均衡。

故障排查

如果出现任何问题可以检查服务日志中的错误,例如要查看ThingsBoard节点日志请执行以下命令:

1
kubectl logs -f tb-node-0

kubectl get pods查看Pod的状态。
kubectl get services查看所有服务的状态。
kubectl get deployments查看所有部署的状态。
有关详细信息请参阅kubectl清单命令参考。

升级

将本地更改与步骤1中使用的存储库中的最新版本分支合并

如果需要升级数据库请执行以下命令:

1
 ./k8s-upgrade-tb.sh --fromVersion=[FROM_VERSION]

说明:

  • FROM_VERSION - 从哪个版本开始升级有关有效值请参阅升级说明

注意: 可以选择在运行数据库升级时停止tb节点Pod将导致停机但将确保数据库状态在更新后保持一致,大多数更新不需要停止TB节点完成后再次执行资源的部署。

这将导致使用最新版本重新启动ThingsBoard组件。

1
./k8s-deploy-resources.sh

删除集群

执行以下命令删除所有Pod:

1
./k8s-delete-resources.sh

执行以下命令删除所有pod和配置映射:

1
./k8s-delete-all.sh

执行以下命令删除EKS集群(应更改集群和区域的名称):

1
eksctl delete cluster -r us-east-1 -n thingsboard -w

Next steps

  • 入门指南 - 快速学习ThingsBoard相关功能。

  • 连接设备 - 学习如何根据你的连接方式或解决方案连接设备。

  • 可 视 化 - 学习如何配置复杂的ThingsBoard仪表板说明。

  • 数据处理 - 学习如何使用ThingsBoard规则引擎。

  • 数据分析 - 学习如何使用规则引擎执行基本的分析任务。

  • 硬件样品 - 学习如何将各种硬件平台连接到ThingsBoard。

  • 高级功能 - 学习高级ThingsBoard功能。

  • 开发指南 - 学习ThingsBoard中的贡献和开发。