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

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

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

前置条件

安装和配置工具

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

安装完成后,需要使用 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 有两个必需参数:name 和 resource-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_USER 和 YOUR_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 等)。

后续步骤