资讯动态

阿里云K8s部署Vue2+SpringBoot2.5+Nacos2.0.3微服务实战

发布时间:2026/10/8 23:53:18 来源:尧图企业网站定制
简介这份资源面向需要在阿里云Kubernetes集群上落地前后端分离项目的开发与运维人员围绕Vue2前端、Nginx、SpringBoot2.5与Nacos2.0.3的完整部署链路提供可直接参考的编排方案适合已具备一定容器与K8s基础、希望打通微服务注册配置中心与前端静态资源发布的中高级读者。压缩包共16个文件约34.69MB以8个yaml编排文件为核心配合2个sh部署脚本、2个Dockerfile、1个SQL初始化脚本、1个Nginx配置文件以及jar与gz等构建产物覆盖从镜像构建到服务暴露的主要环节。资源中既有前端demo的部署清单也包含Nacos的StatefulSet、Service、Headless、Ingress与MySQL配置等模块可帮助读者理解有状态服务在K8s中的组织方式。目前已有1340人学习下载可作为搭建微服务部署环境的实践参考。1. 阿里云 K8s 上跑 Vue2 Nginx SpringBoot2.5 Nacos2.0.3一套能落地的微服务前后端部署方案手里有一套 Vue2 老前端、一个 SpringBoot2.5 的后端、注册中心用 Nacos2.0.3现在要把它们整体搬到阿里云 K8s 上——这是很多中小团队在 2024 到 2025 年都在做的迁移动作。难点不在单个组件会不会用而在于四者拼在一起时Nginx 怎么反代前端静态资源和后端 API、SpringBoot 怎么通过 K8s Service 找到 Nacos、Nacos2.0.3 的 gRPC 端口在 K8s 里怎么暴露、镜像怎么构建才不臃肿。这篇笔记按「先讲清选型理由再给可复制的 YAML 和命令」的节奏走适合已经会 Docker、想上 K8s 但被多组件联调卡住的工程师也适合刚接触 k8s 学习、想拿一套真实项目练手的人。全程基于阿里云 ACK 集群本地用 kubectl 操作。2. 部署前必须想清楚的四个选型为什么是这套组合2.1 为什么前端用 Nginx 而不是 Node 直接跑Vue2 打包后就是一堆静态文件用 Node 起服务在生产环境是浪费——内存占用高、并发不如 Nginx、还得额外处理进程守护。常见做法是npm run build出dist目录塞进 Nginx 镜像里由 Nginx 负责静态资源分发和/api反向代理。这样前端容器镜像可以做到 50MB 以内启动秒级。Nginx 的location工作流机制这里要理解清楚请求进来先匹配location/api/走proxy_pass转发到后端 Service其余走try_files回退到index.html这是 Vue2 的 history 路由模式必须配的否则刷新页面直接 404。很多人第一次部署 Vue2 到 K8s 就栽在这一步。2.2 SpringBoot2.5 为什么选 Nacos2.0.3 做注册中心SpringBoot2.5 对应 Spring Cloud 2020.0.x 版本线Nacos2.0.3 是这条线上兼容性最稳的版本之一。Nacos2.0 相比 1.x 最大的变化是引入了 gRPC 通信客户端和服务端之间除了 8848 的 HTTP 端口还需要 9848客户端 gRPC和 9849服务端 gRPC两个端口。这一点在 K8s 里部署时是血泪经验——只暴露 8848服务注册能成功但心跳会断表现为服务列表里实例时有时无。选 Nacos 而不是 Eureka 的理由很直接Eureka 2.x 已经停止维护Nacos 同时提供注册中心和配置中心一套组件解决两个问题在 K8s 里少维护一个 StatefulSet。2.3 阿里云 ACK 集群的节点规划不用一上来就搞多可用区高可用练手或中小项目用 3 节点即可2 个 4C8G 跑业务 Pod1 个 2C4G 跑 Nacos 和 Nginx。阿里云 ACK 托管版免去了自己装 k8s 的麻烦k8s 和 docker 的区别在这里体现得很明显——docker 只管单机容器k8s 负责跨节点的调度、服务发现、滚动更新Nacos 这种有状态服务在 K8s 里要用 StatefulSet 而不是 Deployment。2.4 镜像仓库用阿里云 ACR 而不是 Docker Hub阿里云服务器拉 Docker Hub 镜像经常超时用 ACR容器镜像服务个人版免费推送拉取都在内网速度快且稳定。构建镜像时 Maven 配置阿里云仓库也能大幅提速后面构建章节会给出具体配置。3. 从零构建三个镜像Vue2、SpringBoot2.5、Nacos2.0.33.1 Vue2 前端镜像多阶段构建 Nginx 配置先看 Nginx 配置文件这是整个前端部署的核心# nginx.conf server { listen 80; server_name localhost; # Vue2 静态资源 location / { root /usr/share/nginx/html; index index.html; # history 路由模式必须加否则刷新 404 try_files $uri $uri/ /index.html; } # 后端 API 反向代理指向 K8s 里的 Service 名 location /api/ { proxy_pass http://springboot-svc: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; # 超时设置避免后端慢查询导致 504 proxy_read_timeout 60s; } }proxy_pass后面的springboot-svc是 K8s Service 名K8s 内置 DNS 会解析成 ClusterIP不需要写 IP。location /api/末尾的斜杠和proxy_pass末尾的斜杠要对应否则路径会拼接错误——这是 nginx 反向代理最常见的翻车点。Dockerfile 用多阶段构建# 阶段一构建 FROM node:14-alpine AS builder WORKDIR /app COPY package*.json ./ # 用淘宝源加速阿里云环境也可用 npmmirror RUN npm config set registry https://registry.npmmirror.com npm install COPY . . RUN npm run build # 阶段二运行 FROM nginx:1.21-alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD [nginx, -g, daemon off;]构建命令docker build -t registry.cn-hangzhou.aliyuncs.com/your-ns/vue2-web:v1 . docker push registry.cn-hangzhou.aliyuncs.com/your-ns/vue2-web:v1参数说明node:14-alpine对应 Vue2 项目常见的 Node 版本如果项目用了vue-offic之类的老依赖Node 版本不要超过 16否则 node-sass 编译会失败。nginx:1.21-alpine体积小挂载conf.d时注意 alpine 版路径是/etc/nginx/conf.d/和标准版一致但如果你从别处拷配置注意别拷成/etc/nginx/nginx.conf覆盖主配置。3.2 SpringBoot2.5 后端镜像分层构建减小体积SpringBoot 的 Dockerfile 用分层解压的方式把依赖和业务代码分开改代码时只重传业务层FROM openjdk:8-jre-alpine WORKDIR /app # 先拷 jar用 layertools 分层 COPY target/app.jar app.jar RUN java -Djarmodelayertools -jar app.jar extract FROM openjdk:8-jre-alpine WORKDIR /app COPY --from0 /app/dependencies/ ./ COPY --from0 /app/spring-boot-loader/ ./ COPY --from0 /app/snapshot-dependencies/ ./ COPY --from0 /app/application/ ./ ENTRYPOINT [java, org.springframework.boot.loader.JarLauncher]Maven 构建时配置阿里云仓库在settings.xml里加mirror idaliyunmaven/id mirrorOf*/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirrormirrorOf写*表示所有仓库请求都走阿里云构建速度能从十几分钟降到两三分钟。注意 SpringBoot2.5 的spring-boot-maven-plugin要开启 layers 支持在 pom 里加layersenabledtrue/enabled/layers否则jarmodelayertools会报错。3.3 Nacos2.0.3 镜像直接用官方镜像 外置 MySQLNacos 不要自己打镜像直接用官方nacos/nacos-server:2.0.3。生产环境必须用外置 MySQL不能用内嵌 derby否则 Pod 重启数据就丢。阿里云 RDS 是首选买一个 1C2G 的 MySQL 5.7 实例即可。初始化 SQL 脚本在 Nacos 官方仓库的distribution/conf/nacos-mysql.sql导入 RDS 后Nacos 的配置通过环境变量注入env: - name: MODE value: standalone - name: SPRING_DATASOURCE_PLATFORM value: mysql - name: MYSQL_SERVICE_HOST value: rm-xxxx.mysql.rds.aliyuncs.com - name: MYSQL_SERVICE_DB_NAME value: nacos_config - name: MYSQL_SERVICE_USER value: nacos - name: MYSQL_SERVICE_PASSWORD value: your-password - name: NACOS_SERVER_PORT value: 8848MODE在单机练手时用standalone生产集群用cluster并配CLUSTER_CONF。阿里云 RDS 使用时要提前把 K8s 节点 IP 加入白名单否则连接被拒。4. 在阿里云 K8s 里编排Namespace、Service、Deployment 全套 YAML4.1 创建 Namespace 和镜像拉取 Secretk8s 中 namespace 用来隔离环境建议按环境划分kubectl create namespace micro-test # 创建 ACR 拉取凭证 kubectl create secret docker-registry acr-secret \ --docker-serverregistry.cn-hangzhou.aliyuncs.com \ --docker-usernameyour-account \ --docker-passwordyour-password \ -n micro-test--docker-password用 ACR 的固定密码不是阿里云账号密码。这个 Secret 要在每个 Deployment 的imagePullSecrets里引用否则拉镜像报ImagePullBackOff。4.2 Nacos 的 StatefulSet 与双端口 ServiceNacos2.0.3 必须暴露 8848、9848、9849 三个端口apiVersion: v1 kind: Service metadata: name: nacos-svc namespace: micro-test spec: selector: app: nacos ports: - name: http port: 8848 targetPort: 8848 - name: grpc-client port: 9848 targetPort: 9848 - name: grpc-server port: 9849 targetPort: 9849 clusterIP: None # Headless ServiceStatefulSet 需要clusterIP: None是 Headless ServiceStatefulSet 靠它给每个 Pod 固定 DNS。如果只暴露 8848SpringBoot 客户端注册时会报client not connected日志里能看到 gRPC 连接超时。4.3 SpringBoot 的 Deployment 与 Nacos 地址注入apiVersion: apps/v1 kind: Deployment metadata: name: springboot-app namespace: micro-test spec: replicas: 2 selector: matchLabels: app: springboot template: metadata: labels: app: springboot spec: imagePullSecrets: - name: acr-secret containers: - name: app image: registry.cn-hangzhou.aliyuncs.com/your-ns/springboot:v1 ports: - containerPort: 8080 env: - name: NACOS_ADDR value: nacos-svc.micro-test.svc.cluster.local:8848 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10NACOS_ADDR用完整域名nacos-svc.micro-test.svc.cluster.local跨 namespace 也能解析。readinessProbe必须配否则 SpringBoot 还没连上 Nacos 就被打进流量前端请求会 503。initialDelaySeconds: 30是给 SpringBoot 启动留时间项目大就调到 60。4.4 前端 Nginx 的 Deployment 与对外暴露apiVersion: apps/v1 kind: Deployment metadata: name: vue2-web namespace: micro-test spec: replicas: 2 selector: matchLabels: app: vue2-web template: metadata: labels: app: vue2-web spec: imagePullSecrets: - name: acr-secret containers: - name: web image: registry.cn-hangzhou.aliyuncs.com/your-ns/vue2-web:v1 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: vue2-web-svc namespace: micro-test spec: type: LoadBalancer # 阿里云会自动创建 SLB selector: app: vue2-web ports: - port: 80 targetPort: 80type: LoadBalancer在阿里云 ACK 上会自动创建 SLB 并分配公网 IP省去自己配 Ingress。如果要用 Ingress改成ClusterIP再配 Ingress 规则但练手阶段 LoadBalancer 最省事。5. 避坑与排查这套组合最容易翻车的五个地方5.1 现象前端刷新页面 404接口正常原因Nginx 没配try_files $uri $uri/ /index.htmlVue2 的 history 路由在刷新时请求的是真实路径Nginx 找不到文件就返回 404。解决在location /里加上try_files重新构建前端镜像。注意try_files要放在root之后。5.2 现象SpringBoot 启动报Nacos client not connected原因Nacos2.0.3 的 gRPC 端口 9848 没在 Service 里暴露或者客户端和服务端版本不匹配。解决检查 Service 是否包含 9848 端口确认 Spring Cloud Alibaba 版本是2021.1对应 Nacos2.0.3版本错配也会导致 gRPC 握手失败。5.3 现象Pod 一直ImagePullBackOff原因imagePullSecrets没配或者 Secret 的 namespace 和 Deployment 不一致。解决kubectl describe pod看事件确认 Secret 存在且名字拼写正确。ACR 密码改了要重新创建 Secret。5.4 现象Nacos 数据丢失重启后配置全没了原因用了内嵌 derby 数据库Pod 重建数据就没了。解决切到外置 MySQL配SPRING_DATASOURCE_PLATFORMmysql和 RDS 连接信息。阿里云 RDS 记得加白名单。5.5 现象前端请求后端跨域浏览器报 CORS原因Nginx 反代没生效请求直接打到了后端 8080。解决确认前端请求路径是/api/xxx而不是http://后端IP:8080/xxx。Nginx 的location /api/和proxy_pass斜杠要对应用kubectl logs看 Nginx 访问日志确认转发路径。6. 进阶技巧用 ConfigMap 管理 Nginx 配置和 SpringBoot 多环境6.1 把 Nginx 配置抽到 ConfigMap镜像里写死配置改一次要重新构建太慢。把nginx.conf抽成 ConfigMap挂载进容器kubectl create configmap nginx-conf \ --from-filedefault.conf./nginx.conf \ -n micro-testDeployment 里挂载volumeMounts: - name: nginx-conf mountPath: /etc/nginx/conf.d/default.conf subPath: default.conf volumes: - name: nginx-conf configMap: name: nginx-confsubPath是关键不加会把整个目录覆盖掉。改配置后kubectl rollout restart deployment vue2-web即可生效不用重新构建镜像。6.2 SpringBoot 多环境用 Nacos 配置中心SpringBoot2.5 接 Nacos 配置中心在bootstrap.yml里配spring: application: name: springboot-app cloud: nacos: config: server-addr: ${NACOS_ADDR} file-extension: yaml namespace: ${NACOS_NAMESPACE} discovery: server-addr: ${NACOS_ADDR}namespace用 Nacos 里的命名空间 ID不是名字。不同环境用不同 namespaceK8s 里通过环境变量注入一套镜像跑多环境。6.3 验证部署是否成功的三个命令# 看 Pod 状态全部 Running 且 READY 1/1 kubectl get pods -n micro-test # 看 Nacos 服务列表确认 SpringBoot 实例已注册 curl http://nacos-svc.micro-test.svc.cluster.local:8848/nacos/v1/ns/instance/list?serviceNamespringboot-app # 看前端 SLB 公网 IP浏览器访问验证 kubectl get svc vue2-web-svc -n micro-test这三个命令跑通基本就稳了。我自己的习惯是每次改完 YAML 先kubectl apply --dry-runclient校验一遍能省掉一半的低级错误。这套组合在阿里云 K8s 上跑通后后面加 Redis 集群、加监控都是顺水推舟的事先把这四件套跑稳比什么都重要。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