- 前置条件
- 步骤 1. 克隆 ThingsBoard CE K8S 脚本仓库
- 步骤 2. 定义环境变量
- 步骤 3. 配置并创建 GKE 集群
- 步骤 4. 更新 kubectl 的 context
- 步骤 5. 配置数据库
- 步骤 6. 安装
- 步骤 7. 启动
- 步骤 8. 配置负载均衡器
- 步骤 9. 使用
- 升级
- 下一步
本指南将帮助您在 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
步骤 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 个可用区内创建分布式的区域集群,使用您偏好的机器类型。
以下示例在每个可用区预置 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 的 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_ADDRESS 和 YOUR_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-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
步骤 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 连接设备。
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
您应该看到类似的输出:

要通过 MQTT 或 COAP 连接集群,需要获取对应的服务,可使用以下命令:
1
kubectl get service
您应该看到类似的输出:

有两个负载均衡器:
- 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 等)。