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

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

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

前置条件

安装并配置工具

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

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

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

1
gcloud init

启用 GCP 服务

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

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

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

1
2
git clone -b release-4.3.0.1 https://github.com/thingsboard/thingsboard-ce-k8s.git
cd thingsboard-ce-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-ce-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-ce-msa 是您的集群名称。您可输入其他名称。我们将在本指南后续使用 $TB_CLUSTER_NAME 引用;
  • tb-db 是您的数据库服务器名称。您可输入其他名称。我们将在本指南后续使用 $TB_DATABASE_NAME 引用;

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

在 3 个可用区内创建分布式的区域集群,使用您偏好的机器类型。 以下示例在每个可用区预置 1e2-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 的 context

使用以下命令更新 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. 安装

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

1
nano tb-node-db-configmap.yml

执行以下命令运行安装:

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

其中:

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

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

1
Installation finished successfully!

步骤 7. 启动

执行以下命令部署第三方组件(zookeeper、kafka、redis)和主要 ThingsBoard 微服务:tb-nodetb-web-uijs-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

步骤 8. 配置负载均衡器

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

8.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 文件中配置所需环境变量。

8.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 文件中配置所需环境变量。

8.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 文件中配置所需环境变量。

8.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 设为该地址。

步骤 9. 使用

现在您可以在浏览器中使用负载均衡器的 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

升级

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

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 等)。

下一步