实验整体思路
从 Docker Compose 单机部署迁移到 Kubernetes 集群部署,核心是理解两套编排体系的差异。
实验步骤回顾
第一阶段:环境准备
| 步骤 | 做了什么 | 为什么 |
|---|---|---|
| 1 | 准备三台 CentOS 7.9 虚拟机 | 搭建集群需要至少一个 master 和一个 node |
| 2 | 关闭防火墙、SELinux、Swap | K8S 的硬性要求,否则初始化会报错 |
| 3 | 安装 Docker 20.10.24 | 容器运行时 |
| 4 | 安装 kubeadm、kubelet、kubectl 1.20.15 | K8S 管理工具(最终降级到这个版本) |
关键决策:K8S 1.22 已移除 dockershim,无法直接使用 Docker,所以降级到 1.20.15。
第二阶段:镜像准备
| 步骤 | 做了什么 | 为什么 |
|---|---|---|
| 5 | 编写 Dockerfile(后端、数据库、前端) | 将应用打包成容器镜像 |
| 6 | 在 Windows 拉取基础镜像 | 虚拟机无法访问外网 |
| 7 | 上传到 master 并导入 Docker | 离线环境的标准做法 |
关键发现 :openjdk:11-jre-slim 已废弃,改用 eclipse-temurin:11-jre。
第三阶段:集群搭建
| 步骤 | 做了什么 | 为什么 |
|---|---|---|
| 8 | kubeadm init 初始化 master |
创建控制平面 |
| 9 | 安装 Flannel 网络插件 | 跨节点 Pod 通信需要 CNI |
| 10 | kubeadm join 将 node2 加入集群 |
扩展集群工作节点 |
卡点:node1 始终无法正常加入,最后改用 master + node2 继续实验。
第四阶段:应用部署
| 步骤 | 做了什么 | 为什么 |
|---|---|---|
| 11 | 将镜像分发到 node2 | 每个节点都需要有镜像才能运行 Pod |
| 12 | 创建 PV 解决存储问题 | 数据库需要持久化存储 |
| 13 | 手动建表 | MySQL 初始化脚本没自动执行 |
| 14 | 修改前端配置 + 换端口解决缓存 | 浏览器缓存无法清除时的绕过方法 |
第五阶段:验证
| 步骤 | 做了什么 |
|---|---|
| 15 | 浏览器访问 http://192.168.116.168:30081 |
| 16 | 设备增删改查功能全部正常 |
架构变化对比
| 对比项 | Docker Compose | Kubernetes |
|---|---|---|
| 部署单位 | docker-compose.yml | Deployment + Service + PVC |
| 服务发现 | 固定 IP 或容器名 | Service + DNS |
| 存储 | 宿主机 Volume | PV + PVC |
| 暴露服务 | 宿主机端口映射 | NodePort / Ingress |
| 扩容 | 手动改配置重启 | kubectl scale |
| 更新 | 停服重启 | 滚动更新 |
核心问题汇总
| 问题 | 原因 | 解决方案 |
|---|---|---|
| kubeadm init 失败 | K8S 1.22 移除了 dockershim | 降级到 1.20.15 |
| 镜像拉取超时 | 虚拟机无法访问外网 | Windows 拉取 + 离线导入 |
| openjdk 找不到 | 镜像已废弃 | 改用 eclipse-temurin |
| 镜像拉不到 node2 | 镜像只在 master | 手动分发到 node2 |
| 数据库 Pod Pending | 没有 PV | 创建 hostPath PV |
| device 表不存在 | SQL 脚本没自动执行 | 手动建表 |
| 前端调不到后端 | 浏览器缓存 config.js | 换 NodePort 端口 |