Spring Cloud Alibaba 应用的容器化部署与 K8s 编排

随着电信运维系统向微服务架构演进,服务的数量呈指数级增长。传统的虚拟机部署方式在资源利用率、扩缩容速度和环境一致性方面已显疲态。将基于 Spring Cloud Alibaba 的微服务(如 Perf 性能分析、JOM 工单管理、SSO 统一认证等)容器化,并运行在 Kubernetes (K8s) 集群上,已成为构建高可用、弹性伸缩的现代化运维平台的必然选择。

本文将分享如何将复杂的微服务模块打包为 Docker 镜像,利用 Helm Charts 进行标准化编排,并结合 Nacos 实现配置中心与服务发现的云原生集成,最终实现自动化部署与智能运维。

一、 总体架构设计

1. 技术栈

  • 应用框架:Spring Boot + Spring Cloud Alibaba (Nacos, Sentinel, Seata)。
  • 容器引擎:Docker。
  • ** orchestration**:Kubernetes (K8s)。
  • 包管理:Helm 3。
  • CI/CD:Jenkins / GitLab CI。
  • 前端:Vue 3 + Nginx (静态资源托管)。

2. 微服务模块划分

  • perf-service:高性能计算服务,需配置较大的 JVM 堆内存。
  • jom-service:工单流转服务,对数据库事务一致性要求高。
  • sso-service:统一认证网关,需高可用部署。
  • gateway-service:Spring Cloud Gateway,作为流量入口。
  • frontend:Vue 3 构建后的静态文件,由 Nginx 承载。

二、 后端微服务容器化

1. 多阶段构建 Dockerfile

为了减小镜像体积并提高安全性,我们采用多阶段构建策略。第一阶段使用 Maven 编译 Java 代码,第二阶段使用轻量级的 JRE 基础镜像运行应用。

复制代码
# Dockerfile for Perf Service
FROM maven:3.8.4-openjdk-11-slim AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 使用 Eclipse Temurin JRE 镜像,体积小且安全
FROM eclipse-temurin:11-jre-alpine
WORKDIR /app
COPY --from=build /app/target/perf-service.jar app.jar

# 设置时区
RUN apk add --no-cache tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 暴露端口
EXPOSE 8080

# 启动命令,支持传入 JVM 参数和 Nacos 地址
ENTRYPOINT ["java", "-jar", "app.jar"]

2. 环境变量配置

遵循"十二要素应用"原则,所有配置(如 Nacos 地址、数据库连接串)均通过环境变量注入,而非硬编码在镜像中。

复制代码
# application.yml 片段
spring:
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
      config:
        server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}

三、 前端静态资源容器化

Vue 3 项目构建后生成静态 HTML/CSS/JS 文件。我们使用 Nginx 作为 Web 服务器,并配置反向代理以解决跨域问题。

复制代码
# Dockerfile for Frontend
FROM node:16-alpine 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
CMD ["nginx", "-g", "daemon off;"]

Nginx 配置 (nginx.conf):

