一、项目环境说明
本教程基于Windows开发机 + Linux K8s虚拟机架构,实现CADS前后端项目容器化部署,适配企业级轻量化容器部署场景。
环境架构
开发环境:Windows
部署环境:Linux虚拟机(Kubernetes集群)
数据库:Windows宿主机 MySQL(192.168.86.1:3306)
容器技术:Docker、Nginx
编排工具:Kubernetes
项目结构
cads-backend:SpringBoot后端项目
cads-frontend:Vue/静态页面前端项目
二、部署前置准备(Windows端)
1. 环境依赖安装
提前安装并配置环境变量:JDK22、Maven3.6+、Node.js20+、Docker Desktop
2. 前端项目编译构建
进入前端项目目录,打包生成静态资源文件
cd C:\cad-system\cads\cads-frontend npm run build
作用:生成dist目录,包含编译完成的HTML、JS、CSS静态文件,为Nginx部署提供资源。
3. 后端项目Maven打包
进入后端项目目录,清理并打包Jar包
cd C:\cad-system\cads\cads-backend mvn clean package
作用:清理旧编译文件,编译生成可执行文件cads-backend-1.0.0.jar,用于后端容器镜像构建。
三、Docker镜像构建与推送(Windows端)
前后端均采用Docker容器化打包,构建标准化镜像,推送至镜像仓库供K8s集群拉取部署。
1. 后端镜像构建
(1)后端Dockerfile
路径:cads-backend/Dockerfile
FROM openjdk:22-jre-slim WORKDIR /app COPY cads-backend-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
(2)构建&推送命令
cd C:\cad-system\cads\cads-backend docker build -t 项目镜像仓库/cads:v1 . docker push 项目镜像仓库/cads:v1
2. 前端镜像构建(Nginx多阶段构建)
(1)前端Dockerfile
路径:cads-frontend/Dockerfile,采用多阶段构建,精简镜像体积
FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/templates/default.conf.template EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
(2)前端Nginx核心配置
路径:cads-frontend/nginx.conf,处理前端路由转发、后端API反向代理
server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; # 前端路由适配(解决SPA刷新404) location / { try_files $uri $uri/ /index.html; } # 后端API反向代理 location /cads/api/ { proxy_pass http://cads:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }(3)构建&推送命令
cd C:\cad-system\cads\cads-frontend docker build -t 项目镜像仓库/cads-frontend:v1 . docker push 项目镜像仓库/cads-frontend:v1
四、Kubernetes集群部署(Linux虚拟机端)
所有操作均在K8s集群节点执行,依次部署后端、前端服务,配置端口映射、数据库环境变量与网络策略。
1. 后端服务部署
(1)创建Deployment工作负载
kubectl create deployment cads --image=项目镜像仓库/cads:v1
(2)创建NodePort类型Service(外部访问)
kubectl expose deployment cads --type=NodePort --port=8080 --target-port=8080 --name=cads
(3)配置数据库连接环境变量
# 数据库连接地址、账号密码 kubectl set env deployment/cads SPRING_DATASOURCE_URL="jdbc:mysql://192.168.86.1:3306/cads_db?useSSL=false&allowPublicKeyRetrieval=true" kubectl set env deployment/cads SPRING_DATASOURCE_USERNAME=root kubectl set env deployment/cads SPRING_DATASOURCE_PASSWORD=123456
(4)解决宿主机数据库网络访问问题
开启Pod主机网络,规避Calico网络隔离导致的数据库连接超时、拒绝连接问题
kubectl patch deployment cads -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'2. 前端服务部署
(1)创建Deployment工作负载
kubectl create deployment cads-front --image=项目镜像仓库/cads-frontend:v1
(2)创建前端Service并修复端口映射
核心问题:容器监听端口与Service映射端口不匹配,需统一端口配置
# 创建基础Service kubectl expose deployment cads-front --type=NodePort --port=80 --target-port=80 --name=cads-front # 一键修复端口映射(适配容器监听端口) kubectl patch svc cads-front -p '{"spec":{"ports":[{"port":8080,"targetPort":80,"nodePort":32295}]}}'(3)重启前端服务生效配置
kubectl rollout restart deployment cads-front
五、服务验证与访问测试
1. 查看集群服务与Pod状态
# 查看所有Service端口 kubectl get svc # 查看Pod运行状态 kubectl get pods -o wide # 查看端点关联状态(验证端口映射) kubectl get endpoints
2. 本地访问地址
前端页面:
http://192.168.86.130:32295/后端API接口:
http://192.168.86.130:31617/cads/api/后端容器直连地址:
http://192.168.86.130:8080/cads/api/
3. 网络连通性测试
# 虚拟机内部测试 curl http://192.168.86.130:32295/ curl http://192.168.86.130:31617/cads/api/ # 端口连通性检测 nc -zv 192.168.86.130 32295
六、核心问题报错排查与解决方案
1. 数据库连接异常
报错信息:Communications link failure、Connection refused、Connect timed out
根因:K8s Calico网络隔离,Pod无法访问Windows宿主机MySQL服务
解决方案:开启Pod主机网络模式
kubectl patch deployment cads -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'2. Nginx代理异常(502/404)
报错信息:502 Bad Gateway、404 Not Found
根因:Nginx反向代理路径拼接错误、后端服务域名无法解析
解决方案:固定代理地址,修正Nginx配置
# 进入Pod修改配置并重启Nginx kubectl exec -it [前端Pod名称] -- sed -i 's|错误代理路径|proxy_pass http://cads:8080;|' /etc/nginx/conf.d/default.conf kubectl exec -it [前端Pod名称] -- nginx -s reload
3. Service端口映射不匹配
报错信息:Empty reply from server、Connection refused
根因:Service targetPort 与容器实际监听端口不一致
解决方案:通过patch命令一键修正端口映射
kubectl patch svc cads-front -p '{"spec":{"ports":[{"port":8080,"targetPort":80,"nodePort":32295}]}}'4. Pod CrashLoopBackOff崩溃重启
根因:数据库配置错误、端口冲突、配置文件异常
排错方案:优先查看日志定位问题,修复后重启服务
# 查看Pod运行日志 kubectl logs [Pod名称] --tail=100 # 重启工作负载 kubectl rollout restart deployment cads kubectl rollout restart deployment cads-front
5. Docker镜像构建报错
报错信息:invalid reference format、no such file or directory
根因:镜像标签含非法字符、Dockerfile路径错误
解决方案:使用简洁合法镜像标签,确保构建目录存在Dockerfile
6. 网络代理超时错误
根因:Linux虚拟机残留无效代理配置,阻断网络请求
解决方案:清空所有代理环境变量
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY unset all_proxy ALL_PROXY no_proxy NO_PROXY
七、K8s常用排查命令汇总
# 查看资源状态 kubectl get pods -o wide kubectl get svc kubectl get all # 查看详细报错信息 kubectl describe pod [Pod名称] kubectl describe deployment [部署名称] # 日志排查 kubectl logs [Pod名称] --tail=100 kubectl logs [Pod名称] --previous # 进入Pod内部调试 kubectl exec -it [Pod名称] -- bash # 重启/更新服务 kubectl rollout restart deployment [部署名称] kubectl set image deployment/[部署名称] [容器名]=[新镜像地址]
八、项目部署经验总结
网络优先级最高:容器访问宿主机服务优先开启
hostNetwork,规避集群网络隔离问题,本项目80%连接报错均由网络隔离导致。端口必须双向统一:容器监听端口、Service targetPort、NodePort 三者必须匹配,是外部访问服务的核心关键。
Nginx配置标准化:前端SPA项目必须配置
try_files解决刷新404问题,API代理禁止随意拼接后缀,避免路径404/502报错。排错优先看日志:Pod崩溃、服务访问异常,优先通过
kubectl logs定位根源,而非盲目重启服务。镜像轻量化:前端采用多阶段构建,分离编译环境与运行环境,大幅缩减镜像体积,提升部署效率。