ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

阿里云K8s部署Vue2+SpringBoot2.5+Nacos2.0.3实战指南

阿里云K8s部署Vue2+SpringBoot2.5+Nacos2.0.3实战指南 简介这份资源面向需要在阿里云Kubernetes集群上落地前后端分离项目的运维与后端开发人员提供一套可直接参考的部署方案解决Vue2前端、SpringBoot2.5服务与Nacos2.0.3注册配置中心在k8s中协同编排的问题。包内共16个文件以8个yaml编排清单为核心覆盖Nacos的StatefulSet、Service、Headless、Ingress及MySQL配置另有2个sh一键部署脚本、2个Dockerfile、1个nginx.conf、1个初始化sql、1个jar与1个gz前端产物压缩包约34.69MB。资源按k8s-vue-demo与k8s-realize-master两条业务线组织配合k8s-deploy-nacos-total.yaml可整体拉起Nacos集群便于理解有状态服务、服务发现与前端静态资源发布的完整链路。目前已有1340人学习下载适合作为k8s部署练习与生产改造的起步模板。1. 从一台阿里云 ECS 说起这套 k8s 部署栈到底解决什么问题手里只有一台阿里云 ECS却要同时跑 Vue2 前端、Nginx、SpringBoot 2.5 后端和 Nacos 2.0.3 注册中心很多人第一反应是「docker-compose 一把梭」。但当你需要滚动更新、灰度发布、Pod 自愈、配置热更新时compose 就开始力不从心。这套「阿里云 k8s 部署 vue2nginxspringboot2.5nacos2.0.3」的组合本质是把一个典型的前后端分离项目完整搬进 Kubernetes前端静态资源交给 Nginx 托管后端 SpringBoot 打成镜像跑 DeploymentNacos 既做注册中心又做配置中心用 StatefulSet 保证它的数据持久化。它适合已经能跑通单体部署、想进一步吃透 k8s 工作负载、Service、Ingress、ConfigMap 的初中级工程师。下面我按自己实际拆过的顺序把镜像构建、编排文件、Nacos 持久化和几个必踩的坑一次讲清。2. 镜像与编排前置Vue2、SpringBoot2.5、Nacos2.0.3 各自怎么打包2.1 Vue2 前端构建与 Nginx 镜像分层Vue2 项目在本地npm run build之后产出的是dist静态目录真正要进镜像的只有这个目录加一份 Nginx 配置。常见做法是用多阶段构建第一阶段用 node 镜像编译第二阶段只拷贝产物这样镜像能压到 50MB 以内。注意 Vue2 的vue-cli-service build默认走publicPath如果部署在子路径下要在vue.config.js里把publicPath改成/或对应前缀否则刷新 404。# 阶段一编译 Vue2 FROM node:16-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm config set registry https://registry.npmmirror.com npm install COPY . . RUN npm run build # 阶段二Nginx 托管静态资源 FROM nginx:1.24-alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80逻辑说明npm config set registry换成国内镜像源避免构建时拉包超时COPY --frombuilder只搬运编译产物不带 node_modules。参数上node:16-alpine对应 Vue2 生态较稳的版本Nginx 用 alpine 减小体积。Nginx 配置里关键的是try_files $uri $uri/ /index.html;这是 Vue history 路由不 404 的命根子。2.2 SpringBoot 2.5 镜像与 Nacos 2.0.3 的端口差异SpringBoot 2.5 用spring-boot-maven-plugin打出的 fat jar 直接丢进eclipse-temurin:8-jre即可。这里有个高频翻车点Nacos 2.0.3 相比 1.x 新增了 gRPC 通信除了 8848 还要暴露 9848客户端 gRPC和 9849服务端 gRPC。如果你只映射 8848SpringBoot 注册时会报Client not connected或一直重连。FROM eclipse-temurin:8-jre WORKDIR /app COPY target/*.jar app.jar ENV JAVA_OPTS-Xms512m -Xmx1024m ENTRYPOINT [sh,-c,java $JAVA_OPTS -jar app.jar]逻辑说明JAVA_OPTS用环境变量注入方便在 Deployment 里按 Pod 资源限制调整sh -c是为了让变量能展开。参数上-Xmx1024m要和后面 k8s 的resources.limits.memory对齐否则 JVM 会按宿主机内存算堆Pod 容易被 OOMKilled。2.3 Nacos 2.0.3 的持久化与数据库准备Nacos 单机模式默认用内嵌 Derby生产必须换 MySQL。先在阿里云 RDS 或自建 MySQL 里建nacos_config库导入官方mysql-schema.sql然后通过环境变量把连接信息传进去。这一步不做Pod 一重启配置全丢血泪经验。# 导入 Nacos 2.0.3 建表脚本 mysql -h rm-xxxx.mysql.rds.aliyuncs.com -u nacos -p nacos_config mysql-schema.sql逻辑说明建表脚本在 Nacos 发行包的conf目录下连接串、用户名、密码后面会写进 ConfigMap 或 Secret不要硬编码进镜像。参数上注意 MySQL 版本建议 5.7 或 8.0字符集用 utf8mb4。3. 阿里云 ACK 上的编排落地Deployment、Service 与 Ingress 怎么配3.1 Nacos 用 StatefulSet 还是 DeploymentNacos 单机部署用 Deployment 加 PVC 就够集群模式才需要 StatefulSet 保证每个节点稳定网络标识。我一般单机先用 Deployment把nacos-home挂到 NAS 或云盘 PVC 上配置和日志都持久化。下面这份 YAML 是精简后的核心部分。apiVersion: apps/v1 kind: Deployment metadata: name: nacos namespace: prod spec: replicas: 1 selector: matchLabels: app: nacos template: metadata: labels: app: nacos spec: containers: - name: nacos image: nacos/nacos-server:v2.0.3 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 valueFrom: secretKeyRef: name: nacos-secret key: username - name: MYSQL_SERVICE_PASSWORD valueFrom: secretKeyRef: name: nacos-secret key: password ports: - containerPort: 8848 - containerPort: 9848 - containerPort: 9849 volumeMounts: - name: nacos-data mountPath: /home/nacos/data volumes: - name: nacos-data persistentVolumeClaim: claimName: nacos-pvc逻辑说明MODEstandalone单机模式数据库密码走 Secret 引用避免明文。参数上三个端口必须都声明Service 里也要对应暴露。PVC 在阿里云 ACK 上可以直接用alicloud-diskStorageClass 动态生成。3.2 SpringBoot 与 Vue 的 Service、Ingress 串联后端 Deployment 的镜像就是 2.2 打的那个环境变量里指定NACOS_ADDRnacos.prod.svc.cluster.local:8848让 Pod 通过集群内 DNS 找 Nacos。前端 Nginx 的 Deployment 挂上 2.1 的镜像Service 暴露 80。最后用 Ingress 把域名按路径分流/api转发到后端 Service/转发到前端 Service。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress namespace: prod annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: app.example.com http: paths: - path: /api pathType: Prefix backend: service: name: backend-svc port: number: 8080 - path: / pathType: Prefix backend: service: name: frontend-svc port: number: 80逻辑说明rewrite-target把/api前缀去掉再转发后端接口就不用带前缀。参数上ingressClassName要和你 ACK 里装的 Ingress Controller 对应阿里云默认可能是nginx或alb。注意 Vue 里 axios 的baseURL要设成/api和这里对齐。3.3 配置热更新ConfigMap 挂载与 Nacos 配置中心的分工这里容易混Nacos 管的是业务配置数据库连接、开关k8s ConfigMap 管的是环境级配置Nacos 地址、日志级别。SpringBoot 2.5 接 Nacos Config 后改配置在 Nacos 控制台点发布即可不用重启 Pod。但前提是bootstrap.yml里配好spring.cloud.nacos.config.server-addr且引入spring-cloud-starter-alibaba-nacos-config依赖。常见做法是把server-addr用环境变量注入避免镜像里写死。4. 避坑与排查这套栈最容易翻车的五个地方4.1 Nacos 注册不上日志刷 Client not connected现象SpringBoot 启动后 Nacos 控制台看不到实例Pod 日志反复重连。原因Nacos 2.0.3 的 gRPC 端口 9848 没在 Service 或安全组放行。解决Service 的ports补上 9848、9849阿里云安全组也放行对应 NodePort 或走内网 SLB。4.2 Vue 刷新页面 404现象首页能开点进子路由再刷新就 404。原因Nginx 没配try_fileshistory 路由请求打到了不存在的文件。解决在nginx.conf的location /里加try_files $uri $uri/ /index.html;改完重建前端镜像。4.3 Pod 一直 OOMKilled现象后端 Pod 反复重启kubectl describe显示 OOMKilled。原因JVM 堆按宿主机内存算超过了resources.limits.memory。解决显式设-Xmx为 limit 的 70% 左右或加-XX:MaxRAMPercentage70两者选一别重复。4.4 Nacos 数据丢失配置回到默认现象Pod 重启后 Nacos 里的配置全没了。原因用了内嵌 Derby 且没挂 PVC。解决切 MySQL 模式并挂载 PVC确认MYSQL_SERVICE_*环境变量生效kubectl exec进去看conf/application.properties是否被覆盖。4.5 Ingress 转发 502后端连不上现象访问域名报 502 Bad Gateway。原因Ingress 的 Service 名或端口写错或后端 Pod 没 Ready。解决kubectl get endpoints backend-svc看有没有后端地址没有就查 readinessProbe 和容器端口是否一致。5. 进阶技巧用探针和 HPA 让这套栈真正稳下来部署能跑通只是及格线真正让这套栈在生产站住脚的是探针和弹性伸缩。SpringBoot 2.5 接上spring-boot-starter-actuator后暴露/actuator/health把它配成 readinessProbePod 没就绪就不会被 Ingress 转发流量滚动更新时用户无感知。livenessProbe 则用来在进程假死时自动重启。参数上initialDelaySeconds给 30 到 60 秒SpringBoot 启动慢给太短会一直重启这也是新手最常见的玄学重启来源。readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 40 periodSeconds: 10 livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60 periodSeconds: 20逻辑说明readiness 控制流量接入liveness 控制重启两者路径可以相同但阈值要拉开。参数上periodSeconds别设太小否则健康检查本身就成了压力源。Nacos 那边也建议加 TCP 探针检查 8848避免注册中心没起来后端还在傻等。再进一步是 HPA按 CPU 使用率自动扩后端副本。前提是 Deployment 里写了resources.requests.cpu否则 HPA 拿不到基准值会一直显示 unknown。我一般 requests 给 250mlimits 给 1 核HPA 阈值设 70%副本 2 到 6 之间。验证方法很简单kubectl get hpa -n prod -w观察再用kubectl run起个压测 Pod 打后端接口看副本数是否上涨。这套组合跑通后你会发现之前手动改副本数的日子是真的回不去了。从那以后我每次上这套栈都强制先kubectl get endpoints确认后端就绪、再kubectl logs扫一遍 Nacos 的 gRPC 连接日志最后才切流量。希望帮到你。本文还有配套的精品资源点击获取
返回列表