什麼是容器執行時(Container Runtime)
Kubernetes節點的底層由一個叫做容器執行時的軟體進行支撐,它負責比如啟停容器 這樣的事情。最廣為人知的容器執行時當屬Docker,但它不是唯一的。
容器執行時分類
- 低階執行時:只負責利用Cgroups和Namespaces等管理容器;
- 高階執行時:負責額外實現管理映象的API,包括映象格式、映象管理(構建、查詢和刪除等)和映象共享等;
什麼是OCI
OCI(Open Container Initiative,開放工業標準)的容器執行時規範設定的標準定義了容器執行狀態的描述,以及執行時需要提供的容器管理功能,例如建立、刪除和檢視等操作。容器執行時規範不受上層結構繫結,不受限於任何特定作業系統、硬體、CPU架構或公有云等,從而允許任何人遵循該標準開發應用容器技術。
符合規範的容器執行時
- runc, docker預設的執行時,與宿主機共享核心,利用cgroup做資源隔離,安全性不是很高,由於核心共享,效能最好
- runv,基於hypervisor的容器執行時,有自己單獨的核心,安全性好很多
- kata,被螞蟻收了,號稱“容器的速度,虛擬機器的安全”,貌似是基於runv做的
- gvisor,谷歌搞的,比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