容器進階:OCI與容器運行時
什麼是容器運行時(Container Runtime)
Kubernetes節點的底層由一個叫做容器運行時的軟體進行支撐,它負責比如啟停容器 這樣的事情。最廣為人知的容器運行時當屬Docker,但它不是唯一的。
容器運行時分類
- 低級運行時:只負責利用Cgroups和Namespaces等管理容器;
- 高級運行時:負責額外實現管理鏡像的API,包括鏡像格式、鏡像管理(構建、查詢和刪除等)和鏡像共享等;
什麼是OCI
OCI(Open Container Initiative,開放工業標準)的容器運行時規範設定的標準定義了容器運行狀態的描述,以及運行時需要提供的容器管理功能,例如創建、刪除和查看等操作。容器運行時規範不受上層結構綁定,不受限於任何特定作業系統、硬體、CPU架構或公有雲等,從而允許任何人遵循該標準開發應用容器技術。
符合規範的容器運行時
- runc, docker默認的運行時,與宿主機共享內核,利用cgroup做資源隔離,安全性不是很高,由於內核共享,性能最好
- runv,基於hypervisor的容器運行時,有自己單獨的內核,安全性好很多
- kata,被螞蟻收了,號稱「容器的速度,虛擬機的安全」,貌似是基於runv做的
- gvisor,Google搞的,比runc安全,比VM性能要好。有一個用戶空間的內核,會攔截應用程式的系統調用,目前沒有實現所有的系統調用,因此不是所有的應用都可以運行
OCI對Docker的影響
OCI項目啟動後,Docker公司將2014年開源的libcontainer項目移交至OCI組織並進化為runC項目,成為第一個且目前接受度最廣泛的遵循OCI規範的容器運行時實現。
為了兼容OCI規範,Docker項目自身也做了架構調整,自1.11.0版本起,Docker引擎由一個單一組件拆分成了Docker Engine(docker-daemon)、containerd、containerd-shim和runC等4個獨立的項目,並把containerd捐贈給了CNCF。
也就是,目前的Docker不是以前的Docker,技術棧進行了分層:
Docker CLi -> Dockerd -> Containerd -> OCI Implementation