云原生 · 容器化迁移 · 运维工程师

企业管理平台微服务
云原生上云改造

将原虚拟机部署的企业综合管理系统整体迁移至阿里云 ACK,完成微服务容器化改造与全链路运维体系建设,解决发版慢、扩容难、多环境配置不一致的核心痛点。

项目周期2023.06 – 2025.02
部署平台阿里云 ACK
架构微服务 + Nacos
我的角色运维主导
⚠️ 提示:本页面试问答与代码示例为基于项目技术栈整理的草稿,请逐条核对,确认是你真实做过、能讲清楚的内容后再用于面试。
📋项目概述
背景、目标与我的职责
项目背景

客户企业的综合管理系统涵盖统一认证、用户权限、组织架构、业务审批、报表统计、定时任务等模块,采用微服务架构,支撑多个部门日常办公。系统原基于虚拟机部署,存在三个核心问题:发版慢、扩容难、多环境配置不一致。本项目主导将系统迁移至阿里云 ACK,完成容器化改造与运维体系建设。

我的职责(运维主导)
  • 主导核心微服务(API 网关、统一认证、用户权限、业务服务、任务调度)的容器化改造与上云迁移
  • 设计新旧并行的灰度迁移方案,逐个服务切流,保证迁移全程业务不中断
  • 用阿里云 DTS 将自建数据库平滑迁移到 RDS,全量+增量同步保证数据不丢
  • 对接 MSE 托管 Nacos 做注册与配置中心,管理开发/测试/预发/生产多套环境
  • 用 Helm 编写各微服务部署模板,实现配置与镜像解耦
  • 构建 Prometheus + Grafana + ELK 可观测体系,推动 Harbor + Trivy 镜像安全扫描
  • 优化 ACK 集群 HPA 与资源配额,结合定时扩缩容降本
技术栈
阿里云 ACKKubernetesDocker HelmMSE NacosDTSRDS JenkinsHarborTrivyPrometheus GrafanaELKAnsible
🏗️系统架构
微服务上云后的整体架构与分层
🌐 接入层
SLB 负载均衡
Ingress 入口网关
📦 ACK 编排层(微服务)
API 网关
统一认证
用户权限
业务服务
任务调度
MSE Nacos 注册/配置中心
💾 数据与中间件层
RDS MySQL
Redis
OSS 对象存储
🔍 可观测 & 交付层
Prometheus + Grafana
ELK 日志
Jenkins CI/CD
Harbor + Trivy
⚙️核心工作详解
迁移改造中的关键技术动作
① 微服务容器化改造

将原虚拟机上的 Spring Cloud 微服务逐个容器化:编写多阶段 Dockerfile 减小镜像体积,对接 Nacos 注册中心实现服务发现,配置中心实现配置外置。迁移后服务可弹性扩缩、快速回滚。

② Helm 多环境部署模板

为每个微服务编写 Helm Chart,通过 values 文件分环境覆盖(dev/test/staging/prod),实现「同一份 Chart、多套环境」。镜像 tag 与配置解耦,发布只需切换 values。

# 同一 Chart 用不同 values 部署到不同环境 helm upgrade --install user-service ./charts/user-service \ -f values-prod.yaml \ # 生产环境配置覆盖 --set image.tag=v1.8.2 \ # 镜像版本与配置解耦 -n prod
③ 可观测体系

Prometheus 采集各微服务 JVM 指标(堆内存、GC、线程)、接口响应耗时、Nacos 注册状态;Grafana 出大盘;ELK 统一日志检索。制定分级告警规则,缩短故障发现时间。

④ 镜像安全 & 自动化交付

Harbor + Trivy 做镜像漏洞扫描,强化镜像准入(高危漏洞阻断推送);Ansible Playbook 统一管理多环境基础配置,缩短新环境上线时间。

⑤ 弹性伸缩与降本

配置 HPA 基于 CPU/内存自动扩缩容;结合业务峰谷做定时扩缩容(上班前扩、夜间缩);优化 resources requests/limits 提升资源利用率,降低 ACK 月均费用。

📅迁移实施全流程
从虚拟机到 ACK,如何在不停机的前提下逐个服务灰度迁移
迁移总原则:灰度、可回退、不停机

