阿里云实战 K8s 部署 ThingsBoard 集群
正文与配图来自原稿。用两台(可更多)阿里云 ECS 搭 kubeadm 集群,再跑官方 CE K8s 脚本。按量付费适合练手,用完释放;生产请改用云盘 CSI、托管 ACK、较新 K8s/TB 版本。
1、概述
本地虚拟机资源不够时,可租阿里云 ECS(按小时),连贯时间做完再释放。本稿记录一次跑通的流程。
2、环境准备(ECS)
统一 CentOS 7.8 示例。
- 登录阿里云 → 云服务器 ECS → 创建实例


- 按量付费;选地域、默认网络



- 规格:讲课演示约 4 核 + 较大内存;生产 CPU/内存要按规模加

- 镜像 CentOS、系统盘约 40G(生产不够再加大)


- 带宽按量、安全组、密码;购买 ≥2 台(1 master + 1 node)




下单需账户有余额(原稿提示余额需足够);生成实例后用 Xshell 等连接。

3、集群规划
| 角色 | 数量 | 说明 |
|---|---|---|
| master | 1 | 控制面 |
| node | ≥1 | 工作节点,可继续加 |

下文命令标注:主节点 / 工作节点 / 全部节点。
4、Kubeadm 多节点集群
原稿版本:kubeadm / kubelet / kubectl 1.19.0 + Docker 20.10.x。新环境请自行评估版本兼容性。
4.1、安装 Docker(全部节点)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum -y install docker-ce-20.10.10-3.el7
docker -v
systemctl enable docker.service
systemctl start docker
systemctl status docker4.2、Kubernetes yum 源(全部节点)
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF4.3、安装组件(全部节点)
yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.04.4、主节点 init
将 --apiserver-advertise-address 换成 master 内网 IP:
kubeadm init \
--apiserver-advertise-address=<MASTER_内网IP> \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
记下输出中的 kubeadm join ...。
4.5、主节点 kubeconfig
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config4.6、工作节点 join
在每台 node 执行 init 给出的 join(token / hash 以你环境为准)。
4.7~4.8、网络插件
kubectl get nodes # 未装 CNI 前多为 NotReady
# 推荐
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 或本地保存 kube-flannel.yml 再 apply(原稿含完整 YAML)
4.9~4.10、确认就绪
kubectl get node
kubectl get pods -n kube-system全部 Running 后再装 ThingsBoard:

5、部署 ThingsBoard
5.1、准备三类 PV(hostPath 实验用法)
在 master 上准备并 apply:
thingsboard-db-pv.yml— postgres、cassandra-0/1/2thingsboard-third-pv.yml— zookeeper / kafka 等thingsboard-tb-pv.yml— tb-node、各 transport 日志
要点:claimRef 与脚本里 PVC 名一致;Cassandra 多副本用 -cassandra-0 等后缀。YAML 篇幅长,结构与 Minikube 不推荐篇 同类,按原稿三份文件准备即可。

kubectl apply -f thingsboard-db-pv.yml
kubectl apply -f thingsboard-third-pv.yml
kubectl apply -f thingsboard-tb-pv.yml
kubectl get pv
5.2、拉取脚本
GitHub 慢可同步到 Gitee 再克隆:
git clone -b release-3.4.4 https://github.com/thingsboard/thingsboard-ce-k8s.git
cd thingsboard-ce-k8s/minikube

5.3、改 .env
postgres 或 hybrid;hybrid 时 CASSANDRA_REPLICATION_FACTOR ≤ Cassandra 副本数。


5.4、按序执行脚本
./k8s-install-tb.sh --loadDemo # 完成后再往下
./k8s-deploy-thirdparty.sh
./k8s-deploy-resources.sh若 routes.yml 报 Ingress networking.k8s.io/v1 不识别:原稿在 1.19 上可消失;更旧 API 需改 Ingress 版本或跳过改 NodePort。
kubectl get pods
kubectl get deployment,pod,svc

6、暴露外网访问
集群内 ClusterIP 外网不可达,改为 NodePort:
kubectl edit svc tb-web-ui # type: NodePort
kubectl edit svc tb-node
kubectl get deployment,pod,svc


在阿里云安全组放行对应 NodePort(以及需要的 MQTT 端口):

7、验证
http://<ECS公网IP>:<tb-web-ui-NodePort>/login


8、小结与注意
| 项 | 建议 |
|---|---|
| 费用 | 按量 ECS 练完即释放 |
| 存储 | hostPath 仅实验;生产用云盘 StorageClass |
| 版本 | 原稿 1.19 + TB 3.4.4;新项目跟官方 ACK / 新脚本 |
| 入口 | NodePort 简单;长期用 Ingress / SLB |
同仓库脚本在 Minikube 上的旧踩坑见 Minikube 不推荐篇;较新单机 K8s 体验见 Ubuntu 24.04 Minikube。
