产品定价 立即试用
专业版
使用 AKS 基础设施的单体设置
入门 文档 指南 安装 架构 API 常见问题
目录

使用 AKS 基础设施的单体设置

本指南将帮助您在 Azure AKS 中以单体模式设置 ThingsBoard。

前置条件

安装和配置工具

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

安装完成后,需要使用 az login 命令在 CLI 中登录。

1
az login

从 Docker Hub 拉取 ThingsBoard PE 镜像

运行以下命令验证您能否从 Docker Hub 拉取镜像。

1
2
docker pull thingsboard/tb-pe-node:4.3.0.1PE
docker pull thingsboard/tb-pe-web-report:4.3.0.1PE

步骤 1. 克隆 ThingsBoard PE K8S 脚本仓库

1
2
git clone -b release-4.3.0.1 https://github.com/thingsboard/thingsboard-pe-k8s.git --depth 1
cd thingsboard-pe-k8s/azure/monolith

步骤 2. 定义环境变量

定义您将在本指南后续命令中使用的环境变量。

假设您使用 Linux。执行以下命令:

1
2
3
4
5
6
7
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 "您的变量已就绪,可在 $AKS_LOCATION 创建资源组 $AKS_RESOURCE_GROUP,以及其中的集群 $TB_CLUSTER_NAME 和数据库 $TB_DATABASE_NAME"

其中:

  • myResourceGroup - 用于部署和管理 Azure 资源的逻辑组。本指南后续将使用 AKS_RESOURCE_GROUP 引用;
  • eastus - 要创建资源组的位置。本指南后续将使用 AKS_LOCATION 引用; 执行 az account list-locations 可查看所有位置列表;
  • tb-gateway - Azure 应用程序网关名称;
  • tb-cluster - 集群名称。本指南后续将使用 TB_CLUSTER_NAME 引用;
  • tb-db - 数据库服务器名称。您可输入不同名称。本指南后续将使用 TB_DATABASE_NAME 引用;

步骤 3. 配置并创建 AKS 集群

创建 AKS 集群之前,我们需要先创建 Azure 资源组,将使用 Azure CLI 完成此操作:

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 1

az aks create 有两个必需参数:nameresource-group(使用之前设置的变量),以及多个可选参数(将使用默认值),其中部分为:

  • node-count - Kubernetes 节点池中的节点数量。创建集群后,可使用 az aks scale 更改节点池大小(默认值为 3);
  • enable-addons - 以逗号分隔列表启用 Kubernetes 附加组件(使用 az aks addon list 获取可用附加组件列表);
  • node-osdisk-size - 给定代理池中机器使用的 OS 磁盘类型:Ephemeral 或 Managed。在 VM 大小和 OS 磁盘大小允许的情况下默认为 ‘Ephemeral’。创建后可能无法更改;
  • node-vm-size(或 -s) - 作为 Kubernetes 节点创建的虚拟机大小(默认值为 Standard_DS2_v2);
  • generate-ssh-keys - 如缺少则生成 SSH 公钥和私钥文件。密钥将存储在 ~/.ssh 目录。

上述命令中我们添加了 ApplicationGateway 的 AKS 附加组件。我们将使用此网关作为 ThingsBoard 基础设施的基于路径的负载均衡器。

az aks create 的完整选项列表请参阅此处

您也可以按照指南进行自定义集群设置。

步骤 4. 更新 kubectl 的上下文

集群创建后,可使用以下命令将 kubectl 连接到集群:

1
az aks get-credentials --resource-group $AKS_RESOURCE_GROUP --name $TB_CLUSTER_NAME

进行验证可执行命令

1
kubectl get nodes

您应看到集群节点列表

步骤 5. 配置数据库

5.1. 创建 Azure Database for PostgreSQL 服务器

您需要在 Azure 上设置 PostgreSQL。ThingsBoard 将使用其作为主数据库来存储设备、仪表板、规则链和设备遥测数据。

您可以按照指南操作,但需注意以下要求:

  • 请妥善保管 postgresql 密码。本指南后续将使用 YOUR_RDS_PASSWORD 引用;
  • 确保 Azure Database for PostgreSQL 版本为最新 16.x;
  • 确保 Azure Database for PostgreSQL 实例可从 ThingsBoard 集群访问;
  • 确保使用 “thingsboard” 作为初始数据库名称;

以及建议:

  • 启用”高可用性”。默认启用多项有用设置;