不做停机全切,而是新旧并行、逐个微服务迁移。ACK 上的新实例和虚拟机上的旧实例同时注册到同一个注册中心,靠注册中心做服务发现,流量逐步从旧实例切到新实例。每个服务迁完验证稳定,再迁下一个,任何一步出问题都能立刻切回旧实例。

这是整个项目最该讲清的点:迁移过程中业务一直在线,靠的是"注册中心 + 新旧共存 + 逐步切流"。
阶段一 · 准备
云上基础设施与注册中心打通
先在阿里云开好 ACK 集群、RDS、Redis、MSE(托管 Nacos),全部放在同一个 VPC,保证 ACK 里的新实例和虚拟机旧实例能互通。关键一步:让虚拟机上的旧服务和 ACK 里的新服务注册到同一个 Nacos,这是新旧共存、流量可切的前提。
VPC 打通MSE NacosRDS/Redis
阶段二 · 容器化
微服务容器化改造
给每个微服务写多阶段 Dockerfile:构建阶段编译,运行阶段只放产物,镜像更小更安全。配置从代码里剥离,改为从 Nacos 配置中心或环境变量注入,实现"配置外置、镜像不可变"。
# 多阶段 Dockerfile:构建与运行分离,减小镜像 FROM maven:3.9 AS build COPY . /src RUN cd /src && mvn -q package -DskipTests # 构建阶段编译 FROM openjdk:17-jdk-slim # 运行阶段只放产物 COPY --from=build /src/target/app.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"]
多阶段构建配置外置
阶段三 · 试点
选非核心服务先迁,跑通全链路
挑一个非核心、低风险的服务(比如报表服务)先迁,在 ACK 部署后观察它能否正常注册到 Nacos、被其他服务调用、连上 RDS/Redis。这一步是验证"迁移这条路走得通",把坑在非核心服务上先踩完。
# ACK 上部署试点服务,确认能注册到 Nacos helm install report-svc ./charts/report-svc -n prod \ --set nacos.addr=mse-nacos:8848 # 指向同一个 Nacos # 验证:在 Nacos 控制台看到 ACK 实例和 VM 实例同时在线
试点Nacos 注册
阶段四 · 数据层迁移
用 DTS 把数据库平滑迁到 RDS
数据是最不能丢的。用阿里云 DTS 做全量+增量同步,让自建库的数据持续同步到 RDS,两边数据保持一致。等同步追平、业务低峰期,把应用的数据库连接切到 RDS,确认无误后停掉旧库同步。整个过程业务几乎无感知。
# 数据迁移的关键顺序(DTS 同步 → 低峰切流 → 验证) 1. DTS 全量迁移历史数据 → RDS 2. DTS 增量同步(持续追平新产生的数据) 3. 低峰期:应用连接串切到 RDS,旧库只读 4. 验证数据/业务正常后,停 DTS、下线旧库
DTSRDS增量同步
阶段五 · 逐个切流
核心服务逐个迁移并切流量
核心服务(网关/认证/权限/业务/任务调度)一个个迁。每个服务:先在 ACK 起新实例并注册到 Nacos(此时新旧同时在线、各承担部分流量)→ 观察新实例日志和监控正常 → 逐步把旧实例下线,流量自然全转到 ACK 新实例。出问题就把旧实例拉回来,秒级回退。
# 单个服务的切流过程 1. ACK 部署新实例 → 注册 Nacos(新旧实例并存,各分流量) 2. 观察新实例:监控、日志、接口成功率正常 3. 旧 VM 实例从 Nacos 注销(下线)→ 流量全转新实例 # 回退:旧实例重新注册即可立刻接回流量
新旧共存逐步切流秒级回退
阶段六 · 体系建设
可观测、安全、弹性收尾
全部迁完后补齐运维体系:Prometheus+Grafana+ELK 监控各服务 JVM/接口/Nacos 注册状态;Harbor+Trivy 镜像扫描准入;配 HPA + 定时扩缩容做弹性降本。至此从"能跑"到"好运维"。
PrometheusELKTrivyHPA
🧩迁移中的关键难题
真实迁移会遇到的坑与处理方式
难题①:新旧实例怎么共存、流量怎么平滑切

核心靠 Nacos 注册中心。新旧实例注册到同一个 Nacos,消费方通过 Nacos 做服务发现和负载均衡,自然把流量分摊到新旧实例。下线旧实例就是从 Nacos 注销,流量平滑转移,不用改任何调用方代码。

