- Prerequisites
- Step 1. Clone ThingsBoard PE K8S scripts repository
- Step 2. Define environment variables
- Step 3. Configure and create GKE cluster
- Step 4. Update the context of kubectl
- Step 5. Provision Databases
- Step 6. Configure license key
- Step 7. Installation
- Step 8. Starting
- Step 9. Configure Load Balancers
- Step 10. Using
- Upgrading
- Next steps
This guide will help you to set up ThingsBoard in monolith mode using Google Kubernetes Engine.
Prerequisites
工具安装
在GKE集群上部署ThingsBoard需要安装kubectl
,
gcloud
请参阅开始指南文档。
创建新项目或选择现有项目。
执行以下命令:
1
gcloud init
启用GCP服务
执行以下命令为项目启用GKE和SQL服务:
1
gcloud services enable container.googleapis.com sql-component.googleapis.com sqladmin.googleapis.com
Pull ThingsBoard PE images from docker hub
Run the following commands to verify that you can pull the images from the Docker hub.
1
2
docker pull thingsboard/tb-pe-node:3.5.1PE
docker pull thingsboard/tb-pe-web-report:3.5.1PE
Step 1. Clone ThingsBoard PE K8S scripts repository
Clone the repository and change the working directory to GCP scripts.
1
2
git clone -b release-3.5.1 https://github.com/thingsboard/thingsboard-pe-k8s.git
cd thingsboard-pe-k8s/gcp/monolith
Step 2. Define environment variables
定义将在本指南后面的各种命令中使用的环境变量。
执行以下命令:
1
2
3
4
5
6
7
export GCP_PROJECT=$(gcloud config get-value project)
export GCP_REGION=us-central1
export GCP_ZONE=us-central1-a
export GCP_NETWORK=default
export TB_CLUSTER_NAME=tb-pe
export TB_DATABASE_NAME=tb-db
echo "You have selected project: $GCP_PROJECT, region: $GCP_REGION, network: $GCP_NETWORK zone: $GCP_ZONE, cluster: $TB_CLUSTER_NAME and database: $TB_DATABASE_NAME"
说明:
- 获取项目ID名称为GCP_PROJECT;
- us-central1表示计算区域变量名为GCP_REGION;
- us-central1-a表示计算区域变量名为GCP_ZONE;
- default表示默认网络变量名为GCP_NETWORK;
- tb-ce表示集群名称变量名为$TB_CLUSTER_NAME;
- tb-db表示数据库服务名称变量名为TB_DATABASE_NAME;
Step 3. Configure and create GKE cluster
创建具有1个e2-standard-4计算机类型的节点的区域群集。
执行以下命令(推荐):
1
2
3
4
5
6
7
8
9
gcloud container clusters create $TB_CLUSTER_NAME \
--release-channel stable \
--zone $GCP_ZONE \
--node-locations $GCP_ZONE \
--network=$GCP_NETWORK \
--enable-ip-alias \
--num-nodes=1 \
--node-labels=role=main \
--machine-type=e2-standard-4
或者可以使用本指南进行自定义群集设置。
Step 4. Update the context of kubectl
执行以下命令更新kubectl:
1
gcloud container clusters get-credentials $TB_CLUSTER_NAME --zone $GCP_ZONE
Step 5. Provision Databases
Step 5.1 Google Cloud SQL (PostgreSQL) Instance
5.1 先决条件
启用网络服务并允许K8S集群连接到数据库实例:
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 12“和以下说明创建PostgreSQL实例:
- K8S集群GCP_REGION同一区域;
- K8S集群GCP_REGION同一网络;
- 专网IP地址连接到实例并禁用公有IP地址;
- 高可用数据库实例用于生产,单一实例用于开发;
- 最低配置2颗CPU和7.5GB内存满足多数要求,如果需要你可以在后面进行修改;
执行以下命令:
1
2
3
4
5
6
gcloud beta sql instances create $TB_DATABASE_NAME \
--database-version=POSTGRES_12 \
--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/thingsboard-db].
NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS
tb-db POSTGRES_12 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
说明:
- thingsboard是数据库的名称你可以输入其他名称变量名为YOUR_DB_NAME;
- secret是数据库密码变量名为YOUR_DB_PASSWORD;
5.4 创建数据库
在postgres数据库服务器实例中创建“thingsboard”数据库:
1
gcloud sql databases create thingsboard --instance=$TB_DATABASE_NAME
Step 5.2 Cassandra (optional)
如果计划每秒插入超过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
创建命名空间:
1
2
kubectl apply -f tb-namespace.yml
kubectl config set-context $(kubectl config current-context) --namespace=thingsboard
部署到新的节点组:
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' \
};\""
Step 6. Configure license key
We assume you have already chosen your subscription plan or decided to purchase a perpetual license. If not, please navigate to pricing page to select the best license option for your case and get your license. See How-to get pay-as-you-go subscription or How-to get perpetual license for more details.
Create docker secret with your license key:
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
Step 7. Installation
编辑”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!
Step 8. Starting
执行以下命令部署资源:
1
./k8s-deploy-resources.sh
几分钟后使用kubectl get pods
查看tb-node-0
状态是否是READY
。
Step 9. Configure Load Balancers
9.1 Configure HTTP(S) Load Balancer
有2种基础配置选项设置HTTP(S)负载均衡访问ThingsBoard实例Web界面:
- http - 推荐用于开发优点是配置简单,成本最低,不适合生产。
- https - 推荐用于生产优点是配置简单,流量重定向至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)访问HTTP Web UI(端口80)并通过HTTP API连接到设备使用以下默认凭据:
- System Administrator: sysadmin@thingsboard.org / sysadmin
- Tenant Administrator: tenant@thingsboard.org / tenant
- Customer User: 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
执行以下命令以部署https负载均衡:
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连接设备。
Transparent Load Balancer
This type of the load balancer requires you to provision and maintain valid SSL certificate on your own. Follow the generic HTTP over SSL guide to configure required environment variables in the tb-node.yml file.
Afterwards, setup TCP load balancer to forward traffic from 443 port to corresponding services port 8080. This version of setup does not support an automatic redirect of http port 80 to https port 443.
1
kubectl apply -f receipts/transparent-http-load-balancer.yml.yml
9.2. Configure MQTT Load Balancer (Optional)
如果使用MQTT协议连接设备请配置MQTT负载均衡。
执行以下命令以部署TCP负载均衡:
1
kubectl apply -f receipts/mqtt-load-balancer.yml
负载均衡将转发端口1883和8883的所有TCP流量。
MQTT SSL
这种类型的负载均衡要求自行配置和维护有效的SSL证书遵循基于SSL的通用MQTT指南在tb-node.yml文件中配置所需的环境变量。
9.3. Configure UDP Load Balancer (Optional)
如果使用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 DTLS
这种类型的负载均衡要求自行预置和维护有效的SSL证书遵循基于DTLS的通用CoAP指南在tb-node.yml文件中配置所需的环境变量。
LwM2M DTLS
这种类型的负载均衡要求自行预置和维护有效的SSL证书遵循基于DTLS的通用CoAP指南在tb-node.yml文件中配置所需的环境变量。
Step 10. Using
现在可以使用负载均衡的IP地址在浏览器中打开ThingsBoard Web界面。
使用以下命令查看HTTP负载均衡的DNS名称(ADDRESS
列):
1
kubectl get ingress
你应该看到类似的图片:
通过MQTT或COAP连接到集群需要获取相应的服务使用以下命令来完成:
1
kubectl get service
你应该看到类似的图片:
有两个负载均衡器
- tb-mqtt-loadbalancer-external - MQTT协议
- tb-coap-loadbalancer-external - COAP协议
使用EXTERNAL-IP
字段连接到集群的负载均衡。
使用以下默认凭据:
- System Administrator: sysadmin@thingsboard.org / sysadmin
如果使用演示数据(使用--loadDemo
标志)安装了数据库则还可以使用以下凭据:
- Tenant Administrator: tenant@thingsboard.org / tenant
- Customer User: customer@thingsboard.org / customer
如果出现任何问题可以检查服务日志中的错误,例如要查看ThingsBoard节点日志请执行以下命令:
1
kubectl logs -f tb-node-0
kubectl get pods
查看Pod的状态。
kubectl get services
查看所有服务的状态。
kubectl get deployments
查看所有部署的状态。
有关详细信息请参阅kubectl清单命令参考。
执行以下命令删除所有Pod:
1
./k8s-delete-resources.sh
执行以下命令删除所有pod和配置映射:
1
./k8s-delete-all.sh
Upgrading
如果需要升级数据库请执行以下命令:
1
2
3
./k8s-delete-resources.sh
./k8s-upgrade-tb.sh --fromVersion=[FROM_VERSION]
./k8s-deploy-resources.sh
说明:
FROM_VERSION
- 从哪个版本开始升级有关有效值请参阅升级说明。
Next steps
-
入门指南 - 快速学习ThingsBoard相关功能。
-
连接设备 - 学习如何根据你的连接方式或解决方案连接设备。
-
可 视 化 - 学习如何配置复杂的ThingsBoard仪表板说明。
-
数据处理 - 学习如何使用ThingsBoard规则引擎。
-
数据分析 - 学习如何使用规则引擎执行基本的分析任务。
-
硬件样品 - 学习如何将各种硬件平台连接到ThingsBoard。
-
高级功能 - 学习高级ThingsBoard功能。
-
开发指南 - 学习ThingsBoard中的贡献和开发。