- Prerequisites
- Step 1. Clone ThingsBoard PE K8S scripts repository
- Step 2. Define environment variables
- Step 3. Configure and create AKS cluster
- Step 4. Update the context of kubectl
- Step 5. Provision Databases
- Step 6. Azure Cache for Redis
- Step 7. Configure license key
- Step 8. Installation
- Step 9. Starting
- Step 10. Configure Load Balancers
- Step 11. Using
- Upgrading
- Next steps
This guide will help you to setup ThingsBoard in microservices mode in Azure AKS.
Prerequisites
工具安装
在AKS集群上部署ThingsBoard需要安装kubectl
,
az
工具。
安装完成后需要使用CLI命令登录AZ。
1
az login
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/azure/microservices
Step 2. Define environment variables
定义将在本指南后面的各种命令中使用的环境变量。
执行以下命令:
1
2
3
4
5
6
7
8
export AKS_RESOURCE_GROUP=ThingsBoardResources
export AKS_LOCATION=eastus
export AKS_GATEWAY=tb-gateway
export TB_CLUSTER_NAME=tb-cluster
export TB_DATABASE_NAME=tb-db
export TB_REDIS_NAME=tb-redis
echo "You variables ready to create resource group $AKS_RESOURCE_GROUP in location $AKS_LOCATION
and cluster in it $TB_CLUSTER_NAME with database $TB_DATABASE_NAME"
说明:
- myResourceGroup - 表示部署和管理 Azure 资源的逻辑组变量名为AKS_RESOURCE_GROUP;
- eastus - 表示创建资源组的位置变量名为AKS_LOCATION;
- tb-gateway - 表示Azure应用程序网关的名称;
- tb-cluster - 表示群集名称变量名为TB_CLUSTER_NAME ;
- tb-db 表示数据库服务的名称变量名为TB_DATABASE_NAME;
Step 3. Configure and create AKS cluster
我们使用Azure CLI创建Azure资源组后面创建群集群。
1
az group create --name $AKS_RESOURCE_GROUP --location $AKS_LOCATION
要查看更多的az group
信息请在这里查看更多信息。
创建资源组后可以使用以下命令在其中创建AKS群集:
1
2
3
4
5
6
7
8
az aks create --resource-group $AKS_RESOURCE_GROUP \
--name $TB_CLUSTER_NAME \
--generate-ssh-keys \
--enable-addons ingress-appgw \
--appgw-name $AKS_GATEWAY \
--appgw-subnet-cidr "10.2.0.0/16" \
--node-vm-size Standard_DS3_v2 \
--node-count 3
az aks create
有两个必要参数name
和resource-group
以及一些不必要参数组成:
- node-count - Kubernetes节点数量az aks集群创建后默认为3个节点;
- enable-addons - Kubernetes插件列表以逗号分隔开的(可用插件列表);
- node-osdisk-size - 磁盘类型;
- node-vm-size (or -s) - Kubernetes 节点的虚拟机的大小;
- generate-ssh-keys - 生成SSH公钥和私钥文件在~/.ssh目录。
上面的命令中我们为应用程网关添加AKS插件将使用此网关作为Thingsboard基础结的负载均衡。
你可以在此处查看az aks create
的完整列表或者可以使用本指南进行自定义集群的设置。
Step 4. Update the context of kubectl
执行以下命令创建claster:
1
az aks get-credentials --resource-group $AKS_RESOURCE_GROUP --name $TB_CLUSTER_NAME
执行验证命令
1
kubectl get nodes
出现群集的节点列表。
Step 5. Provision Databases
5.1. Create Azure Database for PostgreSQL servers
ThingsBoard将使用Azure作为主数据库来存储设备,仪表板,规则链和设备遥测需要在Azure上对PostgreSQL进行配置。
可以按照本指南进行操作但要考虑以下要求:
- 保存postgresql密码使用YOUR_RDS_PASSWORD来引用;
- 确保PostgreSQL版本为latest 12.x;
- 确保PostgreSQL 实例的Azure实体与ThingsBoard集群互通;
- 确保“thingsboard”作为初始化数据库名称;
建议:
- 默认启用”High availability”模式;
创建Azure数据库PostgreSQL的另一种方法(请替换’POSTGRESS_USER’和’POSTGRESS_PASS’为真实信息):
1
2
3
4
az postgres flexible-server create --location $AKS_LOCATION --resource-group $AKS_RESOURCE_GROUP \
--name $TB_DATABASE_NAME --admin-user POSTGRESS_USER --admin-password POSTGRESS_PASS \
--public-access 0.0.0.0 --storage-size 32 \
--version 12 -d thingsboard
az postgres flexible-server create
参数说明:
- location - az帐户地区;
- resource-group (or -g) - 资源组名称;
- name - 服务器名称;
- admin-user - Administrator名称;
- admin-password - Administrator密码;
- public-access - 白名单;
- storage-size - 服务器的存储容量;
- version - 服务器版本;
- high-availability - 启用或禁用高可用,默认值为Disabled;
- database-name (or -d) - 数据库名称。
可以在此处查看完整的参数说明。
实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"connectionString": "postgresql://postgres:postgres@$tb-db.postgres.database.azure.com/postgres?sslmode=require",
"databaseName": "thingsboard",
"firewallName": "AllowAllAzureServicesAndResourcesWithinAzureIps_2021-11-17_15-45-6",
"host": "tb-db.postgres.database.azure.com",
"id": "/subscriptions/daff3288-1d5d-47c7-abf0-bfb7b738a18c/resourceGroups/myResourceGroup/providers/Microsoft.DBforPostgreSQL/flexibleServers/thingsboard",
"location": "East US",
"password": "postgres",
"resourceGroup": "myResourceGroup",
"skuname": "Standard_D2s_v3",
"username": "postgres",
"version": "12"
}
请注意命令输出中host的值以及用户名和密码(postgres)在本次示例中是(tb-db.postgres.database.azure.com)。
编辑配置文件并将YOUR_AZURE_POSTGRES_ENDPOINT_URL替换host值YOUR_AZURE_POSTGRES_USER和YOUR_AZURE_POSTGRES_PASSWORD替换成对应值。
1
nano tb-node-db-configmap.yml
5.2. Cassandra
如果计划每秒插入超过5K的数据点或想要优化存储空间建议使用Cassandra这只是一个可选步骤。
配置节点
将Cassandra实例托管配置到其他节点组,建议至少使用4个vCPU和16GB内存。
我们将创建3个单独的节点每个区域1个节点,由于我们计划使用区域磁盘因此我们不希望k8s在相应磁盘不可用的节点上启动Pod。
1
2
3
az aks nodepool add --resource-group $AKS_RESOURCE_GROUP --cluster-name $TB_CLUSTER_NAME --name tbcassandra1 --node-count 1 --zones 1 --labels role=cassandra
az aks nodepool add --resource-group $AKS_RESOURCE_GROUP --cluster-name $TB_CLUSTER_NAME --name tbcassandra2 --node-count 1 --zones 2 --labels role=cassandra
az aks nodepool add --resource-group $AKS_RESOURCE_GROUP --cluster-name $TB_CLUSTER_NAME --name tbcassandra3 --node-count 1 --zones 3 --labels role=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设置
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: dc1" >> 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', \
'' : '3' \
};\""
Step 6. Azure Cache for Redis
ThingsBoard使用缓存来提高性能并避免频繁的数据库读取则需要设置Redis的Azure缓存。
可以通过本指南或az cli工具执行此操作。
1
az redis create --name $TB_REDIS_NAME --location $AKS_LOCATION --resource-group $AKS_RESOURCE_GROUP --sku Basic --vm-size c0 --enable-non-ssl-port
redis缓存参数说明:
- name (or -n) - 缓存的名称;
- resource-group - 资源组的名称;
- sku - 缓存的类型;
- vm-size - 缓存的大小;
- location (or -l) - az帐户列表位置。
查看完整的参数说明请参阅。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
"accessKeys": null,
"enableNonSslPort": true,
"hostName": "tb-redis.redis.cache.windows.net",
"id": "/subscriptions/daff3288-1d5d-47c7-abf0-bfb7b738a18c/resourceGroups/myResourceGroup/providers/Microsoft.Cache/Redis/tb-redis",
"instances": [
{
"isMaster": false,
"isPrimary": false,
"nonSslPort": 13000,
"shardId": null,
"sslPort": 15000,
"zone": null
}
],
"linkedServers": [],
"location": "East US",
"minimumTlsVersion": null,
"name": "tb-redis",
"port": 6379,
"privateEndpointConnections": null,
"provisioningState": "Creating",
"publicNetworkAccess": "Enabled",
"redisConfiguration": {
"maxclients": "256",
"maxfragmentationmemory-reserved": "12",
"maxmemory-delta": "2",
"maxmemory-reserved": "2"
},
"redisVersion": "4.0.14",
"replicasPerMaster": null,
"replicasPerPrimary": null,
"resourceGroup": "myResourceGroup",
"shardCount": null,
"sku": {
"capacity": 0,
"family": "C",
"name": "Basic"
},
"sslPort": 6380,
"staticIp": null,
"subnetId": null,
"tags": {},
"tenantSettings": {},
"type": "Microsoft.Cache/Redis",
"zones": null
}
编辑tb-redis-configmap.yml的”YOUR_REDIS_ENDPOINT_URL_WITHOUT_PORT“参数替换hostName
。
执行如下命令连接redis:
1
az redis list-keys --name $TB_REDIS_NAME --resource-group $AKS_RESOURCE_GROUP
获取”primary”并粘贴到tb-redis-configmap.yml文件替换YOU_REDIS_PASS。
Step 7. 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 8. Installation
执行以下命令以运行数据库的初始设置将启动ThingsBoard来配置必要的数据库表、索引等。
1
./k8s-install-tb.sh --loadDemo
说明:
--loadDemo
-可选参数用于是否加载演示数据。
此命令完成后应该会在控制台中看到下行内容:
1
Installation finished successfully!
请检查在tb-node-db-configmap.yml
是否正确设置了PostgreSQL URL和PostgreSQL密码。
Step 9. 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 tb-node-0
pod in the READY
state.
几分钟后使用kubectl get pods
查看tb-node-0
状态是否是READY
。
还需要部署传输微服务省略不使用的协议可以节省资源:
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 10. Configure Load Balancers
10.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
我们可以使用命令直接在Azure ApplicationGateway中添加SSL证书:
1
2
3
4
5
6
az network application-gateway ssl-cert create \
--resource-group $(az aks show --name $TB_CLUSTER_NAME --resource-group $AKS_RESOURCE_GROUP --query nodeResourceGroup | tr -d '"') \
--gateway-name $AKS_GATEWAY\
--name ThingsBoardHTTPCert \
--cert-file YOUR_CERT \
--cert-password YOUR_CERT_PASS
执行以下命令以部署https负载均衡:
1
kubectl apply -f receipts/https-load-balancer.yml
负载均衡配置过程可能需要一些时间你可以使用以下命令定期检查负载均衡的状态:
1
kubectl get ingress
配置成功后输出:
1
2
NAME CLASS HOSTS ADDRESS PORTS AGE
tb-https-loadbalancer <none> * 34.111.24.134 80 7m25s
10.2. Configure MQTT Load Balancer (Optional)
如果使用MQTT协议连接设备请配置MQTT负载均衡。
执行以下命令以部署TCP负载均衡:
1
kubectl apply -f receipts/mqtt-load-balancer.yml
负载均衡将转发端口1883和8883的所有TCP流量。
MQTT SSL
这种类型的负载均衡要求自行配置和维护有效的SSL证书遵循基于SSL的通用MQTT指南在transport/tb-mqtt-transport.yml文件中配置所需的环境变量。
10.3. Configure CoAP Load Balancer (Optional)
如果使用CoAP协议连接设备请配置CoAP负载均衡。
执行以下命令以部署CoAP负载均衡:
1
kubectl apply -f receipts/coap-load-balancer.yml
负载均衡将转发以下端口的所有UDP流量:
- 5683 - CoAP服务非安全端口
- 5684 - CoAP服务安全DTLS端口。
CoAP DTLS
这种类型的负载均衡要求自行预置和维护有效的SSL证书遵循基于DTLS的通用CoAP指南在transport/tb-coap-transport.yml文件中配置所需的环境变量。
10.4. Configure LwM2M Load Balancer (Optional)
如果使用CoAP或LwM2M协议连接设备请配置UDP负载均衡器。
执行以下命令以部署UDP负载均衡:
1
kubectl apply -f receipts/lwm2m-load-balancer.yml
负载均衡器将转发以下端口的所有UDP流量:
- 5685 - LwM2M服务非安全端口。
- 5686 - LwM2M服务安全DTLS端口。
- 5687 - LwM2M引导服务DTLS端口。
- 5688 - LwM2M引导服务安全DTLS端口。
LwM2M DTLS
这种类型的负载均衡要求自行预置和维护有效的SSL证书遵循基于DTLS的通用CoAP指南在transport/tb-lwm2m-transport.yml文件中配置所需的环境变量。
Step 11. Using
现在可以使用负载均衡的IP地址在浏览器中打开ThingsBoard Web界面。
使用以下命令查看HTTP负载均衡的DNS名称(ADDRESS
列):
1
kubectl get ingress
你应该看到类似的图片:
通过MQTT或COAP连接到集群需要获取相应的服务使用以下命令来完成:
1
kubectl get service
你应该看到类似的图片:
有两个负载均衡器
- tb-mqtt-loadbalancer-external - MQTT协议
- tb-coap-loadbalancer-external - COAP协议
使用EXTERNAL-IP
字段连接到集群的负载均衡。
使用以下默认凭据:
- System Administrator: sysadmin@thingsboard.org / sysadmin
如果使用演示数据(使用--loadDemo
标志)安装了数据库则还可以使用以下凭据:
- Tenant Administrator: tenant@thingsboard.org / tenant
- Customer User: customer@thingsboard.org / customer
如果出现任何问题可以检查服务日志中的错误,例如要查看ThingsBoard节点日志请执行以下命令:
1
kubectl logs -f tb-node-0
kubectl get pods
查看Pod的状态。
kubectl get services
查看所有服务的状态。
kubectl get deployments
查看所有部署的状态。
有关详细信息请参阅kubectl清单命令参考。
执行以下命令删除所有Pod:
1
./k8s-delete-resources.sh
执行以下命令删除所有pod和配置映射:
1
./k8s-delete-all.sh
Upgrading
如果需要升级数据库请执行以下命令:
1
2
3
./k8s-delete-resources.sh
./k8s-upgrade-tb.sh --fromVersion=[FROM_VERSION]
./k8s-deploy-resources.sh
说明:
FROM_VERSION
- 从哪个版本开始升级有关有效值请参阅升级说明。
Next steps
-
入门指南 - 快速学习ThingsBoard相关功能。
-
连接设备 - 学习如何根据你的连接方式或解决方案连接设备。
-
可 视 化 - 学习如何配置复杂的ThingsBoard仪表板说明。
-
数据处理 - 学习如何使用ThingsBoard规则引擎。
-
数据分析 - 学习如何使用规则引擎执行基本的分析任务。
-
硬件样品 - 学习如何将各种硬件平台连接到ThingsBoard。
-
高级功能 - 学习高级ThingsBoard功能。
-
开发指南 - 学习ThingsBoard中的贡献和开发。