背景
pytorch镜像从pytorch docker hub(开发版本,大小大概17G)拉取,在该镜像的基础上开发会持续增大镜像大小,导致的结果就是大小可能到20G。在实际生产中发现拉取镜像的时间可能会超过10分钟,原因是pod分配的节点未有镜像缓存,从最底层开始拉取。
kubelet清理docker镜像的机制。在磁盘使用率超出设定上限后,首先,通过 CRI 容器运行时接口读取节点上的所有镜像以及 Pod 容器;然后,根据现有容器列表过滤出那些已经不被任何容器所使用的镜像;接着,按照镜像最近被使用时间排序,越久被用到的镜像越会被排在前面,优先清理;最后,就按照排好的顺序逐个清理镜像,直到磁盘使用率降到设定下限(或者已经没有空闲镜像可以清理)。
根据kubelet的清理策略以及当前镜像的大小,在数据盘使用率超过一定的限额,kubelet会清理最近最久未使用的镜像。后续再拉取该镜像,并且没有共用层,就会重新拉取。
镜像分层
cuda, 框架以及ide多种组合关系,造成镜像种类太多。
规则:最小的镜像应该满足大部分人的需求。不经常改变的放置底层,不常用功能放置高层。在实际使用conda环境下的cudatoolkit已经能满足大部分的要求。
- next layer + ide : 安装 在线ide
- conda: cuda toolkit : 安装anaconda,创建base基础环境,包括基本的python包和cuda toolkit
- next layer + conda: torch : 安装 ai框架
- next layer + plugin : 安装 插件
- next layer + cuda runtime: 安装 cuda 运行时包在系统环境
- next layer + cuda complier: 安装 cuda 编译工具在系统环境, 可以从源代码编译出cuda应用程序