从 Docker Compose 到 Kubernetes:物联网管理系统迁移实战

从 Docker Compose 到 Kubernetes:物联网管理系统迁移实战

本文记录一次真实的迁移实验过程,包含踩过的坑、解决的思路、以及复盘思考。适合正在学习 K8S 并希望理解"为什么"的读者。


一、背景与目标

为什么做这次迁移?

物联网管理系统原采用 Docker Compose 部署,结构简单:前端 Nginx + 后端 Spring Boot + MySQL。但单机部署存在单点故障、无法扩缩容、发布需停服等问题。

Kubernetes 正是为了解决这些问题而生。本次实验目标:将这套系统迁移到 K8S 集群,体验从"单机编排"到"集群调度"的转变。


二、环境准备

2.1 资源规划

角色 主机名 IP 地址
Master master 192.168.116.168
Node1 node1 192.168.116.169
Node2 node2 192.168.116.170

2.2 软件版本

  • 操作系统:CentOS 7.9

  • Docker:20.10.24

  • Kubernetes:v1.20.15(kubeadm + kubelet + kubectl)

  • 网络插件:Flannel

2.3 系统配置(所有节点)

关闭 SELinux、防火墙、Swap,配置主机名和 hosts 文件。

为什么不展开写? 这些是标准操作,网上一搜一大把,本文重点放在"卡住的地方"。有需要我后面可发出来


三、目录结构

复制代码
/root/k8s-experiment/
├── iot-1.0.0.jar              # 后端 JAR
├── iot.sql                    # 数据库 SQL
├── iot-manage-front/          # 前端静态文件
├── iot-project/               # 镜像构建目录
│   ├── backend/Dockerfile
│   ├── frontend/Dockerfile
│   ├── frontend/nginx.conf
│   └── database/Dockerfile
└── k8s/                       # K8S 部署文件
    ├── iot-backend-deploy.yaml
    ├── iot-database-deploy.yaml
    └── iot-frontend-deploy.yaml

四、核心挑战与解决方案

🔥 挑战 1:虚拟机无法拉取基础镜像

现象docker pull 始终超时,即使配置了国内镜像加速器。

原因:实验环境虚拟机完全无法访问外网(公司网络 + 网关双重限制)。

解决方案:离线导入

  • 在 Windows 上拉取镜像 → docker save 导出 .tar → 上传到 master → docker load 导入

复盘:网络隔离环境下,跳板机拉取 + 离线包传输是标准方案。


🔥 挑战 2:openjdk:11-jre-slim 镜像已废弃

现象not found

原因:OpenJDK 官方镜像已迁移到 Eclipse Temurin。

解决方案 :改用 eclipse-temurin:11-jre


🔥 挑战 3:kubeadm init 失败,kubelet 无法启动

现象

执行 kubeadm init 后卡住,最终报错:

复制代码
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed
kubelet isn't running or healthy
timed out waiting for the condition

查看 kubelet 状态:

复制代码
systemctl status kubelet

查看详细日志:

复制代码
journalctl -xeu kubelet -n 50

关键错误信息:

复制代码
no such file or directory: /var/run/dockershim.sock
transport: Error while dialing dial unix /var/run/dockershim.sock

检查 Docker socket 是否存在:

复制代码
ls -la /var/run/*.sock

输出显示只有 /var/run/docker.sock,没有 dockershim.sock

确认版本:

复制代码
kubelet --version   # Kubernetes v1.22.4
docker --version    # Docker version 20.10.24

原因

Kubernetes v1.22 正式移除了内置的 dockershim 组件。实验手册的配置方式(通过 /var/run/dockershim.sock 连接 Docker)在该版本中已失效。

解决方案

降级到最后一个原生支持 dockershim 的版本 v1.20.15:

复制代码
# 清理失败状态
kubeadm reset -f
# 卸载 1.22
yum remove -y kubelet-1.22.4 kubeadm-1.22.4 kubectl-1.22.4
# 安装 1.20.15
yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
# 锁定版本
yum versionlock kubelet kubeadm kubectl
# 重启服务
systemctl restart docker kubelet
#重新初始化
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

验证

复盘

K8S v1.22 已移除 dockershim,实验手册的版本要求与实际配置存在偏差。降级到 v1.20.15 可保持与手册一致。遇到类似问题,建议先确认 Kubernetes 与容器运行时的版本兼容性矩阵。

🔥 挑战 4:Pod 镜像拉取失败与存储卷问题

现象

原因

  1. ImagePullBackOff / ErrImagePull:镜像只存在于 master 节点,Pod 被调度到 node2,K8S 无法跨节点拉取

  2. Pending:数据库 Pod 使用了 PVC,但集群中没有匹配的 PV

解决过程

复制代码
# 步骤1:将镜像分发到 node2
docker save iot-backend:1.0 -o iot-backend.tar
docker save iot-database:1.0 -o iot-database.tar
docker save iot-frontend:1.0 -o iot-frontend.tar
scp *.tar root@192.168.116.170:/root/
ssh root@192.168.116.170 "docker load -i /root/iot-backend.tar && docker load -i /root/iot-database.tar && docker load -i /root/iot-frontend.tar"
# 步骤2:创建 PV 解决数据库存储问题
ssh root@192.168.116.170 "mkdir -p /data/mysql"
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/mysql
EOF

# 步骤3:删除旧 Pod 触发重建
kubectl delete pod --all

结果:成功访问前端页面

复盘

  1. K8S 集群中每个 worker 节点都需要有镜像,离线环境需手动分发

  2. Deployment 使用 PVC 前必须确保 PV 存在,否则 Pod 无法调度

  3. 三个问题相互独立但同时出现,解决顺序:先分发镜像 → 再创建 PV → 重建 Pod

今日进度:集群搭建完成,后端和前端服务已成功运行,数据库存储问题正在排查中。

本实验从零开始,所有操作均为本人手搓。由于环境(CentOS 7.9 + 内网隔离)和手册版本偏差,踩了不少坑。文中记录的每一个错误、每一行命令,都是真实复现而非预演。

如果觉得内容对你有帮助,欢迎 点赞 + 关注,你的支持是我持续输出的动力。有任何问题或更好的思路,也请在评论区指正交流

相关推荐
武子康1 小时前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
大鱼>3 天前
大语言模型+物联网:LLM理解物理世界
物联网·struts·语言模型·多模态·aiot
果丁智能3 天前
物联网智能锁赋能集中式住宿:身份核验与远程权限管控的全链路技术实践
大数据·人工智能·物联网·智能家居
国产化创客3 天前
ESP32 CameraWebServer 原生摄像头项目全解析
物联网·开源·嵌入式·实时音视频·智能硬件
谁似人间西林客3 天前
数据智能怎么赋能工业制造?物联网场景落地方法解析
物联网·制造
InHand云飞小白3 天前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器
2601_961875243 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
MetrixAeroCore3 天前
Metrix 国际物联网卡资费方案|多场景共享流量池·按需扩容
物联网
java_cj3 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes