- Prerequisites
- Step 1. Clone ThingsBoard PE K8S scripts repository
- Step 2. Configure and create EKS cluster
- Step 3. Create AWS load-balancer controller
- Step 4. Provision Databases
- Step 5. Amazon MSK Configuration
- Step 6. Amazon ElactiCache (Redis) Configuration
- Step 7. Configure links to the Kafka (Amazon MSK)/Redis/Postgres
- Step 8. Obtain and configure license key
- Step 9. CPU and Memory resources allocation
- Step 10. Installation
- Step 11. Starting
- Step 12. Configure Load Balancers
- Step 13. Validate the setup
- 升级
- 删除集群
- Next steps
This guide will help you to setup ThingsBoard in microservices mode in AWS EKS.
Prerequisites
工具安装
在EKS集群上部署ThingsBoard需要安装kubectl
,
eksctl
和
awscli
工具。
请参考指南配置访问密钥、私钥和默认区域而默认区域为所部署群集的区域的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
)
注意:如果不更改instanceType
和desiredCapacity
EKS将部署1个m5.xlarge的节点。
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_URL和YOUR_RDS_PASSWORD。
Step 4.2 Cassandra (optional)
使用Cassandra是一个可选步骤如果计划每秒插入超过5K的数据点或想要优化存储空间建议您使用Cassandra。
预配置节点
预置将托管Cassandra实例的其他节点组可以更改机器类型建议至少使用4个vCPU和16GB内存。
我们将创建3个单独的节点池每个区域1个节点。由于我们计划使用ebs磁盘因此我们不希望k8s在相应磁盘不可用的区域中启动pod。
这些区域将具有相同的节点标签将使用此标签来定位有状态集的部署。
在不同的区域中部署3个m5.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。
Step 7. Configure links to the Kafka (Amazon MSK)/Redis/Postgres
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
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!
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
你应该看到类似的图片:
使用以下默认凭据:
- 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
你应该看到类似的图片:
有两个负载均衡器
- 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中的贡献和开发。