难题②:数据库迁移怎么不丢数据

用 DTS 全量+增量同步保证数据一致,切换放在业务低峰期,切换前反复校验两边数据。保留旧库一段时间作为兜底,确认稳定后再下线。最忌讳的是没有增量同步就直接切,会丢迁移期间产生的数据。

难题③:配置散落在虚拟机各处

虚拟机时代配置经常硬编码或散在各机器的配置文件里。迁移时统一收口到 Nacos 配置中心和 Helm values,按环境隔离。这一步顺带解决了原来"多环境配置不一致"的老问题。

难题④:怎么保证迁移可回退

每一步都留退路:旧实例在确认新实例稳定前不删、旧库切换后保留只读一段时间、镜像版本可追溯。任何阶段出问题都能切回上一个稳定状态,这是敢在生产做迁移的底气。

📈项目成果
迁移前后对比(数值请按实际填写)
发布效率
显著提升
扩容时间
分钟级
云资源费用
↓ 月均
高危漏洞修复率
↑ 提升
建议把这里换成你能背出来的具体数字,比如「发版周期从 X 小时缩到 Y 分钟」「云费用月均降 Z%」,面试官最认量化成果。
🎤面试项目介绍话术
约 60 秒口述脚本
💬 推荐话术 · 60秒版本
"我介绍一下做过的一个微服务云原生上云项目(停顿) 客户的企业管理系统原来跑在虚拟机上,痛点很明确:发版慢、扩容难、多环境配置乱。 我作为运维主导,把核心微服务容器化改造后迁到阿里云 ACK。 迁移最关键的是不能停机,我用的是新旧并行、逐个服务灰度迁移的方案:ACK 新实例和虚拟机旧实例注册到同一个 Nacos,逐步切流量,每个服务迁完验证稳定再迁下一个,出问题能秒级切回。 数据库这块用 阿里云 DTS 做全量加增量同步平滑迁到 RDS,低峰期切换,保证数据不丢。 注册中心用 MSE 托管 Nacos,省去自建高可用的运维成本。 部署用 Helm 多环境模板,镜像配置解耦;可观测搭了 Prometheus + Grafana + ELK;镜像安全用 Harbor + Trivy 扫描准入。 最后通过 HPA 加定时扩缩容优化资源降本。整体迁移全程业务不中断,发版和扩容能力都明显提升。"
面试常见问题
点击展开查看答题思路(请核对真实性)
Q1为什么选阿里云 ACK,而不是自建 K8s 集群?+
  • 运维成本:自建 K8s 要自己维护 master 高可用、etcd 备份、网络插件、升级,ACK 托管了 master 控制面,运维只管 Worker 和业务。
  • 云产品集成:ACK 和 SLB、RDS、OSS、日志服务无缝对接,省去大量打通工作。
  • 弹性与成本:ACK 支持节点自动伸缩、抢占式实例,配合 HPA 做弹性更顺。
  • 客户诉求:客户本来就在阿里云生态,数据和现有资源都在云上,ACK 是自然选择。
对比点:自建适合数据必须私有化(参考我另一个 RAG 项目就是自建 K8s);上云适合追求交付速度和运维省心的场景。能讲清"什么场景选什么"是加分项。
Q2Helm 多环境是怎么管理的?values 怎么组织?+
  • 一套 Chart:每个微服务一个 Chart,模板里用变量占位,不写死任何环境相关的值。
  • 分环境 values:values-dev / values-test / values-staging / values-prod,分别覆盖副本数、资源配额、Nacos 地址、域名等差异项。
  • 镜像与配置解耦:镜像 tag 通过 --set 在发布时传入,配置在 values 里,互不影响。
  • 敏感信息:密码类不进 values,走 K8s Secret 或 Nacos 加密配置。
追问准备:可能被问"为什么不用 Kustomize"——可以答 Helm 的模板化和版本管理(release 历史、回滚)更适合微服务多、发布频繁的场景。
Q3微服务上云后,一个服务起不来怎么排查?+

按先定位根因再解决的思路,从外到内逐层看:

  • Pod 状态:kubectl get pod 看是 Pending / CrashLoopBackOff / ImagePullBackOff,不同状态指向不同问题。
  • 事件:kubectl describe pod 看 Events,调度失败/拉镜像失败/探针失败一目了然。
  • 日志:kubectl logs(崩溃看 --previous)定位应用层报错。
  • 依赖:看是不是 Nacos 注册不上、连不上 RDS/Redis、配置缺失。
  • 探针:readiness/liveness 配置不当会导致刚启动就被杀,检查探针延迟和阈值。
