8. 容器网络接口(CNI)
容器网络接口(CNI)
容器网络接口(Container Network Interface
vendor/github.com/containernetworking/cni/libcni
目录中已经包含了
接口定义
type CNI interface {
AddNetworkList (net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
DelNetworkList (net *NetworkConfigList, rt *RuntimeConf) error
AddNetwork (net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
DelNetwork (net *NetworkConfig, rt *RuntimeConf) error
}
该接口只有四个方法,添加网络、删除网络、添加网络列表、删除网络列表。
设计考量
- 容器运行时必须在调用任何插件之前为容器创建一个新的网络命名空间。
- 然后,运行时必须确定这个容器应属于哪个网络,并为每个网络确定哪些插件必须被执行。
- 网络配置采用
JSON 格式,可以很容易地存储在文件中。网络配置包括必填字段,如name
和type
以及插件(类型) 。网络配置允许字段在调用之间改变值。为此,有一个可选的字段args
,必须包含不同的信息。 - 容器运行时必须按顺序为每个网络执行相应的插件,将容器添加到每个网络中。
- 在完成容器生命周期后,运行时必须以相反的顺序执行插件(相对于执行添加容器的顺序)以将容器与网络断开连接。
- 容器运行时不能为同一容器调用并行操作,但可以为不同的容器调用并行操作。
- 容器运行时必须为容器订阅
ADD 和DEL 操作,这样ADD 后面总是跟着相应的DEL 。DEL 可能跟着额外的DEL ,但是,插件应该允许处理多个DEL (即插件DEL 应该是幂等的) 。 - 容器必须由
ContainerID 唯一标识。存储状态的插件应该使用(网络名称,容器ID )的主键来完成。 - 运行时不能调用同一个网络名称或容器
ID 执行两次ADD (没有相应的DEL ) 。换句话说,给定的容器ID 必须只能添加到特定的网络一次。
CNI 插件
参数
将容器添加到网络
参数:
- 版本调用者正在使用的
CNI 规范(容器管理系统或调用插件)的版本。 - 容器
ID 由运行时分配的容器的唯一明文标识符。一定不能是空的。 - 网络命名空间路径要添加的网络名称空间的路径,即
/proc/[pid]/ns/net
或绑定挂载/ 链接。 - 网络配置描述容器可以加入的网络的
JSON 文档。架构如下所述。 - 额外的参数这提供了一个替代机制,允许在每个容器上简单配置
CNI 插件。 - 容器内接口的名称这是应该分配给容器(网络命名空间)内创建的接口的名称;因此它必须符合
Linux 接口名称上的标准限制。
结果:
- 接口列表根据插件的不同,这可以包括沙箱(例如容器或管理程序)接口名称和
/ 或主机接口名称,每个接口的硬件地址以及接口所在的沙箱(如果有的话)的详细信息。 - 分配给每个接口的
IP 配置分配给沙箱和/ 或主机接口的IPv4 和/ 或IPv6 地址,网关和路由。 DNS 信息包含nameserver 、domain、search domain 和option 的DNS 信息的字典。
从网络中删除容器
参数:
-
版本调用者正在使用的
CNI 规范(容器管理系统或调用插件)的版本。 -
容器
ID ,如上所述。 -
网络命名空间路径,如上定义。
-
网络配置,如上所述。
-
额外的参数,如上所述。
-
上面定义的容器内的接口的名称。
-
所有参数应与传递给相应的添加操作的参数相同。
-
删除操作应释放配置的网络中提供的
containerid 拥有的所有资源。
报告版本:
- 参数:无。
- 结果:插件支持的
CNI 规范版本信息。
{“cniVersion”:“0.3.1”,// 此输出使用的 CNI 规范的版本
“supportedVersions”:[“0.1.0”,“0.2.0”,“0.3.0”,“0.3.1”] // 此插件支持的 CNI 规范版本列表
}
IP 分配
作为容器网络管理的一部分,
为了减轻负担,使
IPAM 插件
像CNI_PATH
指示给
可用插件
Main:接口创建
- bridge:创建网桥,并添加主机和容器到该网桥
- ipvlan:在容器中添加一个 ipvlan 接口
- loopback:创建一个回环接口
- macvlan:创建一个新的
MAC 地址,将所有的流量转发到容器 - ptp:创建
veth 对 - vlan:分配一个
vlan 设备
IPAM:IP 地址分配
- dhcp:在主机上运行守护程序,代表容器发出
DHCP 请求 - host-local:维护分配
IP 的本地数据库
Meta:其它插件
- flannel:根据
flannel 的配置文件创建接口 - tuning:调整现有接口的
sysctl 参数 - portmap:一个基于
iptables 的portmapping 插件。将端口从主机的地址空间映射到容器。