背景
pytorch鏡(jing)像(xiang)從pytorch docker hub(開發(fa)版(ban)本,大小(xiao)大概17G)拉取(qu),在該(gai)鏡(jing)像(xiang)的(de)基礎上開發(fa)會(hui)持續增大鏡(jing)像(xiang)大小(xiao),導致(zhi)的(de)結果就是(shi)大小(xiao)可能(neng)到20G。在實際生產中發(fa)現拉取(qu)鏡(jing)像(xiang)的(de)時間可能(neng)會(hui)超過10分鐘,原因(yin)是(shi)pod分配的(de)節點未有(you)鏡(jing)像(xiang)緩存,從最(zui)底(di)層開始拉取(qu)。
kubelet清理(li)docker鏡像(xiang)(xiang)的(de)機制。在(zai)磁(ci)(ci)盤使用(yong)率(lv)超出(chu)設(she)定(ding)上(shang)限(xian)后,首(shou)先,通(tong)過(guo) CRI 容(rong)(rong)(rong)器運(yun)行時接口讀取(qu)節點上(shang)的(de)所有(you)鏡像(xiang)(xiang)以及(ji) Pod 容(rong)(rong)(rong)器;然后,根據現有(you)容(rong)(rong)(rong)器列表過(guo)濾出(chu)那些已經(jing)不被(bei)任何容(rong)(rong)(rong)器所使用(yong)的(de)鏡像(xiang)(xiang);接著,按照(zhao)(zhao)鏡像(xiang)(xiang)最(zui)近(jin)被(bei)使用(yong)時間(jian)排序,越(yue)久被(bei)用(yong)到的(de)鏡像(xiang)(xiang)越(yue)會(hui)被(bei)排在(zai)前面,優先清理(li);最(zui)后,就(jiu)按照(zhao)(zhao)排好的(de)順序逐個清理(li)鏡像(xiang)(xiang),直到磁(ci)(ci)盤使用(yong)率(lv)降(jiang)到設(she)定(ding)下限(xian)(或者已經(jing)沒有(you)空閑(xian)鏡像(xiang)(xiang)可以清理(li))。
根據kubelet的清理(li)策略以及當前(qian)鏡(jing)(jing)像(xiang)的大小,在數據盤使(shi)用率超過(guo)一定的限額,kubelet會清理(li)最近(jin)最久未(wei)使(shi)用的鏡(jing)(jing)像(xiang)。后續(xu)再(zai)拉取該(gai)鏡(jing)(jing)像(xiang),并且沒有共用層(ceng),就會重新拉取。
鏡像分層
cuda, 框架以及(ji)ide多(duo)種組合關系(xi),造成鏡像種類太多(duo)。

規則:最小(xiao)的鏡像應該滿足大部(bu)分人的需(xu)求。不經常(chang)改變的放置底層,不常(chang)用(yong)功能放置高層。在實際使用(yong)conda環境下的cudatoolkit已(yi)經能滿足大部(bu)分的要求。
- 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應用程序
