从零到生产:基于华为云 CCE 和 SWR 容器化部署 Spring Boot + Vue 全栈项目
【摘要】 一、背景与痛点之前团队的一个内部管理系统一直跑在单台 ECS 上,前后端直接 nohup 启动。随着功能迭代,几个问题越来越明显:环境漂移:本地 dev 跑得好好的,上到 ECS 就报依赖缺失,排查半天发现是 JDK 小版本不一致。发布风险高:每次更新都是覆盖 jar 包 + 重启,一旦新版本有 bug,回滚得手动翻备份。扩容基本靠加机器:流量一高,只能再开一台 ECS 重复部署流程,没法快...
一、背景与痛点
之前团队的一个内部管理系统一直跑在单台 ECS 上,前后端直接
nohup 启动。随着功能迭代,几个问题越来越明显:- 环境漂移:本地
dev跑得好好的,上到 ECS 就报依赖缺失,排查半天发现是 JDK 小版本不一致。 - 发布风险高:每次更新都是覆盖 jar 包 + 重启,一旦新版本有 bug,回滚得手动翻备份。
- 扩容基本靠加机器:流量一高,只能再开一台 ECS 重复部署流程,没法快速弹性。
核心诉求很明确:环境标准化、发布自动化、架构可扩展。容器化 + K8s 是最直接的答案,而华为云 CCE 正好提供了开箱即用的 K8s 集群。
二、方案设计
整体架构如下:
用户访问
↓
ELB(弹性负载均衡)
↓
Ingress Controller(CCE 内部)
↓
Service(ClusterIP)
↓
Pod(Spring Boot 后端 / Vue 前端 Nginx)
↓
RDS for MySQL(云数据库)
组件选型与职责:
- SWR:存放前端 Nginx 镜像和后端 Spring Boot 镜像,相当于私有 Docker Hub。
- CCE:托管 K8s 集群,负责编排 Pod、Service、Ingress。
- RDS:托管 MySQL,不用自己运维数据库,自带主备高可用。
- ELB:对外暴露服务,绑定弹性公网 IP。
避坑点:生产环境不要把数据库放在容器里,一定要用 RDS;前端静态资源用 Nginx 容器托管,通过 Ingress 按路径路由到后端 API。
三、实操步骤
3.1 制作镜像并推送到 SWR
后端 Dockerfile(Spring Boot):
FROM openjdk:8-jre-slim
LABEL maintainer="your-name"
WORKDIR /app
COPY target/demo-app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Xms256m", "-Xmx512m", "-jar", "/app/app.jar"]
前端 Dockerfile(Vue + Nginx):
# 构建阶段
FROM node:16 as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
推送到 SWR(以华北-北京四为例):
# 登录 SWR
docker login -u [区域]@[AK] -p [登录密钥] swr.cn-north-4.myhuaweicloud.com
# 打标签
docker tag demo-backend:1.0 swr.cn-north-4.myhuaweicloud.com/my-org/demo-backend:1.0
docker tag demo-frontend:1.0 swr.cn-north-4.myhuaweicloud.com/my-org/demo-frontend:1.0
# 推送
docker push swr.cn-north-4.myhuaweicloud.com/my-org/demo-backend:1.0
docker push swr.cn-north-4.myhuaweicloud.com/my-org/demo-frontend:1.0
注:SWR 的登录指令可以在控制台「我的镜像」里一键复制,别自己拼 URL 容易错。
3.2 创建 CCE 集群
- 进入 CCE 控制台,创建「标准集群」
- 网络配置:选择已有 VPC 和子网,容器网段建议选
172.16.0.0/16避免与 VPC 冲突 - 节点配置:添加 2 台 4U8G 的 ECS 作为工作节点(生产建议 3 节点起)
- 等待集群状态变为「运行中」
3.3 部署后端工作负载
在 CCE 控制台「工作负载 → 无状态负载」中创建:
- 镜像:选择 SWR 中的
demo-backend:1.0 - 环境变量:配置数据库连接信息
env: - name: SPRING_DATASOURCE_URL value: "jdbc:mysql://[RDS内网地址]:3306/demo_db?useSSL=false" - name: SPRING_DATASOURCE_USERNAME valueFrom: secretKeyRef: name: db-secret key: username - name: SPRING_DATASOURCE_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password - 实例数:2(保证高可用)
- 健康检查:配置
livenessProbe和readinessProbe,路径/actuator/health
安全建议:数据库密码不要明文写在 YAML 里,用 CCE 的「密钥(Secret)」管理,然后在环境变量中引用。
3.4 部署前端并配置 Ingress
前端同样创建无状态负载,镜像用
demo-frontend:1.0。然后创建 Service(ClusterIP 类型)和 Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: demo.example.com # 换成你的域名
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: demo-backend-svc
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: demo-frontend-svc
port:
number: 80
将域名
demo.example.com 解析到 ELB 的公网 IP 即可访问。3.5 数据库准备
在 RDS 控制台创建 MySQL 实例,创建数据库
demo_db,初始化表结构:CREATE DATABASE demo_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 导入表结构
SOURCE /path/to/schema.sql;
确保 RDS 安全组允许 CCE 节点网段访问 3306 端口。
四、验证结果
- 访问
http://demo.example.com,前端页面正常加载 - 点击登录/查询功能,API 请求通过 Ingress 转发到后端,数据正常返回
- CCE 控制台查看 Pod 状态:2 个后端 Pod + 2 个前端 Pod 均为 Running
- 手动删除一个后端 Pod,CCE 自动拉起新 Pod,服务不中断
压测简单验证(用
wrk 或 ab):wrk -t10 -c100 -d30s http://demo.example.com/api/health
在 100 并发下响应时间稳定在 20ms 以内,Pod 资源使用率正常。
五、总结与可扩展
这次上云解决了三个核心问题:
- 环境一致性:镜像一次构建,到处运行
- 发布可靠:通过修改镜像版本号滚动更新,回滚只需改回旧版本
- 弹性扩展:CCE 支持 HPA(水平 Pod 自动伸缩),流量高峰自动加 Pod
后续可继续优化的方向:
- CI/CD 流水线:用 CodeArts 或 Jenkins,代码推送后自动构建镜像、更新 CCE 工作负载
- 配置中心:用 CSE(微服务引擎)或 ConfigMap 管理多环境配置
- 监控告警:开启 AOM(应用运维管理),配置 Pod 异常重启告警
- 日志采集:配置 LTS(云日志服务),集中收集和分析应用日志
对于中小团队从传统部署向云原生迁移,这套方案是性价比很高的起点。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)