随着电信运维系统向微服务架构演进,服务的数量呈指数级增长。传统的虚拟机部署方式在资源利用率、扩缩容速度和环境一致性方面已显疲态。将基于 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)
- 代码提交:开发者推送代码到 GitLab。
- 构建镜像 :Jenkins 触发 Pipeline,执行
mvn package和docker build。 - 推送仓库:将镜像推送到私有 Harbor 仓库。
- 更新 Helm :修改
values.yaml中的镜像 Tag。 - 部署集群 :执行
helm upgrade --install cnoap ./cnoap-chart,K8s 滚动更新服务。
七、 总结
通过容器化与 K8s 编排,我们实现了电信运维系统的现代化转型:
- 环境一致性:消除了"在我机器上是好的"这类问题。
- 弹性伸缩:应对早晚高峰流量波动,自动扩容 Perf 服务节点。
- 高可用性:K8s 自动重启失败容器,结合 Nacos 集群确保服务发现不中断。
- 高效运维:Helm 简化了多环境(Dev/Test/Prod)的管理复杂度。
这套架构不仅提升了系统的稳定性,也为后续引入 Serverless、Service Mesh 等更先进的云原生技术奠定了坚实基础。
互动环节
💬 你们公司的动态指标计算引擎是怎么实现的?遇到过哪些难题?欢迎在评论区分享!
⭐ 如果觉得这篇文章有帮助,欢迎点赞、收藏、转发!
🔔 关注我,下一篇将分享《基于 SkyWalking 的全链路监控与性能调优》
版权声明:本文为原创文章,转载请注明出处。商业转载请联系作者获得授权。
作者简介:系统架构 师,专注于电信大数据平台架构设计与运维。目前负责日均处理2亿条消息的ucp平台,擅长分布式系统设计、消息中间件运维和高可用架构