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

使用 GCP 基础设施的微服务设置

本指南将帮助您在 GKE 中以微服务模式设置 ThingsBoard。

前置条件

安装并配置工具

要在 GKE 集群上部署 ThingsBoard,需安装 kubectl 和 gcloud 工具。 更多信息参见 开始前准备 指南。

创建新的 Google Cloud Platform 项目(推荐)或选择现有项目。

执行以下命令确保已选择正确项目:

1
gcloud init

启用 GCP 服务

执行以下命令为您的项目启用 GKE 和 SQL 服务:

1
gcloud services enable container.googleapis.com sql-component.googleapis.com sqladmin.googleapis.com

从 Docker Hub 拉取 ThingsBoard PE 镜像

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

1
2
3
4
5
6
7
8
9
docker pull thingsboard/tb-pe-node:4.3.0.1PE
docker pull thingsboard/tb-pe-web-report:4.3.0.1PE
docker pull thingsboard/tb-pe-web-ui:4.3.0.1PE
docker pull thingsboard/tb-pe-js-executor:4.3.0.1PE
docker pull thingsboard/tb-pe-http-transport:4.3.0.1PE
docker pull thingsboard/tb-pe-mqtt-transport:4.3.0.1PE
docker pull thingsboard/tb-pe-coap-transport:4.3.0.1PE
docker pull thingsboard/tb-pe-lwm2m-transport:4.3.0.1PE
docker pull thingsboard/tb-pe-snmp-transport:4.3.0.1PE

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

克隆仓库并将工作目录切换到 GCP 脚本目录。

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

步骤 2. 定义环境变量

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

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

1
2
3
4
5
6
7
8
9
10
export GCP_PROJECT=$(gcloud config get-value project)
export GCP_REGION=us-central1
export GCP_ZONE=us-central1
export GCP_ZONE1=us-central1-a
export GCP_ZONE2=us-central1-b
export GCP_ZONE3=us-central1-c
export GCP_NETWORK=default
export TB_CLUSTER_NAME=tb-pe-msa
export TB_DATABASE_NAME=tb-db
echo "You have selected project: $GCP_PROJECT, region: $GCP_REGION, gcp zones: $GCP_ZONE1,$GCP_ZONE2,$GCP_ZONE3, network: $GCP_NETWORK, cluster: $TB_CLUSTER_NAME, database: $TB_DATABASE_NAME"

其中:

  • 第一行使用 gcloud 命令获取您当前的 GCP 项目 ID。我们将在本指南后续使用 $GCP_PROJECT 引用;
  • us-central1 是可用计算区域之一。我们将在本指南后续使用 $GCP_REGION 引用;
  • default 是默认 GCP 网络名称;我们将在本指南后续使用 $GCP_NETWORK 引用;
  • tb-pe-msa 是您的集群名称。您可输入其他名称。我们将在本指南后续使用 $TB_CLUSTER_NAME 引用;
  • tb-db 是您的数据库服务器名称。您可输入其他名称。我们将在本指南后续使用 $TB_DATABASE_NAME 引用;

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

在 3 个可用区内创建分布式的区域集群,使用您偏好的机器类型。 以下示例在每个可用区预置 1 个 e2-standard-4 节点(共三个节点),但您可以根据工作负载需求修改 --machine-type 和 --num-nodes。 有关可用机器类型及其规格的完整列表,请参阅 GCP 机器类型文档。

执行以下命令(推荐):

1
2
3
4
5
6
7
8
9
gcloud container clusters create $TB_CLUSTER_NAME \
--release-channel stable \
--region $GCP_REGION \
--network=$GCP_NETWORK \
--node-locations $GCP_ZONE1,$GCP_ZONE2,$GCP_ZONE3 \
--enable-ip-alias \
--num-nodes=1 \
--node-labels=role=main \
--machine-type=e2-standard-4

或者,您可以使用此指南进行自定义集群设置。

步骤 4. 更新 kubectl 的上下文

使用以下命令更新 kubectl 的上下文:

1
gcloud container clusters get-credentials $TB_CLUSTER_NAME --region $GCP_REGION

步骤 5. 配置数据库

步骤 5.1 Google Cloud SQL (PostgreSQL) 实例