常见根因:Pending 多半是资源不够或节点亲和性冲突;CrashLoopBackOff 多半是配置错或依赖没就绪;ImagePullBackOff 检查 Harbor 镜像和拉取凭证。
Q4HPA 弹性伸缩怎么配?为什么还要定时扩缩容?+
  • HPA 配置:基于 CPU/内存利用率设目标值(如 CPU 70%),设 min/max 副本数,超阈值自动扩、低于则缩。
  • HPA 的短板:它是被动响应,流量突增时扩容有滞后(要等指标采集+扩容+就绪),高峰瞬间可能撑不住。
  • 定时扩缩补位:企业办公系统有明显峰谷,上班前定时扩容预热,夜间定时缩容省钱,主动避开 HPA 的滞后。
  • 组合用:定时保底 + HPA 应对突发,两者互补。
Q5Trivy 镜像扫描是怎么落地的?扫出高危漏洞怎么处理?+
  • 扫描时机:CI 流水线里镜像 build 完、推 Harbor 前先 Trivy 扫一遍;Harbor 自带扫描做二次准入。
  • 准入策略:设置高危/严重漏洞阻断推送,让有问题的镜像进不了仓库。
  • 漏洞处理:优先升级基础镜像和依赖版本;无法升级的评估是否可利用、加白名单并记录;推动用更小的基础镜像(如 distroless/alpine)减少攻击面。
  • 结果:高危漏洞修复率提升,通过安全合规审计。
Q6从虚拟机迁到 ACK,怎么保证业务不中断?+

核心是新旧并行、逐个服务灰度迁移,不做停机全切:

  • 同一注册中心:ACK 新实例和虚拟机旧实例注册到同一个 Nacos,消费方通过服务发现同时看到两边。
  • 逐步切流:新实例上线后先和旧实例共存、各分一部分流量,观察新实例稳定后,把旧实例从 Nacos 注销,流量平滑全转到新实例。
  • 逐个服务:一次只迁一个服务,迁完验证再迁下一个,缩小爆炸半径。
  • 可回退:任何一步出问题,旧实例重新注册立刻接回流量。
这是 ACK 项目最容易被深挖的题。答题落脚到"注册中心做服务发现 + 新旧共存 + 逐步切流",体现你考虑过生产风险。
Q7数据库怎么从自建库迁到 RDS?怎么保证不丢数据?+
  • DTS 同步:用阿里云 DTS 做全量+增量同步,先把历史数据迁过去,再持续同步新产生的数据,两边保持一致。
  • 低峰切换:等增量追平、选业务低峰期,把应用连接串切到 RDS。
  • 切前校验:切换前反复校验两边数据量和关键表一致。
  • 保留兜底:切换后旧库保留只读一段时间,确认稳定再下线。
最大的坑:没有增量同步就直接切,会丢迁移期间产生的数据。主动提这点是加分项。
Q8为什么不直接停机迁移?停机不是更简单吗?+
  • 业务不允许:企业办公系统多部门在用,停机影响面大,很难找到能停的窗口。
  • 风险集中:停机全切是"一把梭",真出问题影响所有服务,回退也慢。
  • 灰度更可控:逐个迁、逐步切流,问题在单个服务上就暴露,影响小、回退快。
  • 权衡:停机迁移确实简单,但只适合能接受停机、规模小的场景;生产关键系统应优先灰度。
Q9Nacos 为什么用阿里云 MSE 托管,不自建?+
  • 省运维:自建 Nacos 集群要自己保高可用、做备份、处理升级;MSE 托管这些都由云厂商负责。
  • 低延迟:MSE 和 ACK 在同一 VPC,服务注册发现延迟低。
  • 稳定性:注册中心是微服务的命脉,托管版本可用性更有保障。
  • 判断力:体现"该自建的自建、该用云产品的用云产品"——注册中心这种基础设施交给托管更划算。
追问准备:可能被问"自建 Nacos 怎么做高可用"——可答集群模式至少3节点 + 数据持久化到 MySQL,但强调托管省去这些运维成本。