另一种创建 Azure Database for PostgreSQL 的方式是使用 az 工具 (别忘了将 ‘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 account list-locations;
  • resource-group(或 -g)- 资源组名称;
  • name - 服务器名称。名称只能包含小写字母、数字和连字符 (-)。最少 3 个字符,最多 63 个字符;
  • admin-user - 服务器管理员用户名。设置后无法更改;
  • admin-password - 管理员密码。最少 8 个字符,最多 128 个字符。密码必须包含以下四类字符中的三类:英文字母大写、英文字母小写、数字和非字母数字字符;
  • public-access - 确定公共访问。输入单个或 IP 地址范围以加入允许的 IP 列表。IP 地址范围必须以破折号分隔且不含空格。指定 0.0.0.0 允许 Azure 内部署的任何资源访问您的服务器。设置为 “None” 会将服务器置于公共访问模式但不创建防火墙规则;
  • storage-size - 服务器存储容量。最小 32 GiB,最大 16 TiB;
  • version - 服务器主版本。
  • high-availability - 启用或禁用高可用性功能。默认值为 Disabled。高可用性只能在灵活服务器创建时设置(接受值:Disabled、Enabled。默认值:Disabled);
  • database-name(或 -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 值(本例中为 tb-db.postgres.database.azure.com)。 同时记下用户名和密码(postgres)。

编辑数据库设置文件,将 YOUR_AZURE_POSTGRES_ENDPOINT_URL 替换为 host 值, YOUR_AZURE_POSTGRES_USERYOUR_AZURE_POSTGRES_PASSWORD 替换为正确的值:

1
nano tb-node-db-configmap.yml

5.2. Cassandra

使用 Cassandra 为可选步骤。 如计划每秒插入超过 5K 数据点或希望优化存储空间,建议使用 Cassandra。

预置附加节点池

预置将托管 Cassandra 实例的附加节点池。 您可以更改机器类型。建议至少 4 个 vCPU 和 16GB 内存。

我们将在三个可用区各创建 3 个独立节点池,每个 zone 1 个节点。 由于计划使用区域磁盘,我们不希望 k8s 在对应磁盘不可用的节点上启动 Pod。 这些 zone 将具有相同的节点标签。我们将使用此标签来定位 StatefulSet 的部署。

因此,为您所在位置在三个 zone 中定义 3 个节点池:

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 StatefulSet

创建 ThingsBoard 命名空间:

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

将 Cassandra 部署到新节点组:

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

创建 keyspace

使用以下命令创建 thingsboard keyspace:

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', \
                        'dc1' : '3' \
                    };\""

步骤 6. 配置许可证密钥

我们假设您已选择订阅计划或决定购买永久许可证。 若尚未选择,请前往定价页面为您的场景选择最佳许可证并获取许可证。 更多详情请参阅 如何获取按需付费订阅如何获取永久许可证

使用您的许可证密钥创建 docker secret:

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
文档信息图标

请勿忘记将 PUT_YOUR_LICENSE_KEY_HERE 替换为您的许可证密钥值。

步骤 7. 安装

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

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

其中:

  • --loadDemo - 可选参数。是否加载额外的演示数据。

此命令完成后,您应在控制台看到以下输出:

1
Installation finished successfully!

否则,请检查是否在 tb-node-db-configmap.yml 中正确设置了 PostgreSQL URL。

步骤 8. 启动

执行以下命令部署 ThingsBoard 服务:

1
 ./k8s-deploy-resources.sh

几分钟后可执行 kubectl get pods。若一切正常,您应能看到 tb-node-0 pod 处于 READY 状态。

步骤 9. 配置负载均衡器

9.1. 配置 HTTP(S) 负载均衡器

配置 HTTP(S) 负载均衡器以访问 ThingsBoard 实例的 Web 界面。主要有 3 种配置选项:

  • http - 不支持 HTTPS 的负载均衡器。适用于开发环境。唯一优势是配置简单、成本最低。适合开发服务器,但不适合生产环境。
  • https - 支持 HTTPS 的负载均衡器。适用于生产环境。作为 SSL 终止点。可轻松配置以签发和维护有效的 SSL 证书。自动将所有非安全(HTTP)流量重定向到安全(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 的地址)通过端口 80 访问 HTTP Web UI,并通过 HTTP API 连接设备。使用以下默认凭据:

  • 系统管理员:sysadmin@thingsboard.org / sysadmin
  • 租户管理员:tenant@thingsboard.org / tenant
  • 客户用户:customer@thingsboard.org / customer

HTTPS 负载均衡器

使用 SSL 证书时,可通过以下命令直接在 Azure ApplicationGateWay 中添加证书:

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

将证书添加到应用程序负载均衡器后可执行:

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 设置以禁用重定向行为。

9.2. 配置 MQTT 负载均衡器(可选)

如计划使用 MQTT 协议连接设备,请配置 MQTT 负载均衡器。

使用以下命令创建 TCP 负载均衡器:

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

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

MQTT over SSL

此类型负载均衡器需要您自行预置和维护有效的 SSL 证书。 请按照通用 MQTT over SSL 指南 在 tb-node.yml 文件中配置所需环境变量。

9.3. 配置 UDP 负载均衡器(可选)

如计划使用 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 over DTLS

此类型负载均衡器需要您自行预置和维护有效的 SSL 证书。 请按照通用 CoAP over DTLS 指南 在 tb-node.yml 文件中配置所需环境变量。

LwM2M over DTLS

此类型负载均衡器需要您自行预置和维护有效的 SSL 证书。 请按照通用 LwM2M over DTLS 指南 在 tb-node.yml 文件中配置所需环境变量。

9.4. 配置 Edge 负载均衡器(可选)

若计划将 Edge 实例连接到 ThingsBoard 服务器,需配置 Edge 负载均衡器。

要创建 TCP Edge 负载均衡器,使用以下命令应用提供的 YAML 文件:

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

负载均衡器将转发端口 7070 上的所有 TCP 流量。

Edge 负载均衡器配置完成后,可将 Edge 实例连接到 ThingsBoard 服务器。

连接 Edge 实例前,需获取 Edge 负载均衡器的外部 IP 地址。执行以下命令获取该 IP:

1
kubectl get services | grep "EXTERNAL-IP\|tb-edge-loadbalancer"

应看到类似以下输出:

1
2
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)          AGE
tb-edge-loadbalancer   LoadBalancer   10.44.5.255   104.154.29.225   7070:30783/TCP   85m

记下外部 IP 地址,并在 Edge 连接参数中将 CLOUD_RPC_HOST 设为该地址。

步骤 10. 配置 Trendz(可选)

10.1. 从 Docker Hub 拉取 Trendz 镜像

运行以下命令以验证可从 Docker Hub 拉取镜像:

1
2
docker pull thingsboard/trendz:1.15.0.4
docker pull thingsboard/trendz-python-executor:1.15.0.4

10.2. 在现有 Azure Database 中创建 Trendz 数据库

编辑 “trendz/trendz-secret.yml” ,将 YOUR_AZURE_POSTGRES_ENDPOINT_URL、YOUR_AZURE_POSTGRES_USER 和 YOUR_AZURE_POSTGRES_PASSWORD 替换后执行 Kubernetes Job:

1
2
kubectl apply -f ./trendz/trendz-secret.yml
kubectl apply -f ./trendz/trendz-create-db.yml

执行以下命令可查看日志:

1
kubectl logs job/trendz-create-db -n thingsboard

10.3. 启动 Trendz

执行以下命令以运行数据库初始设置。该命令将启动短期存在的 ThingsBoard pod 以创建必要的 DB 表、索引等:

1
 ./k8s-deploy-trendz.sh

命令完成后,控制台应显示:

1
Trendz installed successfully!
文档信息图标

否则,请检查 trendz-secret.yml 中的 PostgreSQL URL 和 PostgreSQL 密码是否配置正确。

步骤 11. 使用

现在您可以在浏览器中使用负载均衡器的 IP 地址打开 ThingsBoard Web 界面。

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

1
kubectl get ingress

您应该看到类似的输出:

image

要通过 MQTT 或 COAP 连接集群,需要获取对应的服务,可使用以下命令:

1
kubectl get service

您应该看到类似的输出:

image

有两个负载均衡器:

  • tb-mqtt-loadbalancer - 用于 TCP(MQTT)协议
  • tb-udp-loadbalancer - 用于 UDP(COAP/LwM2M)协议

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

使用以下默认凭据:

  • 系统管理员:sysadmin@thingsboard.org / sysadmin

如果使用 --loadDemo 标志安装了带演示数据的数据库,您还可以使用以下凭据:

  • 租户管理员:tenant@thingsboard.org / tenant
  • 客户用户:customer@thingsboard.org / customer

如遇问题,可以检查服务日志以查找错误。例如,要查看 ThingsBoard 节点日志,请执行以下命令:

1
kubectl logs -f tb-node-0

或使用 kubectl get pods 查看 Pod 状态。 或使用 kubectl get services 查看所有服务状态。 或使用 kubectl get deployments 查看所有部署状态。 详见 kubectl 速查表 命令参考。

执行以下命令删除 tb-node负载均衡器

1
./k8s-delete-resources.sh

执行以下命令删除所有数据(包括数据库):

1
./k8s-delete-all.sh

升级

升级到新版 ThingsBoard

当需要升级数据库时,执行以下命令:

1
2
3
 ./k8s-delete-resources.sh
 ./k8s-upgrade-tb.sh --fromVersion=[FROM_VERSION]
 ./k8s-deploy-resources.sh

其中:

  • FROM_VERSION - 升级起始版本。有关有效 fromVersion 值请参阅 升级说明。注意,必须逐个版本升级(例如 3.6.1 -> 3.6.2 -> 3.6.3 等)。

升级到新版 Trendz(可选)

若要升级,请从 master 分支拉取最新更改:

1
git pull origin master

然后执行以下命令:

1
 ./k8s-upgrade-trendz.sh

注意,可从任意版本直接升级 Trendz 至最新版本(例如 1.12.0 -> 1.15.0 等)。

后续步骤