5.1 前提条件

启用服务网络以使 K8S 集群连接至 DB 实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
gcloud services enable servicenetworking.googleapis.com --project=$GCP_PROJECT

gcloud compute addresses create google-managed-services-$GCP_NETWORK \
--global \
--purpose=VPC_PEERING \
--prefix-length=16 \
--network=projects/$GCP_PROJECT/global/networks/$GCP_NETWORK

gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-$GCP_NETWORK \
--network=$GCP_NETWORK \
--project=$GCP_PROJECT
    

5.2 创建数据库服务器实例

创建数据库版本为 “PostgreSQL 16” 的 PostgreSQL 实例,建议如下:

  • 使用与 K8S 集群 GCP_REGION 相同区域;
  • 使用与 K8S 集群 GCP_REGION 相同的 VPC 网络;
  • 使用私有 IP 连接实例并禁用公网 IP;
  • 生产环境使用高可用 DB 实例,开发集群使用单可用区实例;
  • 至少使用 2 vCPU 和 7.5 GB 内存,可满足大多数负载,可按需扩展;

执行以下命令:

1
2
3
4
5
6
gcloud beta sql instances create $TB_DATABASE_NAME \
--database-version=POSTGRES_16 \
--region=$GCP_REGION --availability-type=regional \
--no-assign-ip --network=projects/$GCP_PROJECT/global/networks/$GCP_NETWORK \
--cpu=2 --memory=7680MB

也可参考 此 指南配置数据库。

从命令输出中记录 IP 地址(YOUR_DB_IP_ADDRESS)。成功执行后的输出类似:

1
2
3
Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/YOUR_PROJECT_ID/instances/$TB_DATABASE_NAME].
NAME                        DATABASE_VERSION  LOCATION       TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
$TB_DATABASE_NAME           POSTGRES_16       us-central1-f  db-custom-2-7680  35.192.189.68    -                RUNNABLE

5.3 设置数据库密码

为新建数据库服务器实例设置密码:

1
2
3
gcloud sql users set-password postgres \
--instance=$TB_DATABASE_NAME \
--password=secret

其中:

  • instance 为数据库服务器实例名称;
  • secret 为密码。应使用不同密码。本指南后续以 YOUR_DB_PASSWORD 引用;

5.4 创建数据库

在 postgres 数据库服务器实例中创建 “thingsboard” 数据库:

1
gcloud sql databases create thingsboard --instance=$TB_DATABASE_NAME

其中 thingsboard 为数据库名称。可使用其他名称。本指南后续以 YOUR_DB_NAME 引用;

步骤 5.2 Cassandra(可选)

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

预置额外节点组

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

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

1
2
3
4
5
6
gcloud container node-pools create cassandra1 --cluster=$TB_CLUSTER_NAME --zone=$GCP_ZONE --node-locations=$GCP_ZONE1 \
--node-labels=role=cassandra --num-nodes=1 --min-nodes=1 --max-nodes=1 --machine-type=e2-standard-4
gcloud container node-pools create cassandra2 --cluster=$TB_CLUSTER_NAME --zone=$GCP_ZONE --node-locations=$GCP_ZONE2 \
--node-labels=role=cassandra --num-nodes=1 --min-nodes=1 --max-nodes=1 --machine-type=e2-standard-4
gcloud container node-pools create cassandra3 --cluster=$TB_CLUSTER_NAME --zone=$GCP_ZONE --node-locations=$GCP_ZONE3 \
--node-labels=role=cassandra --num-nodes=1 --min-nodes=1 --max-nodes=1 --machine-type=e2-standard-4

部署 Cassandra 有状态集

创建 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: $GCP_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-central1' : '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. 安装

编辑 “tb-node-db-configmap.yml”,将 YOUR_DB_IP_ADDRESS 和 YOUR_DB_PASSWORD 替换为在 步骤 5 中获取的值。

1
nano tb-node-db-configmap.yml

执行以下命令运行安装:

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

其中:

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

此命令执行完成后,控制台应显示以下行:

1
Installation finished successfully!

步骤 8. 启动

执行以下命令部署第三方组件(zookeeper、kafka、redis)和主要 ThingsBoard 微服务:tb-node、tb-web-ui 和 js-executors:

1
./k8s-deploy-resources.sh

几分钟后可运行 kubectl get pods。若一切正常,应能看到 tb-node-0 Pod 处于 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

步骤 9. 配置负载均衡器

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

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

  • http - 不支持 HTTPS 的负载均衡器。推荐用于开发环境。 唯一优点是配置简单、成本最低。适用于开发服务器,但不适合生产环境。
  • https - 支持 HTTPS 的负载均衡器。推荐用于生产环境。充当 SSL 终结点。 可轻松配置以签发和维护有效 SSL 证书。自动将所有非安全 (HTTP) 流量重定向到安全 (HTTPS) 端口。
  • transparent - 仅将流量转发到 ThingsBoard 的 http 和 https 端口的负载均衡器。需要您自行准备和维护有效 SSL 证书。 适用于不能接受负载均衡器作为 SSL 终结点的生产环境。

请参阅以下链接/说明以配置各建议选项。

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 连接设备。 使用以下默认凭据:

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

HTTPS 负载均衡器

使用 Google 托管 SSL 证书配置负载均衡器的过程在官方文档页面中有描述。 以下说明摘自官方文档。请务必在继续之前仔细阅读先决条件。

1
gcloud compute addresses create thingsboard-http-lb-address --global

在 https-load-balancer.yml 文件中将 PUT_YOUR_DOMAIN_HERE 替换为有效域名:

1
nano receipts/https-load-balancer.yml

执行以下命令部署安全 HTTP 负载均衡器:

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

现在,将您使用的域名分配给负载均衡器 IP 地址(命令输出中代替 34.111.24.134 的地址)。

使用 dig 检查域名是否正确配置:

1
dig YOUR_DOMAIN_NAME

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; <<>> DiG 9.11.3-1ubuntu1.16-Ubuntu <<>> YOUR_DOMAIN_NAME
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12513
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;YOUR_DOMAIN_NAME.	IN	A

;; ANSWER SECTION:
YOUR_DOMAIN_NAME. 36 IN	A	34.111.24.134

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Fri Nov 19 13:00:00 EET 2021
;; MSG SIZE  rcvd: 74

分配后,等待 Google 托管证书完成预置。这可能需要长达 60 分钟。您可以使用以下命令检查证书状态:

1
kubectl describe managedcertificate managed-cert

如果您正确配置了域名记录,证书最终将完成预置。

配置完成后,您可使用域名访问 Web UI(通过 https)并通过 HTTP API 连接设备。

文档警告图标

注意:负载均衡器会将所有 HTTP 流量重定向到 HTTPS。不支持 HTTPS 的设备将无法连接 ThingsBoard。 如需支持此类设备,可单独部署 HTTP 传输负载均衡器(推荐), 或在 https-load-balancer.yml 文件中修改 redirectToHttps 设置以禁用重定向行为。

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 指南, 在 transport/tb-mqtt-transport.yml 文件中配置所需环境变量。

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

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

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

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

负载均衡器将转发以下端口的全部 UDP 流量:

  • 5683 - CoAP 服务器非安全端口
  • 5684 - CoAP 服务器安全 DTLS 端口

CoAP over DTLS

此类负载均衡器需要您自行准备和维护有效 SSL 证书。 请参阅通用 CoAP over DTLS 指南, 在 transport/tb-coap-transport.yml 文件中配置所需环境变量。

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

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

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

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

负载均衡器将转发以下端口的全部 UDP 流量:

  • 5685 - LwM2M 服务器非安全端口
  • 5686 - LwM2M 服务器安全 DTLS 端口
  • 5687 - LwM2M 引导服务器 DTLS 端口
  • 5688 - LwM2M 引导服务器安全 DTLS 端口

LwM2M over DTLS

此类负载均衡器需要您自行准备和维护有效 SSL 证书。 请参阅通用 LwM2M over DTLS 指南, 在 transport/tb-lwm2m-transport.yml 文件中配置所需环境变量。

9.5. 配置 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. 在现有 Google Cloud SQL (PostgreSQL) 实例中创建 Trendz 数据库

编辑 “trendz/trendz-secret.yml” ,将 YOUR_DB_IP_ADDRESS 和 YOUR_DB_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 等)。

后续步骤