容器
规范和标准
需要区分 CNCF 制定的标准和 docker 公司制定的标准
CNCF 的规范
- CNI - Container Network Interface 容器网络接口
- CRI - Container Runtime Interface 容器运行时接口
- CSI - Container Storage Interface 容器存储接口
docker公司的规范
- OCI - Open Container Initiative 开放容器规范
- CNM - Container Network Model 开放容器网络模型
OCI-开放容器规范
OCI (Open Container Initiative) 开放容器规范
OCI 主要解决的是容器构建, 分发和运行问题
核心规范子集
-
OCI Image Spec: 镜像格式规范。怎样组织镜像文件的格式;
-
OCI Runtime Spec:容器运行时规范
例如: 容器要需要能接收哪些指令, 这些指令的行为是什么;
容器需要支持 create, start, stop, delete 等命令 -
OCI Destribution Spec: 容器分发规范
OCI的主要实现:
runC, Kata(以及前生 runV), gVisor, railcar 等
CNM-开放容器网络模型
Libnetwork 是 CNM 的原生实现; 定义了 docker 容器的网络模型; 为 Docker daemon 和网络驱动程序之间提供了接口;
简单理解就是每项功能由一个驱动去实现, 部分驱动可以并存; 分为原生驱动和第三方驱动
CRI-容器运行时接口
Container Runtime Interface 解决的是容器运行时标准
主要是一组 gRPC 接口
- 针对容器操作的接口, 包括创建,启停容器等等;
- 针对镜像操作的接口, 包括拉取镜像删除镜像等;
- 针对 PodSandbox (容器沙箱环境) 的操作接口;
一些实现
- Docker(借助 dockershim)
- containerd(借助 CRI-containerd)
- CRI-O 轻量级的CRI运行时
- frakti
CSI-容器存储接口
Container Storage Interface
csi 卷 用于 Pod 与在同一节点上运行的外部 CSI 卷驱动程序交互
部署 CSI 兼容卷驱动后,用户可以使用 csi 作为卷类型来挂载驱动提供的存储
driver: 指定要使用的卷驱动程序的名称
volumeHandle: 唯一标识从 CSI 卷插件的 CreateVolume 调用返回的卷名, 随后在卷驱动程序的所有后续调用中使用卷句柄来引用该卷
readOnly: 指示卷是否被发布为只读
在 k8s 内体现为 StorageClass
CNI-容器网络接口
Container Network Interface 提供一个标准的接口, 为同样满足该协议的所有容器平台提供网络功能
CoreOS 公司提出, 然后成为 CNCF(Cloud Native Computing Foundation) 项目
CNI 插件包括两部份:
-
CNI Plugin
负责给容器配置网络, 它包括两个基本的接口,分别在容器被创建和销毁的时候被调用;
添加和配置网络:
AddNetwork(net NetworkConfig, rt RuntimeConf)(types.Result, error)清理网络:
DelNetwork(net NetworkConfig, rt RuntimeConf) error -
IPAM Plugin;
负责给容器分配 IP 地址, 实现包括 host-local 和 dhcp 等
相比 CNM
- CNM 只支持 docker
- CNI 支持生态较好, 主流网络解决方案(Calico, Flannel 等)都对 CNI 有良好的支持
- CNI 支持与第三方 IPAM 的集成, 可以用于任何容器 runtime;