别急着搬 先把镜像账本翻出来
迁移容器化,很多人第一反应是改 YAML、调 Helm、扩节点。镜像?能拉起来就行。这个想法很危险。我见过一个团队,周一上线,周三回滚,发现生产跑的镜像 tag 是 latest,仓库里最新版本已经推到三天后。回滚命令敲下去,拉到的却是另一个东西。现场安静得可怕。
镜像治理不是给领导看的流程。它决定你出事时能不能复现,能不能追责,能不能在十分钟内把服务拉回来。容器化迁移中的镜像治理,说白了就是给每个镜像建立身份、来源、去向和寿命。

最基础的一条:生产环境不要用浮动 tag。latest 可以存在,但别让它进生产部署清单。用不可变 tag,或者直接锁 digest。digest 长得丑,像 sha256:…,可它稳。tag 会被人覆盖,digest 不会。构建流水线里把 git commit、构建号、时间戳写进 tag,别只写 v1、v2、final、final2。真的,final2 这种 tag 我见过太多次。
还有来源。镜像从哪来?是 CI 构建,还是本地 docker build 后 push?后者在迁移初期很常见。短期能跑,长期就是灾难。本地构建的镜像没有统一基座,没有 SBOM,没有扫描记录。等安全部门来问,你只能摊手。
瘦身不是审美 是拉取速度和攻击面
镜像大小这事,平时没人管。迁移到多集群、边缘节点、跨云环境后,拉取时间会教做人。一个 2GB 的镜像,在 100 个节点上滚动更新,就是 200GB 的突发流量。仓库扛不住,节点 disk 也扛不住。
瘦身办法不玄。多阶段构建,把编译工具链留在 builder 阶段,运行阶段只拷二进制和必要配置。基础镜像别盲目追 alpine。alpine 用 musl,某些二进制、Java 应用、Python 原生扩展会踩坑。踩坑后有人干脆换回 ubuntu,镜像又胖回去。取舍点在于:兼容性优先还是体积优先。生产环境,兼容性通常优先。但你可以用 distroless,或者自己维护一个最小基础镜像。

层缓存也要注意。Dockerfile 里先拷 pom.xml 或 package.json,再装依赖,最后拷源码。这样改代码不会让依赖层失效。听起来像老生常谈,可迁移时大量 Dockerfile 是 COPY . . 然后 RUN npm install。每次构建都重装,CI 排队排到怀疑人生。
密钥别打进镜像。哪怕后面删掉,层里还在。用构建参数也不行,docker history 能看到。运行时挂 secret,或者用外部配置中心。别偷懒。
漏洞扫描要接进流水线。不是扫完出个报告就完事。得定规则:严重漏洞阻断,中危限期修,低危记录。扫描器会误报,也会漏报。所以还要有基础镜像更新机制。基础镜像一更新,上层应用镜像得重建。没人重建,扫描结果永远是旧的。
签名和仓库策略 别等被投毒才想起

镜像签名听起来重。其实 cosign 这类工具已经把门槛降了不少。签名解决的是:这个镜像确实来自我们的构建系统,没被中间人换过。迁移到混合云、多租户集群后,这个问题很现实。尤其当你的仓库允许匿名 pull,或者跨团队共享。
仓库策略至少要分清:开发仓库、预发仓库、生产仓库。权限别一锅粥。生产仓库只允许 CI 机器人 push,人不能直接推。删除权限收窄。保留策略按 tag 规则走,比如 release-* 保留一年,dev-* 保留七天。垃圾回收要定期跑。不然仓库会变成一个只进不出的黑洞。
拉取策略也有坑。imagePullPolicy: Always 在每次启动时都去问仓库。仓库抖动时,Pod 起不来。IfNotPresent 省事,但节点上缓存了旧镜像,可能绕过你的更新。折中办法:用 digest 部署,配合节点镜像缓存和 P2P 分发。别小看 P2P,大规模集群里能救命。
迁移之后 治理才刚开始

很多人以为迁移完成就结束了。不。镜像治理是持续动作。新服务加进来,老服务退役,基础镜像升级,CVE 爆发,仓库扩容。每一件都会回头找你。
可以做的事:把镜像元数据写进制品库,和 CMDB 或服务目录关联。知道哪个镜像对应哪个服务、哪个 commit、哪个负责人。别只靠 tag 猜。策略即代码,用 OPA 或 Kyverno 在准入阶段拦截不合规镜像。禁止 latest,禁止无签名,禁止来自未知仓库。执行时会有阻力。开发会说影响效率。那就给一条快速通道:紧急发布可以例外,但必须记录,事后补签。
成本也要看。跨云复制镜像,流量费不便宜。保留太多历史 tag,存储费也涨。但删太狠,回滚时找不到。保留策略得和发布节奏匹配。三个月一次发布的团队,和一天十次发布的团队,策略不可能一样。照抄大厂方案,容易水土不服。
最后说个真事。有个小团队迁移时,把所有镜像塞进一个仓库,权限给所有人。某天一个测试同学误删了生产基础镜像,连锁反应,第二天上午整个发布流程瘫了。恢复花了大半天。事后他们做了三件事:仓库分权、tag 保护、删除审批。都不复杂。可之前就是没人做。
容器化迁移中的镜像治理,不需要一上来就搞平台。先把 tag 和 digest 管住,把构建来源统一,把扫描接上,把仓库权限收紧。顺序可以调,但别跳过。跳过的地方,迟早会以故障的形式回来。到时候就不是改 YAML 能解决的了。