一、CRI標(biāo)準(zhǔn)
起初,Docker是事實上的容器技術(shù)標(biāo)準(zhǔn),Kubernetes v1.5之前的代碼中直接調(diào)用Docker API,實現(xiàn)容器運(yùn)行時的相關(guān)操作。
后來,為了標(biāo)準(zhǔn)化下層容器運(yùn)行時的差異(docker\\rkt\\kata containers),2016年,Kubernetes提出了CRI(Container Runtime Interface,容器運(yùn)行時接口)標(biāo)準(zhǔn),制定了Kubernetes kubelet與容器運(yùn)行時的交互接口。容器運(yùn)行時如果想要集成到Kubernetes平臺,就需要實現(xiàn)這套接口。如圖所示,CRI shim負(fù)責(zé)實現(xiàn)CRI接口,并將CRI請求轉(zhuǎn)換為容器運(yùn)行時的請求。

CRI接口包括RuntimeService和ImageService兩個服務(wù),前者提供管理Pod和容器生命周期的gRPC接口,后者提供提取、檢查和刪除鏡像的gRPC接口。
service RuntimeService {
//容器操作rpc
 CreateContainer (...) returns (...) {}
 rpc ListContainers  (...) returns (...) {}
 rpc RemoveContainer (...) returns (...) {}
 rpc StartContainer  (...) returns (...) {}
 rpc StopContainer (...) returns (...) {}
 //Pod沙箱操作,可能對應(yīng)多個容器
 rpc ListPodSandbox (...) returns (...) {}
 rpc RemovePodSandbox(...) returns (...) {}
 rpc RunPodSandbox (...) returns (...) {}
 rpc StopPodSandbox (...) returns (...) {}
 }
二、CRI實現(xiàn)方案
1. Dockershim
標(biāo)準(zhǔn)提出之后,Docker并未實現(xiàn)CRI接口(如日中天,不合作),Kubernetes將CRI接口轉(zhuǎn)換為Docker API,以支持Docker容器。這部分適配工作由shim(墊片)來完成,稱為dockershim,并內(nèi)置在kubelet模塊中(kubernetes原生支持)。
此時的調(diào)用關(guān)系為:
Kubelet-->dockershim-->dockerd(daemon)-->containerd-->containerd-shim-->runc。不難看出,這個調(diào)用鏈很長,可以直接調(diào)用containerd來實現(xiàn)相關(guān)功能。
2020年,Kubernetes計劃移除dockershim。
2022年,Kubernetes v1.24版本,將dockershim移除(不再提供原生支持)。
需要注意到dockershim也調(diào)用了CNI接口。

更為具體的CNI接口調(diào)用為:

2. CRI-containerd/containerd
containerd提供了容器的生命周期管理、鏡像管理等功能。在Docker 1.11中引入,containerd會為每個容器創(chuàng)建一個containerd-shim,以用來管理相應(yīng)容器的生命周期。2016年12月,Docker公司將其拆分為獨(dú)立組件,并于2017年3月捐贈給CNCF。

由dockershim部分可知,kubernetes CRI接口調(diào)用過長,可采用直接調(diào)用containerd的方式。

kubernetes分兩個版本進(jìn)行了實現(xiàn):containerd1.0版本中,通過CRI-containerd進(jìn)行CRI的適配。

containerd 1.1版本直接將把適配邏輯寫到了containerd進(jìn)程中,完成CRI Services到Meta services、Runtime service、Storage service的適配。

這里的containerd提供了CRI shim的能力:將CRI請求轉(zhuǎn)換成3個服務(wù)的調(diào)用,創(chuàng)建出runc容器。
3. CRI-O
CRI-O也就是Container Runtime Interface和Open Container Initiative的組合,源于Kubernetes孵化器項目Open Container Initiative Daemon(OCID)。
作為Kubernetes CRI的一種實現(xiàn)方案,本質(zhì)上是封裝了OCI接口,對外提供CRI 服務(wù)。功能包括容器運(yùn)行時的管理和鏡像的管理。
三、小結(jié)

四、參考資料
https://github.com/containerd/containerd/blob/main/docs/getting-started.mdhttps://github.com/containerd/containerd/blob/main/docs/historical/cri/proposal.mdhttps://cri-o.io/https://github.com/cri-o/cri-ohttps://developer.aliyun.com/article/1010319https://mp.weixin.qq.com/s/--t74RuFGMmTGl2IT-TFrghttps://iximiuz.com/en/posts/journey-from-containerization-to-orchestration-and-beyon
- 
                                API
                                +關(guān)注關(guān)注 2文章 1994瀏覽量 65888
- 
                                容器
                                +關(guān)注關(guān)注 0文章 521瀏覽量 22759
- 
                                Docker
                                +關(guān)注關(guān)注 0文章 525瀏覽量 13875
發(fā)布評論請先 登錄
如何縮短Vivado的運(yùn)行時間
 
    
Kubernetes架構(gòu)和核心組件組成 Kubernetes節(jié)點“容器運(yùn)行時”技術(shù)分析
 
    
各種容器運(yùn)行的作用是什么
 
    
FPGA運(yùn)行時重構(gòu)的延遲隱藏機(jī)制研究與實現(xiàn)
紫金橋組態(tài)軟件新的功能_運(yùn)行時組態(tài)
 
    
CRI 與 ShimV2:一種 Kubernetes 集成容器運(yùn)行時的新思路
k8s容器運(yùn)行時演進(jìn)歷史
 
    
Go運(yùn)行時:4年之后
怎樣避免電力電容器運(yùn)行時漏油
iSulad+Kuasar:管理面資源消耗銳減99%的新一代統(tǒng)一容器運(yùn)行時解決方案
 
    
ch32v307記錄程序運(yùn)行時間
Xilinx運(yùn)行時(XRT)發(fā)行說明
 
    
 
           
        
 
         什么是Kubernetes容器運(yùn)行時CRI
什么是Kubernetes容器運(yùn)行時CRI 
                 
  
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評論