docker1.1 新特性--libnetwork模块

来源:互联网 发布:淘宝官方网址是多少 编辑:程序博客网 时间:2024/06/10 18:05

本次分析的libnetwork版本0.7.0-rc.6,对比的是docker1.10.0使用的libnetwork版本0.6.0-rc7。

下图是Docker官方定义的容器网络模型(Container Network Model)。其中包括三个组件,分别是Sandbox、Endpoint和Network。


在Docker1.11中,Sandbox是一个GO语言接口,GO语言不是一种典型的面向对象语言,它在语法上没有类和继承的概念,没有继承是否就无法拥有面向对象中的“多态”行为,但是GO语言引入了一种新类型“接口”,它在效果上实现了面向对象中“多态”的概念。Sandbox接口结构体如下:

typeSandbox interface {       ID() string       Key() string       ContainerID() string       Labels() map[string]interface{}       Statistics()(map[string]*types.InterfaceStatistics, error)       Refresh(options ...SandboxOption) error       SetKey(key string) error       Rename(name string) error       Delete() error       ResolveName(name string, iplen int)([]net.IP, bool)       ResolveIP(name string) string       Endpoints() []Endpoint}
相比Docker1.10,ResolveName方法增加了对IPv6地址的支持。

在Docker1.11中,Endpoint接口结构体同Docker1.10没有变化。

在Docker1.11中,Endpoint接口结构体如下:

typeNetwork interface {       Name() string       ID() string       Type() string       CreateEndpoint(name string, options ...EndpointOption)(Endpoint, error)       Delete() error       Endpoints() []Endpoint       WalkEndpoints(walker EndpointWalker)       EndpointByName(name string) (Endpoint,error)       EndpointByID(id string) (Endpoint, error)       Info() NetworkInfo}

这个结构体同Docker1.10来说没有变化,有变化的是这个结构体中的Info()变量,这个变量对应的接口结构体是NetworkInfo,如下所示:

typeNetworkInfo interface {       IpamConfig() (string, map[string]string,[]*IpamConf, []*IpamConf)       IpamInfo() ([]*IpamInfo, []*IpamInfo)       DriverOptions() map[string]string       Scope() string       IPv6Enabled() bool       Internal() bool       Labels() map[string]string}
这个接口结构体同Docker1.10相比增加了IPv6Enabled和Labels两个变量。第一个变量IPv6Enabled表示是否使用IPv6,第二个变量Labels用于存储Network标签。

上面这些GO语言接口定义了容器网络模型(Container NetworkModel)中三个组件的对外操作接口,形成了CNM操作标准。

Docker1.11中libnetwork负责管理网络的接口结构体是NetworkController:

typeNetworkController interface {       ID() string       Config() config.Config       NewNetwork(networkType, name string,options ...NetworkOption) (Network, error)       Networks() []Network       WalkNetworks(walker NetworkWalker)       NetworkByName(name string) (Network,error)       NetworkByID(id string) (Network, error)       NewSandbox(containerID string, options...SandboxOption) (Sandbox, error)       Sandboxes() []Sandbox       WalkSandboxes(walker SandboxWalker)       SandboxByID(id string) (Sandbox, error)       SandboxDestroy(id string) error       Stop()       ReloadConfiguration(cfgOptions...config.Option) error}
Docker1.11中新增加了ReloadConfiguration,用于DockerDaemon热变更网络配置。

在Docker1.10中libnetwork提供了五个驱动包,分别是bridge、host、null、remote和overlay,在Docker1.11中新增加了两个实验性质的驱动包,分别是macvlan和ipvlan。每个驱动包都需要实现Driver接口中的方法:

typeDriver interface {       discoverapi.Discover       CreateNetwork(nid string, optionsmap[string]interface{}, ipV4Data, ipV6Data []IPAMData) error       DeleteNetwork(nid string) error       CreateEndpoint(nid, eid string, ifInfoInterfaceInfo, options map[string]interface{}) error       DeleteEndpoint(nid, eid string) error       EndpointOperInfo(nid, eid string)(map[string]interface{}, error)       Join(nid, eid string, sboxKey string,jinfo JoinInfo, options map[string]interface{}) error       Leave(nid, eid string) error       ProgramExternalConnectivity(nid, eidstring, options map[string]interface{}) error       RevokeExternalConnectivity(nid, eidstring) error       Type() string}
 

其中Docker内置的驱动包括bridge、host、null、overlay、macvlan和ipvlan,remote是外挂驱动,需要第三方提供网络驱动程序,ipvlan驱动和macvlan驱动是docker1.11新增加的两个测试性模式。

对于bridge驱动,在Docker1.11中新增加了载入netfilter的xt_conntrack模块。在bridge驱动方式下,创建sandbox就是在创建linux netnamespace,创建network就是创建linux bridge,创建endpoint就是创建一对veth虚拟设备,通过linux brige和veth虚拟设备来实现不同linux net namespace之间的网络通信,如下为bridge驱动下sendbox、network和endpoint的实现示意图,其中红色字体表示在linux上的具体实现,虚线方块表示libnetwork的逻辑概念:

 

对于ipvlan驱动,需要linuxkernel版本大于等于4.2才能使用,支持ipvlan的二层和三层两种模式;对于macvlan驱动,需要linux kernel版本大于等于3.9才能使用,支持macvlan的四种模式,分别是private、vepa、bridge和passthru。

在ipvlan驱动方式下,创建sandbox就是在创建linux netnamespace,创建network就是在物理网卡上创建类型是ipvlan的虚拟link网络接口,创建endpoint就是给新创建的虚拟link网络接口设置mac地址和IP地址网络信息,如下为ipvlan驱动下sendbox、network和endpoint的实现示意图(endpoint的概念其实可以忽略不计),其中红色字体表示在linux上的具体实现,虚线方块表示libnetwork的逻辑概念:

 

通过比较上面bridge驱动方式同ipvlan驱动方式两张图,因为不需要通过linux bridge这一层进行处理,所以ipvlan方式是效率更高的一种方式,随着linux kernel中ipvlan驱动的成熟,随着docker对ipvlan支持的完善,将来ipvlan有望成为docker网络通讯中效率最高的一种方式。

0 0
原创粉丝点击