简介这份资源面向需要在阿里云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两个示例工程展开分别演示前端静态资源经Nginx容器化发布、后端服务镜像构建与部署的完整链路并给出Nacos集群化部署与数据库初始化脚本便于读者对照目录结构快速复现环境、理解各组件间的依赖与配置关系。目前已有1340人学习下载适合具备一定容器基础、希望系统掌握k8s多组件编排思路的开发者参考。1. 阿里云 K8s 部署 Vue2 Nginx SpringBoot2.5 Nacos2.0.3一套能落地的全栈方案很多团队在阿里云上第一次搭 K8s 环境时卡住的往往不是集群本身而是「前端 Vue2 打包产物怎么进 Nginx、后端 SpringBoot2.5 怎么注册到 Nacos2.0.3、Nginx 又怎么把请求转发到后端」这条链路。标题里的四个组件——Vue2、Nginx、SpringBoot2.5、Nacos2.0.3——正好构成一个典型的前后端分离架构Vue2 负责页面Nginx 负责静态资源与反向代理SpringBoot2.5 提供接口Nacos2.0.3 做注册中心和配置中心。把它们整体搬到阿里云 K8s 上能解决环境不一致、扩容慢、配置散落各处的问题。这套方案适合已经有一台阿里云服务器、想从 Docker Compose 或裸机部署迁移到 K8s 的后端和运维同学也适合需要把整套环境交付给测试或生产的前端负责人。下面按「先跑通最小闭环再补配置和排错」的顺序展开。2. 上 K8s 前先把四个组件的关系理清镜像、端口与注册链路2.1 为什么 Nacos2.0.3 要单独占一个 DeploymentNacos2.0.3 相比 1.x 最大的变化是 gRPC 通信端口。1.x 只需要 88482.0.3 默认还会监听 9848客户端 gRPC和 9849服务端 gRPC。如果只暴露 8848SpringBoot2.5 应用启动时会报「client not connected」或一直重连。常见做法是把 Nacos 单独做成一个 DeploymentService 同时暴露 8848、9848、9849 三个端口并且用 StatefulSet 或固定 PVC 保存derby数据目录否则 Pod 重启后配置全丢。我一般会在阿里云上给 Nacos 挂一个 NAS 或云盘 PVC路径指向/home/nacos/data和/home/nacos/logs。2.2 Vue2 与 Nginx 为什么合并成一个镜像Vue2 打包后是纯静态文件单独跑一个 Nginx 容器最省事。常见做法是在前端项目根目录写一个多阶段 Dockerfile第一阶段用node:14执行npm run build第二阶段把dist拷进nginx:1.20的/usr/share/nginx/html再覆盖一份default.conf。这样镜像里既有静态文件又有反向代理配置K8s 里只需要一个 Deployment 和一个 Service。注意 Vue2 项目如果用了vue-ueditor-warp或vue-konva这类只在个别页面引入的库打包时容易因为版本冲突失败建议在package.json里锁死版本CI 里加npm ci而不是npm install。2.3 SpringBoot2.5 注册到 Nacos2.0.3 的最小配置SpringBoot2.5 对应 Spring Cloud 2020.0.xNacos 客户端要用nacos-discovery和nacos-config的 2021.x 版本。bootstrap.yml里至少写三样Nacos 地址、命名空间、分组。K8s 内部访问 Nacos 用 Service 名即可比如nacos-svc.default.svc.cluster.local:8848。如果 Nacos 和 SpringBoot 不在同一个命名空间地址要带命名空间后缀。下面是一个能直接抄的bootstrap.yml片段spring: application: name: order-service cloud: nacos: discovery: server-addr: nacos-svc.default.svc.cluster.local:8848 namespace: dev group: DEFAULT_GROUP config: server-addr: nacos-svc.default.svc.cluster.local:8848 namespace: dev group: DEFAULT_GROUP file-extension: yaml逻辑说明server-addr用 K8s Service 名而不是 IP避免 Pod 重建后地址变化namespace用 Nacos 控制台里创建的命名空间 ID不是名称file-extension决定去 Nacos 拉order-service-dev.yaml还是.properties。参数上namespace留空会落到 public生产环境一定要单独建命名空间隔离。2.4 阿里云 K8s 集群里三个 Service 的暴露方式前端 Nginx 用LoadBalancer类型阿里云会自动创建 SLB外网访问 80/443。SpringBoot 用ClusterIP只让 Nginx 通过 Service 名访问不直接暴露。Nacos 控制台如果要从本地访问可以临时用kubectl port-forward不要长期开NodePort。常见做法是给 Nginx 的 Service 加注解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet内网测试改成intranet。这样一套下来外部流量只经过 SLB → Nginx → SpringBootNacos 只在集群内部通信。3. 在阿里云 K8s 上跑通最小闭环从镜像构建到 Ingress 转发3.1 前端 Vue2 多阶段构建与 Nginx 配置先在前端项目根目录建DockerfileFROM node:14-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm config set registry https://registry.npmmirror.com RUN npm ci COPY . . RUN npm run build FROM nginx:1.20-alpine COPY --frombuild /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD [nginx, -g, daemon off;]逻辑说明第一阶段用npm ci保证依赖版本和package-lock.json一致registry指向国内镜像加速第二阶段只拷贝dist和自定义nginx.conf镜像体积能控制在 50MB 以内。参数上node:14是 Vue2 项目比较稳的版本nginx:1.20兼容大部分nginx.conf写法。nginx.conf里要写try_files $uri $uri/ /index.html;否则 Vue Router 的 history 模式刷新会 404。3.2 SpringBoot2.5 镜像与 Nacos 地址注入后端Dockerfile用openjdk:8-jre-alpine或eclipse-temurin:8-jreFROM eclipse-temurin:8-jre WORKDIR /app COPY target/order-service.jar app.jar ENV JAVA_OPTS-Xms512m -Xmx1024m ENTRYPOINT [sh, -c, java $JAVA_OPTS -jar app.jar]逻辑说明JAVA_OPTS用环境变量传入K8s Deployment 里可以按 Pod 规格覆盖。Nacos 地址不要写死在 jar 里通过bootstrap.yml的server-addr读环境变量NACOS_ADDRDeployment 里用env注入。参数上-Xms和-Xmx建议设为容器 limit 的 50%75%避免 OOMKilled。3.3 Nacos2.0.3 的 Deployment 与 PVC 挂载Nacos 官方镜像nacos/nacos-server:2.0.3可以直接用但生产环境建议用 MySQL 外置存储。最小验证可以用内嵌 derbyDeployment 片段如下apiVersion: apps/v1 kind: Deployment metadata: name: nacos spec: replicas: 1 selector: matchLabels: app: nacos template: metadata: labels: app: nacos spec: containers: - name: nacos image: nacos/nacos-server:2.0.3 env: - name: MODE value: standalone - name: JVM_XMS value: 512m - name: JVM_XMX value: 512m ports: - containerPort: 8848 - containerPort: 9848 - containerPort: 9849 volumeMounts: - name: nacos-data mountPath: /home/nacos/data volumes: - name: nacos-data persistentVolumeClaim: claimName: nacos-pvc逻辑说明MODEstandalone适合测试生产要改成cluster并配 MySQL。JVM_XMS和JVM_XMX必须设否则 Nacos 默认吃 2G 内存小规格节点容易崩。端口 9848/9849 一定要在 Service 里暴露否则 SpringBoot2.5 连不上。PVC 用阿里云云盘或 NASaccessModes选ReadWriteOnce即可。3.4 用 Ingress 把前端请求转发到 SpringBootNginx 容器里的default.conf写反向代理server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://order-service:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }逻辑说明/api/前缀转发到 SpringBoot 的 Service 名order-service和端口 8080proxy_pass末尾的/会把/api/去掉再转发。参数上proxy_set_header至少保留Host和X-Real-IP否则后端拿不到真实客户端 IP。如果 SpringBoot 有 context-pathproxy_pass要相应调整。4. 配置与参数怎么设Nacos 命名空间、资源限制与探针4.1 Nacos 命名空间和分组在 K8s 里的对应关系Nacos 的namespace在控制台创建后是一串 UUID不是显示名称。K8s 里用 ConfigMap 存这个 UUIDSpringBoot Deployment 通过envFrom注入。分组group默认DEFAULT_GROUP如果多环境共用一套 Nacos建议按dev、test、prod建三个命名空间而不是靠 group 区分。常见做法是bootstrap.yml里写namespace: ${NACOS_NAMESPACE:public}K8s 里覆盖NACOS_NAMESPACE环境变量。这样同一份镜像能跑在不同环境。4.2 SpringBoot2.5 的 resources 与探针参数Deployment 里给 SpringBoot 设resources.requests.cpu: 500m、memory: 1Gilimits.cpu: 1、memory: 1.5Gi。探针用httpGet指向/actuator/healthinitialDelaySeconds: 60因为 SpringBoot2.5 启动加 Nacos 注册通常要 3050 秒。livenessProbe的failureThreshold设 3periodSeconds设 10。如果 Nacos 暂时不可用readinessProbe会失败Pod 不会接流量这是预期行为不要为了「看起来正常」把探针去掉。4.3 Nginx 的 ConfigMap 挂载与热更新把default.conf放进 ConfigMap挂载到/etc/nginx/conf.d/。改配置后kubectl rollout restart deployment frontend触发重建。注意 ConfigMap 更新不会自动 reload Nginx除非用 sidecar 或nginx -s reload。参数上proxy_read_timeout默认 60 秒如果后端接口有长任务调到 300 秒。client_max_body_size默认 1M文件上传场景要调大。4.4 阿里云 SLB 与 K8s Service 的注解配置前端 Service 加注解apiVersion: v1 kind: Service metadata: name: frontend-svc annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small spec: type: LoadBalancer ports: - port: 80 targetPort: 80 selector: app: frontend逻辑说明address-type: internet创建公网 SLBintranet创建内网。slb.s1.small是入门规格流量大要换slb.s2.small以上。参数上port是 SLB 监听端口targetPort是容器端口。如果要用 HTTPS在 SLB 上配证书或者用 certbot 在 Nginx 里配但 K8s 里更推荐 Ingress cert-manager。5. 避坑与排查Nacos 连不上、Vue 刷新 404、镜像拉取慢5.1 现象SpringBoot 启动报「Nacos client not connected」原因Nacos2.0.3 的 gRPC 端口 9848 没有在 Service 里暴露或者 K8s NetworkPolicy 拦了。解决检查 Nacos Service 的ports是否包含 9848 和 9849kubectl exec进 SpringBoot Pod 用telnet nacos-svc 9848测试。如果用了阿里云 Terway 网络插件确认安全组没有限制集群内通信。5.2 现象Vue2 页面刷新后 404原因Nginx 没有配try_files或者 Ingress 把/路径直接转给了后端。解决确认default.conf里有try_files $uri $uri/ /index.html;Ingress 的path用/且pathType: Prefix不要配成/api之外还拦截/。5.3 现象镜像拉取慢或 ImagePullBackOff原因阿里云 K8s 节点拉 Docker Hub 镜像慢或者镜像仓库认证失败。解决把镜像推到阿里云容器镜像服务 ACRDeployment 里用 ACR 地址。如果必须用公网给节点配 NAT 网关。检查kubectl describe pod里的 Events确认是超时还是 401。5.4 现象Nacos 配置改了但 SpringBoot 不生效原因bootstrap.yml里file-extension和 Nacos 里的 Data ID 不匹配或者RefreshScope没加。解决Data ID 格式是${spring.application.name}-${profile}.${file-extension}比如order-service-dev.yaml。需要动态刷新的 Bean 加RefreshScope否则重启 Pod 才生效。5.5 现象Pod 频繁 OOMKilled原因SpringBoot 或 Nacos 的 JVM 堆设得比容器 limit 还大。解决JAVA_OPTS里-Xmx设为 limit 的 70% 左右Nacos 的JVM_XMX同理。用kubectl top pod观察实际内存再调resources.limits.memory。6. 进阶用 Nacos 配置中心做灰度发布与 K8s 滚动更新配合6.1 把 SpringBoot 的日志级别和开关放到 Nacos生产环境经常需要临时调日志级别不想重启 Pod。在 Nacos 里建order-service-prod.yaml写logging.level.com.example: debugSpringBoot 里用Value或ConfigurationProperties读。配合RefreshScope改完 Nacos 点发布应用内日志级别立刻变。K8s 的滚动更新和 Nacos 配置刷新是两条独立链路滚动更新换镜像Nacos 刷新换配置。灰度发布时可以给新版本 Pod 注入不同的NACOS_NAMESPACE或group让新版本读灰度配置验证通过再全量。6.2 用 readinessProbe 控制流量切换SpringBoot2.5 注册到 Nacos 后Nacos 会立刻把实例标记为健康。如果此时应用还没完全启动流量会打进来报错。常见做法是readinessProbe指向/actuator/healthinitialDelaySeconds设 60periodSeconds设 5。K8s 在 readiness 通过前不会把 Pod 加入 Service EndpointsNginx 也就不会转发。这样滚动更新时新 Pod 先启动、注册 Nacos、readiness 通过旧 Pod 才终止。6.3 验证整套链路是否通的三个命令第一个kubectl get pods -n default确认四个组件都是 Running。第二个kubectl exec -it springboot-pod -- curl http://nacos-svc:8848/nacos/v1/ns/instance/list?serviceNameorder-service看实例列表。第三个从本地curl http://SLB-IP/api/actuator/health看是否返回UP。这三个命令覆盖了 Nacos 注册、Nginx 转发、后端健康检查。6.4 一个我踩过的坑Nacos 的 derby 数据目录权限用 PVC 挂载/home/nacos/data时如果 PVC 是 NAS默认权限可能是 rootNacos 容器里用nacos用户跑会报Permission denied。解决在 Deployment 里加securityContext.runAsUser: 0临时用 root 跑或者初始化 PVC 时chown。我现在的习惯是测试环境用emptyDir先跑通生产再换 PVC并且提前在初始化容器里改好目录权限。这套方案值不值得做取决于你是否需要多环境配置隔离和自动扩缩容如果只是单机跑几个服务Docker Compose 更省事。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?