CADS系统 Docker+K8s 完整部署实战教程

CADS系统 Docker+K8s 完整部署实战教程 一、项目环境说明本教程基于Windows开发机 Linux K8s虚拟机架构实现CADS前后端项目容器化部署适配企业级轻量化容器部署场景。环境架构开发环境Windows部署环境Linux虚拟机Kubernetes集群数据库Windows宿主机 MySQL192.168.86.1:3306容器技术Docker、Nginx编排工具Kubernetes项目结构cads-backendSpringBoot后端项目cads-frontendVue/静态页面前端项目二、部署前置准备Windows端1. 环境依赖安装提前安装并配置环境变量JDK22、Maven3.6、Node.js20、Docker Desktop2. 前端项目编译构建进入前端项目目录打包生成静态资源文件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/DockerfileFROM 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:v12. 前端镜像构建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 --frombuild /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:v12创建NodePort类型Service外部访问kubectl expose deployment cads --typeNodePort --port8080 --target-port8080 --namecads3配置数据库连接环境变量# 数据库连接地址、账号密码 kubectl set env deployment/cads SPRING_DATASOURCE_URLjdbc:mysql://192.168.86.1:3306/cads_db?useSSLfalseallowPublicKeyRetrievaltrue kubectl set env deployment/cads SPRING_DATASOURCE_USERNAMEroot kubectl set env deployment/cads SPRING_DATASOURCE_PASSWORD1234564解决宿主机数据库网络访问问题开启Pod主机网络规避Calico网络隔离导致的数据库连接超时、拒绝连接问题kubectl patch deployment cads -p {spec:{template:{spec:{hostNetwork:true}}}}2. 前端服务部署1创建Deployment工作负载kubectl create deployment cads-front --image项目镜像仓库/cads-frontend:v12创建前端Service并修复端口映射核心问题容器监听端口与Service映射端口不匹配需统一端口配置# 创建基础Service kubectl expose deployment cads-front --typeNodePort --port80 --target-port80 --namecads-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 endpoints2. 本地访问地址前端页面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 reload3. 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名称] --tail100 ​ # 重启工作负载 kubectl rollout restart deployment cads kubectl rollout restart deployment cads-front5. Docker镜像构建报错报错信息invalid reference format、no such file or directory根因镜像标签含非法字符、Dockerfile路径错误解决方案使用简洁合法镜像标签确保构建目录存在Dockerfile6. 网络代理超时错误根因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名称] --tail100 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定位根源而非盲目重启服务。镜像轻量化前端采用多阶段构建分离编译环境与运行环境大幅缩减镜像体积提升部署效率。