Memos: 高风险的 ‘保留最新 N 个镜像’

“保留最新 N 个镜像” 策略听着简单明了,但极易引发线上事故,它的问题不在于镜像本身,而是系统里的很多东西并不会因为时间推移而失去价值。

  1. 正式、测试环境共用镜像仓库(正式环境的镜像 1.2.0,而测试环境使用 dev-bcba1f9 这类 Hash Tag),保留最新 N 个镜像,测试环境部署几次就会把正式环境的镜像挤掉;
  2. 曾经手动构建的古董镜像,默默支撑着一些无人维护的服务,被清理掉后可能会永久丢失;
  3. 同一套代码可能作为多个业务后端独立部署,各服务升级节奏不同,即使使用标准版本号,线上仍可能长期存在大量历史版本镜像;
  4. ECR 允许 Helm Chart 以 OCI 形式存储,它也会被生命周期策略误伤,躺在仓库镜像列表的第 N 页之后,丢失后难以感知,直到下一个人部署;

这些因素影响之下,配置 ‘保留最新 N 个镜像’ 后,集群内服务很可能在下一次扩容、迁移或重调度时突然爆炸,如果非要自动化清理,更安全的做法是基于 “最后一次拉取时间” 且 “未被任何运行中 Pod 引用”。