一、CRI標準
起初,Docker是事實上的容器技術標準,Kubernetes v1.5之前的代碼中直接調用Docker API,實現容器運行時的相關操作。
后來,為了標準化下層容器運行時的差異(docker\\rkt\\kata containers),2016年,Kubernetes提出了CRI(Container Runtime Interface,容器運行時接口)標準,制定了Kubernetes kubelet與容器運行時的交互接口。容器運行時如果想要集成到Kubernetes平臺,就需要實現這套接口。如圖所示,CRI shim負責實現CRI接口,并將CRI請求轉換為容器運行時的請求。
CRI接口包括RuntimeService和ImageService兩個服務,前者提供管理Pod和容器生命周期的gRPC接口,后者提供提取、檢查和刪除鏡像的gRPC接口。
service RuntimeService {
//容器操作rpc
CreateContainer (...) returns (...) {}
rpc ListContainers (...) returns (...) {}
rpc RemoveContainer (...) returns (...) {}
rpc StartContainer (...) returns (...) {}
rpc StopContainer (...) returns (...) {}
//Pod沙箱操作,可能對應多個容器
rpc ListPodSandbox (...) returns (...) {}
rpc RemovePodSandbox(...) returns (...) {}
rpc RunPodSandbox (...) returns (...) {}
rpc StopPodSandbox (...) returns (...) {}
}
二、CRI實現方案
1. Dockershim
標準提出之后,Docker并未實現CRI接口(如日中天,不合作),Kubernetes將CRI接口轉換為Docker API,以支持Docker容器。這部分適配工作由shim(墊片)來完成,稱為dockershim,并內置在kubelet模塊中(kubernetes原生支持)。
此時的調用關系為:
Kubelet-->dockershim-->dockerd(daemon)-->containerd-->containerd-shim-->runc。
不難看出,這個調用鏈很長,可以直接調用containerd來實現相關功能。
2020年,Kubernetes計劃移除dockershim。
2022年,Kubernetes v1.24版本,將dockershim移除(不再提供原生支持)。
需要注意到dockershim也調用了CNI接口。
更為具體的CNI接口調用為:
2. CRI-containerd/containerd
containerd提供了容器的生命周期管理、鏡像管理等功能。在Docker 1.11中引入,containerd會為每個容器創建一個containerd-shim,以用來管理相應容器的生命周期。2016年12月,Docker公司將其拆分為獨立組件,并于2017年3月捐贈給CNCF。
由dockershim部分可知,kubernetes CRI接口調用過長,可采用直接調用containerd的方式。
kubernetes分兩個版本進行了實現:containerd1.0版本中,通過CRI-containerd進行CRI的適配。
containerd 1.1版本直接將把適配邏輯寫到了containerd進程中,完成CRI Services到Meta services、Runtime service、Storage service的適配。
這里的containerd提供了CRI shim的能力:將CRI請求轉換成3個服務的調用,創建出runc容器。
3. CRI-O
CRI-O也就是Container Runtime Interface和Open Container Initiative的組合,源于Kubernetes孵化器項目Open Container Initiative Daemon(OCID)。
作為Kubernetes CRI的一種實現方案,本質上是封裝了OCI接口,對外提供CRI 服務。功能包括容器運行時的管理和鏡像的管理。
三、小結
四、參考資料
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
https://github.com/containerd/containerd/blob/main/docs/historical/cri/proposal.md
https://cri-o.io/
https://github.com/cri-o/cri-o
https://developer.aliyun.com/article/1010319
https://mp.weixin.qq.com/s/--t74RuFGMmTGl2IT-TFrg
https://iximiuz.com/en/posts/journey-from-containerization-to-orchestration-and-beyon
-
API
+關注
關注
2文章
1501瀏覽量
62017 -
容器
+關注
關注
0文章
495瀏覽量
22061 -
Docker
+關注
關注
0文章
458瀏覽量
11856
發布評論請先 登錄
相關推薦
Kubernetes架構和核心組件組成 Kubernetes節點“容器運行時”技術分析
![<b class='flag-5'>Kubernetes</b>架構和核心組件組成 <b class='flag-5'>Kubernetes</b>節點“<b class='flag-5'>容器</b><b class='flag-5'>運行時</b>”技術分析](https://file.elecfans.com/web1/M00/C7/BC/o4YBAF9toR2AWO8_AADnz8AsUFg728.png)
紫金橋組態軟件新的功能_運行時組態
![紫金橋組態軟件新的功能_<b class='flag-5'>運行時</b>組態](https://file.elecfans.com/web2/M00/4A/04/pYYBAGKhvImAf6BOAAAwEeaeZnk806.png)
CRI 與 ShimV2:一種 Kubernetes 集成容器運行時的新思路
k8s容器運行時演進歷史
![k8s<b class='flag-5'>容器</b><b class='flag-5'>運行時</b>演進歷史](https://file.elecfans.com/web1/M00/DD/EF/o4YBAGAY6MeARj6nAAHhKQyTw2M620.png)
如何高效測量ECU的運行時間
Go運行時:4年之后
怎樣避免電力電容器運行時漏油
iSulad+Kuasar:管理面資源消耗銳減99%的新一代統一容器運行時解決方案
![iSulad+Kuasar:管理面資源消耗銳減99%的新一代統一<b class='flag-5'>容器</b><b class='flag-5'>運行時</b>解決方案](https://file1.elecfans.com/web2/M00/82/57/wKgZomRKHg6ABzKEAAAcKtGQ03M642.png)
評論