复制代码
server {
    listen 80;
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html; # 支持 Vue Router History 模式
    }
    
    # 反向代理后端 API 请求到 K8s Service
    location /api/ {
        proxy_pass http://gateway-service:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

四、 Kubernetes 编排与 Helm Charts

手动编写 K8s YAML 文件难以维护,我们使用 Helm 来模板化管理部署配置。

1. Helm Chart 目录结构

复制代码
cnoap-chart/
├── Chart.yaml
├── values.yaml
├── templates/
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── configmap.yaml
│   └── ingress.yaml

2. 核心模板示例 (deployment.yaml)

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-{{ .Values.service.name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.service.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.service.name }}
    spec:
      containers:
        - name: {{ .Values.service.name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: 8080
          env:
            - name: NACOS_SERVER_ADDR
              valueFrom:
                configMapKeyRef:
                  name: {{ .Release.Name }}-config
                  key: nacos.addr
            - name: JAVA_OPTS
              value: {{ .Values.javaOpts }}
          resources:
            limits:
              cpu: {{ .Values.resources.limits.cpu }}
              memory: {{ .Values.resources.limits.memory }}
            requests:
              cpu: {{ .Values.resources.requests.cpu }}
              memory: {{ .Values.resources.requests.memory }}
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
            initialDelaySeconds: 60
            periodSeconds: 10

3. 弹性伸缩 (HPA)

针对 perf-service 这种计算密集型服务,我们可以配置 Horizontal Pod Autoscaler (HPA),根据 CPU 使用率自动调整副本数。

复制代码
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: perf-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: perf-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

五、 服务网格与可观测性集成

1. Nacos 在 K8s 中的部署

Nacos 是 Spring Cloud Alibaba 的核心。在 K8s 中,我们通常使用 StatefulSet 部署 Nacos 集群,并配合 MySQL 持久化数据。

复制代码
# Nacos StatefulSet 片段
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
spec:
  serviceName: nacos-headless
  replicas: 3
  template:
    spec:
      containers:
        - name: nacos
          image: nacos/nacos-server:v2.0.3
          env:
            - name: MODE
              value: "cluster"
            - name: NACOS_REPLICAS
              value: "3"

2. 链路追踪与监控

  • SkyWalking:集成 SkyWalking Agent,自动采集微服务间的调用链路,可视化展示依赖关系和性能瓶颈。
  • Prometheus + Grafana:通过 Micrometer 暴露 JVM 和业务指标,由 Prometheus 抓取,Grafana 展示大屏。

六、 自动化部署流程 (CI/CD)

  1. 代码提交:开发者推送代码到 GitLab。
  2. 构建镜像 :Jenkins 触发 Pipeline,执行 mvn packagedocker build
  3. 推送仓库:将镜像推送到私有 Harbor 仓库。
  4. 更新 Helm :修改 values.yaml 中的镜像 Tag。
  5. 部署集群 :执行 helm upgrade --install cnoap ./cnoap-chart,K8s 滚动更新服务。

七、 总结

通过容器化与 K8s 编排,我们实现了电信运维系统的现代化转型:

  • 环境一致性:消除了"在我机器上是好的"这类问题。
  • 弹性伸缩:应对早晚高峰流量波动,自动扩容 Perf 服务节点。
  • 高可用性:K8s 自动重启失败容器,结合 Nacos 集群确保服务发现不中断。
  • 高效运维:Helm 简化了多环境(Dev/Test/Prod)的管理复杂度。

这套架构不仅提升了系统的稳定性,也为后续引入 Serverless、Service Mesh 等更先进的云原生技术奠定了坚实基础。

互动环节

💬 你们公司的动态指标计算引擎是怎么实现的?遇到过哪些难题?欢迎在评论区分享!

⭐ 如果觉得这篇文章有帮助,欢迎点赞、收藏、转发!

🔔 关注我,下一篇将分享《基于 SkyWalking 的全链路监控与性能调优》

版权声明:本文为原创文章,转载请注明出处。商业转载请联系作者获得授权。

作者简介:系统架构 师,专注于电信大数据平台架构设计与运维。目前负责日均处理2亿条消息的ucp平台,擅长分布式系统设计、消息中间件运维和高可用架构

相关推荐
sbjdhjd1 小时前
Tomcat(下) 集群高可用实战:反向代理・负载均衡・分布式 Session
运维·前端·云原生·开源·tomcat·负载均衡·memcached
liux35281 小时前
Namespace 多租户隔离:K8s 资源管理的基石
docker·容器·kubernetes
openFuyao1 小时前
openFuyao InferNex:云原生分布式 LLM 推理加速套件——从生产痛点到算力的极致释放
分布式·云原生·ai原生·openfuyao·多样化算力
IvorySQL2 小时前
PostgreSQL 技术日报 (6月12日)|自研云原生 PG 平台,AI 开源共享协议发布
人工智能·postgresql·云原生
程序员酥皮蛋11 小时前
docker基础
docker·容器·eureka
没有退路那我就不要散步15 小时前
kube-proxy优化
docker·容器·kubernetes
阿狸猿17 小时前
论基于云原生数据库的企业信息系统架构设计
数据库·云原生
丑过三八线17 小时前
Kubernetes 常用命令速查手册
云原生·容器·kubernetes
bloglin9999918 小时前
docker镜像构建及部署样例
运维·docker·容器