将一套已经基于容器部署的业务系统搬迁到云端,并不是简单把镜像上传就结束。云端环境与本地机房在网络边界、存储模型、权限体系上都有差异,若直接照搬原有编排文件,极易出现服务无法联通、数据丢失或扩缩容失效的问题。真正的迁移工作应当从资产清点开始,逐步推进到云上运行时治理。

迁移前的资产梳理与架构评估
在动手之前,第一步是厘清当前容器化应用到底包含了哪些组件。很多团队只盯着业务容器的镜像,却忽略了背后的数据库、消息队列、文件存储以及各类第三方SDK的调用关系。对于无状态服务,迁移相对轻松;但如果有容器直接挂载了宿主机目录来存用户上传文件,或者依赖本地Redis做会话保持,这部分就必须先在架构层面做改造。否则上云后容器被调度到不同节点,数据就找不到了。
另一个容易被忽视的点是镜像本身的来源与构建链路。你需要确认基础镜像是否来自公共仓库、内部是否做过安全加固、构建时是否写死了本地域名或IP。我们建议使用 docker history 和 trivy 这类工具先扫描一遍,把包含敏感信息或已知漏洞的层标记出来。同时整理一份服务依赖表,标明哪些容器之间用内部域名通信,哪些需要对外暴露端口,这将直接决定后续云上网络策略怎么写。
架构评估还要考虑云厂商的服务边界。例如某些托管Kubernetes对NodePort有使用限制,或者弹性容器实例不支持自定义内核参数。提前在测试账号里用最小规格验证核心链路,比正式割接时才发现某个 sysctl 配置不生效要划算得多。这一阶段产出的应该是修订后的部署清单和一份明确的有状态组件上云方案。
镜像与数据向云端的传输实践
镜像传输最常见做法是开通云厂商的容器镜像仓库,然后在本地执行 tag 和 push。但要注意,如果原有镜像名里带了私有仓库地址,需要批量改写。下面这段脚本展示了如何遍历本地镜像并推送到新仓库,同时保留原有语义化标签:
#!/bin/bash
# 定义源仓库前缀和目标仓库前缀
SRC_REGISTRY="registry.local:5000"
DST_REGISTRY="cn-north.ipipp.com/project"
# 获取所有包含源前缀的镜像
for img in $(docker images --format '{{.Repository}}:{{.Tag}}' | grep $SRC_REGISTRY); do
# 提取镜像名和标签
name_tag=${img#$SRC_REGISTRY/}
# 打新标签
docker tag $img $DST_REGISTRY/$name_tag
# 推送到云端
docker push $DST_REGISTRY/$name_tag
done
数据迁移则要根据类型分开处理。关系型数据库通常借助云上DTS工具做全量加增量同步,在割接窗口停写后确认一致性再切换连接串。对象类数据如用户头像、附件,可以直接用 rclone 或厂商提供的迁移代理搬进对象存储桶,并把应用代码里的本地路径改成云存储SDK调用。对于消息队列,建议先在云上建好相同Topic,让生产者双写一段时间,消费者全量切到云端后再停掉旧集群。
传输过程中的网络成本也要算清楚。跨公网拉镜像如果没走专线,不但慢还可能产生流量费。大型企业可以先用物理硬盘邮寄做离线导入,再补增量。中小团队在夜间低峰用压缩传输也能接受。无论哪种方式,传输完必须校验镜像 digest 和文件 md5,防止位翻转导致运行时怪异崩溃。
云上运行时治理与平滑割接
应用真正跑在云上之后,治理重点从“能不能起来”变成“稳不稳、贵不贵”。托管Kubernetes一般配套了监控、日志、告警产品,要把原有 Prometheus 自建方案逐步对接过去,避免两套系统重复采集。通过 HorizontalPodAutoscaler 基于CPU或自定义指标做弹性,比固定副本数更省成本。同时给命名空间设好 ResourceQuota,防止某个服务异常把整个集群资源吃满。
割接阶段强烈建议用蓝绿或金丝雀方式。比如先在云上起一套完整环境,把少量用户流量导过去,观察错误率和延迟。下面是用 Istio 做流量比例的示例配置,先把百分之十的请求发到云上版本:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: order-service-route
spec:
hosts:
- order-service
http:
- route:
- destination:
host: order-service
subset: local
weight: 90
- destination:
host: order-service
subset: cloud
weight: 10
当云上版本连续几天无重大故障,再逐步调高权重直至全部切换。旧环境不要立刻销毁,保留一至两周以备回滚。最后别忘记把CI/CD流水线也迁到云上构建节点,让镜像从提交代码到推送到云仓库形成闭环。整个迁移完成的标准应当是:任何一次发布不再依赖本地机房,且资源账单在预算模型内可控。