OCI
简单来说OCI(Open Container Initiative (OCI) Specifications)就是两个“规范”
Image specifications
参考文档定义了如下几个部分,总体来说就是我们平时使用的docker image的定义和方式。也保证了image可以跨平台使用,因为所有的image都遵循image specifications。
Runtime specifications
参考文档主要定义了容器运行时需要的内容如下:
Image和Runtime specifications的协作
引用两张图,来说明协作的事情。
对于遵循image spec的image,runtime spec将可以按照定义的方式,启动停止这些image将其转化为运行时的容器。在运行时/转化的过程中,要考虑几个方面,磁盘,权限,网络,进程。
CNI
容器网络规范文档
- 容器是一个网络隔离域,尽管规范中没有定义实际的隔离技术。例如,这可以是网络名称空间或虚拟机。
- 网络指的是一组可唯一寻址的端点,它们可以相互通信。这可能是一个单独的容器(如上所述)、一台机器或一些其他网络设备(例如路由器)。容器可以从概念上添加到一个或多个网络或从中移除。
- runtime是负责执行CNI插件的程序。
- 插件是一个应用指定网络配置的程序。
总结CNI规范了:
- 管理员定义网络配置的格式。
- 容器运行时向网络插件发出请求的协议。
- 根据提供的配置执行插件的过程。
- 插件将功能委托给其他插件的过程。
- 用于插件将结果返回到运行时的数据类型。
协作
这里参考CNI相关的生命周期
- 在调用任何插件之前,容器运行时必须为容器创建一个新的网络名称空间。
- 容器运行时不能为同一容器调用并行操作,但允许为不同容器调用并行操作。这包括多个附件。
- 插件必须处理跨不同容器并发执行的问题。如有必要,他们必须对共享资源(如IPAM数据库)实施锁定。
- 容器运行时必须确保add后面最后跟着一个相应的delete。唯一的例外是发生灾难性故障,例如节点丢失。即使添加失败,仍必须执行删除。
- 删除之后可能会有其他删除。
- 网络配置不应在添加和删除之间更改。
- 网络配置不应在附件之间更改。
- 容器运行时负责清理容器的网络命名空间。
参考资料
https://github.com/opencontainers/image-spec
https://github.com/opencontainers/runtime-spec/blob/main/config.md#startContainer-hooks
https://www.alibabacloud.com/blog/open-container-initiative-oci-specifications_594397#:~:text=The%20Runtime%20Specification%20specifies%20the,sandboxing%20features%20to%20use%2C%20etc
https://zhuanlan.zhihu.com/p/383552578
http://www.dasblinkenlichten.com/understanding-cni-container-networking-interface/
https://github.com/containernetworking/cni/blob/main/SPEC.md