容器化迁移中的镜像治理 跑过迁移项目才知道的坑

上周在南京机房蹲到一个刚迁移完核心业务的运维团队,整个团队三天没合眼,不是因为业务挂了,是镜像仓库的磁盘写满了。

几百个G的镜像堆在那,一半是测试的时候打了忘删的,一半是同一个服务反复打出来的,连基础系统层都没复用。

没人想过这茬。

大家默认容器化就是把应用打个包丢去K8s,镜像?那不是打包的时候自动生成的东西吗。容器化迁移中的镜像治理,从来都不是迁移完之后才要考虑的事。

别把镜像当一次性安装包

说白了,很多团队对镜像的认知,还停留在当年打jar包、打RPM的阶段。打出来的包只要能跑就行,扔在服务器上没人管。容器时代这逻辑直接撞墙。

镜像的层是共享的,如果你每次打镜像都从ubuntu基础镜像开始装依赖,那哪怕你改了一行代码,拉镜像的时候还是要把几个G的基础层全拉一遍,节点扩容的时候能等到你怀疑人生。

上个月碰过一个做电商的团队,大促前扩容订单服务,12个节点同时拉镜像,仓库带宽直接打满,整个扩容流程卡了四十多分钟,差点错过预热窗口。

他们那会才想起来,自己的镜像里塞了全套的编译工具、测试依赖,连没用到的字体库都没删。

电商大促K8s节点拉镜像带宽打满监控截图
电商大促K8s节点拉镜像带宽打满监控截图

麻烦在于,镜像不是虚拟机的快照,你塞进去的每一寸没用的东西,最后都会变成仓库的存储成本、拉取的带宽成本、节点的磁盘成本。

很多人算迁移成本的时候,只算服务器的钱,从来没算过镜像仓库的钱,算过节点拉镜像的时间成本。有的团队算下来,一年花在镜像仓库上的存储和带宽费用,够给运维团队发半年奖金。

治理不是删镜像 是先理清楚谁在生产镜像

别一上来就搞什么镜像治理平台,先去翻仓库的日志,看看谁在往里面推东西。

我见过最离谱的情况,开发把自己本地调试好的镜像直接推到生产仓库,版本号写的是latest,连个tag都没有。运维早上起来发版,拉到的镜像里还带着开发本地的.ssh文件夹。

这事没那么玄。

你不需要什么复杂的流程,先把推镜像的权限收住就行。

肯定有人跳出来说,我开发要快速迭代,收了权限会不会拖慢效率?那就给测试仓库开宽松权限,生产仓库必须过CI扫描,必须有明确的版本tag,必须走审批。

刚开始肯定有人骂,说以前十分钟能搞定的事现在要走半小时流程。但你要算,一次因为乱推镜像导致的生产故障,损失的是多少个半小时?

多层镜像层复用关系示意图
多层镜像层复用关系示意图

很多人说镜像治理就是给镜像瘦身,把没用的层删掉。是,但不全是。

你得先搞清楚,哪些镜像是正在用的,哪些是半年前打了之后从来没拉过的。有的仓库里存了上千个镜像,80%都是历史版本,连对应的代码仓库都已经归档了,占了快几个T的空间。

没人敢删,怕哪次要回滚的时候找不到。那就给这些镜像打个归档标签,挪到冷存储里,平时不占热仓库的带宽和磁盘,真要回滚的时候再拉出来,成本能降七成。

镜像治理的核心不是把所有镜像都管得死死的,是把不同优先级的镜像放到不同的存储层级里。

迁移前的治理 比迁移后的补救省一半钱

很多团队的顺序搞反了。先把业务全迁到K8s,跑了半年,仓库炸了,才想起来要做镜像治理。

那时候你要处理的是已经跑在生产里的几千个镜像,每个都不能随便动,要兼容,要回滚,要做扫描,工作量是迁移前的三倍都不止。

去年碰到一个做金融的客户,一开始觉得镜像治理是小事,迁移的时候直接把虚拟机里的环境全打了镜像,迁完跑了三个月,仓库存了12T的镜像,每个月的存储成本十几万,还要应付合规的漏洞扫描,每个镜像都要扫,扫出来的漏洞要修,要重新打镜像,整个运维团队一半的精力都耗在这上面。

要是迁移前花两周时间,把基础镜像统一做一遍瘦身,把公共依赖抽成公共的基础层,把没用的包全删掉,后面的工作量能少一大半。

说实话,别相信什么“一键治理”的工具。工具是帮你提效的,不是帮你做决策的。你得先搞清楚自己的业务需要什么,哪些镜像要留,哪些要删,哪些要做扫描,哪些可以放到冷存储。

不过话说回来,这事没什么捷径,就是蹲在仓库旁边翻日志,翻个一周,你就知道问题出在哪了。别一上来就买几十万的治理平台,很多时候你写个脚本,把超过半年没拉过的镜像列出来,挨个问对应的负责人要不要留,就能清掉60%的无用镜像。

前几天碰到那个被仓库磁盘搞崩溃的运维团队,他们现在迁移前第一件事,就是先给所有要迁的服务打个镜像,算一下大小,看看有没有可以复用的公共层。上次去他们机房,仓库的磁盘使用率从98%降到了22%,扩容的时候拉镜像的时间从四十分钟降到了两分钟。

没人再把镜像当随便扔的安装包了。

免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:容器化迁移中的镜像治理 跑过迁移项目才知道的坑
文章链接:https://www.itcdj.com/it/130.html