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

本页目录

Microservices setup using AKS infrastructure

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有两个必要参数nameresource-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替换hostYOUR_AZURE_POSTGRES_USERYOUR_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

Don’t forget to replace PUT_YOUR_LICENSE_KEY_HERE with the value of your 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

注意: 负载均衡会将所有HTTP流量重定向到HTTPS不支持HTTPS的设备将无法连接到ThingsBoard,如果要支持此类设备可以为HTTP传输部署单独的负载均衡(推荐)也可以通过更改 https-load-balancer.yml文件中的重定向到appgw.ingress.kubernetes.io/ssl-redirect设置来禁用重定向行为。

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

你应该看到类似的图片:

image

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

1
kubectl get service

你应该看到类似的图片:

image

有两个负载均衡器

  • 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中的贡献和开发。