容器

容器

规范和标准

需要区分 CNCF 制定的标准和 docker 公司制定的标准

CNCF 的规范

  1. CNI - Container Network Interface 容器网络接口
  2. CRI - Container Runtime Interface 容器运行时接口
  3. CSI - Container Storage Interface 容器存储接口

docker公司的规范

  1. OCI - Open Container Initiative 开放容器规范
  2. CNM - Container Network Model 开放容器网络模型

OCI-开放容器规范

OCI (Open Container Initiative) 开放容器规范

OCI 主要解决的是容器构建, 分发和运行问题

核心规范子集

  1. OCI Image Spec: 镜像格式规范。怎样组织镜像文件的格式;

  2. OCI Runtime Spec:容器运行时规范

    例如: 容器要需要能接收哪些指令, 这些指令的行为是什么;
    容器需要支持 create, start, stop, delete 等命令

  3. OCI Destribution Spec: 容器分发规范

OCI的主要实现:
runC, Kata(以及前生 runV), gVisor, railcar 等

CNM-开放容器网络模型

Libnetwork 是 CNM 的原生实现; 定义了 docker 容器的网络模型; 为 Docker daemon 和网络驱动程序之间提供了接口;

简单理解就是每项功能由一个驱动去实现, 部分驱动可以并存; 分为原生驱动和第三方驱动

CRI-容器运行时接口

Container Runtime Interface 解决的是容器运行时标准

主要是一组 gRPC 接口

  1. 针对容器操作的接口, 包括创建,启停容器等等;
  2. 针对镜像操作的接口, 包括拉取镜像删除镜像等;
  3. 针对 PodSandbox (容器沙箱环境) 的操作接口;

一些实现

  1. Docker(借助 dockershim)
  2. containerd(借助 CRI-containerd)
  3. CRI-O 轻量级的CRI运行时
  4. 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 插件包括两部份:

  1. CNI Plugin

    负责给容器配置网络, 它包括两个基本的接口,分别在容器被创建和销毁的时候被调用;

    添加和配置网络:
    AddNetwork(net NetworkConfig, rt RuntimeConf)(types.Result, error)

    清理网络:
    DelNetwork(net NetworkConfig, rt RuntimeConf) error

  2. IPAM Plugin;

    负责给容器分配 IP 地址, 实现包括 host-local 和 dhcp 等

相比 CNM

  1. CNM 只支持 docker
  2. CNI 支持生态较好, 主流网络解决方案(Calico, Flannel 等)都对 CNI 有良好的支持
  3. CNI 支持与第三方 IPAM 的集成, 可以用于任何容器 runtime;
最后更新于