转载

Docker网络插件(IPAM Driver)

原文地址: https://github.com/docker/libn ... am.md

IPAM 驱动

在docker网络中,CNM(Container Network Management)模块通过IPAM(IP address management)驱动管理IP地址的分配。Libnetwork内含一个默认的IPAM驱动,同时它也允许动态地增加第三方IPAM驱动。在用户创建网络时可以指定libnetwork使用的IPAM驱动。本文档用于解释IPAM驱动需要遵守的API以及相关的HTTPS请求和响应消息体。

远程 IPAM 驱动

在注册远程network驱动的时候,libnetwork使用Init()函数初始化ipams.remote包。libnetwork传递ipamapi.Callback类型对象给Init()作为参数,该类型对象实现了注册IPAM驱动RegisterIpamDriver()。远程驱动包使用这个接口去注册带有libnetwork网络控制器的远程驱动。远程驱动通过Docker插件包注册并与libnetwork通信。ipams.remote提供远程驱动进程的代理。

协议

通信协议与远程网络驱动一样。

握手

在驱动注册期间,libnetwork会查询默认的本地和全局地址空间、驱动器能力。更多详细信息将在其他小节中详细描述。

数据存储需求

远程驱动需要管理自己的数据。

Ipam Contract

远程IPAM驱动必须能够处理以下请求:

GetDefaultAddressSpaces

RequestPool

ReleasePool

Request address

Release address

下面的章节解释了上面的每个请求的含义,以及调用的时候相关的HTTP请求和响应的内容。

IPAM Configuration and flow

在创建网络的时候,用户可以通过NetworkOptionIpam()函数来提供IPAM相关的配置。

func NetworkOptionIpam(ipamDriverstring, addrSpacestring, ipV4 [] IpamConf, ipV6 [] IpamConf, optsmap[string]string) NetworkOption

调用者必须提供IPAM驱动的名字,可选提供地址空间、IPv4和IPv6的一组IpamConf结构体。IPAM驱动名称必须提供否则网络创建会失败。

在配置列表中每一个元素都有如下的结构:

Docker网络插件(IPAM Driver)

在创建网络时,libnetwork会遍历IpamConf列表并执行下面的请求:

通过RequestPool()请求地址池

通过RequestAddress()请求指定的网关地址,如未指定则选择任意可用地址作为网关。

通过 RequestAddress()请求指定的附加地址。

如果IPv4配置是空的,libnetwork会自动增加一个空的IpamConf结构体。使libnetwork从指定的地址空间中向IPAM驱动请求一个IPv4地址池,如果未指定地址空间则使用IPAM驱动的默认地址空间。如果IPAM驱动无法提供地址池那么将无法创建网络。如果IPv6配置是空的,libnetwork不会做任何操作。在上面1到3点执行过程中,从IPAM驱动传回的数据将会保存在network的IpamInfo结构体中。

Docker网络插件(IPAM Driver)

创建端点的时候,libnetwork会遍历配置列表并执行下面的操作:

从IPv4池中请求一个IPv4地址,并把它配置成端点接口的地址,成功则停止遍历。

从IPv6池(若存在)中请求一个IPv6地址,并把它配置成端点接口的地址,成功则停止遍历。

以上任何操作执行失败都会导致端点创建失败。

删除端点时,libnetwork会执行以下操作:

释放端点接口的IPv4地址

释放端点接口的IPv6地址(若存在)

删除网络时,libnetwork会遍历IpamData结构列表并向IPAM驱动执行下面的请求:

通过 ReleaseAddress() 释放网关地址

通过 ReleaseAddress() 释放附加地址

通过 ReleasePool() 释放地址池

GetDefaultAddressSpaces

GetDefaultAddressSpaces 为IPAM返回默认的本地和全局地址空间名。地址空间是一组相互不重叠的地址池,并且与其他地址空间的地址池隔离。换句话说,不同的地址空间中可以存在相同的地址池。

地址空间映射到租户名。在libnetwork中,本地和全局地址空间的含义是本地地址空间不需要与集群同步,而全局地址空间则需要与集群同步。除非指定了IPAM配置,否则libnetwork将从默认本地或者默认全局地址空间中请求一个地址池。例如,如果没有指定配置,libnetwork将会从默认本地地址空间中为bridge网络请求地址池,从默认全局地址空间中为overlay网络请求地址池。

在注册期间,远程驱动将接收一个URL为 /IpamDriver.GetDefaultAddressSpaces没有payload的POST消息。驱动返回的形式:

{

"LocalDefaultAddressSpace": string

"GlobalDefaultAddressSpace": string

}

RequestPool

这个API是用来向IPAM驱动注册地址池的。多次单独( Multiple identical calls)调用必须返回相同的结果。IPAM驱动负责维护池的引用计数。

RequestPool(addressSpace, pool, subPool string, options map[string]string, v6 bool) (string,

net.IPNet, map[string]string, error)

远程驱动将会接收一个URL为 /IpamDriver.RequestPool ,payload为下面的POST消息:

{

"AddressSpace": string

"Pool": string

"SubPool": string

"Options": map[string]string

"V6": bool

}

Where:

* AddressSpace IP地址空间:一组不重叠的地址池

* Pool CIDR格式的IPv4或者IPv6地址池

* SubPool 可选,地址池的子集,CIDR格式的IP地址范围

* Options IPAM驱动选项

* V6 IPAM自选池是否为IPv6的

AddressSpace是唯一必须指定的。如果没有指定Pool,IPAM驱动自动申请一个默认地址池返回。 若想要IPAM自选IPv6池的话必须设置V6标志为true。Pool 为空但SubPool 不为空的情况是非法的,应该拒绝。

成功的响应是这样的:

{

"PoolID": string

"Pool": string

"Data": map[string]string

}

Where:

PoolID 是地址池的标识符,相同的池要有相同的ID

Pool 是CIDR格式的地址池

Data IPAM驱动为地址池提供的元数据

ReleasePool

用于释放之前注册的地址池

ReleasePool(poolID string) error

method:POST

URL: /IpamDriver.ReleasePool

payload:

{

"PoolID": string

}

Where:

PoolID 地址池的标识符

成果返回空:

{}

RequestAddress

请求一个IP地址

RequestAddress(string, net.IP, map[string]string) (net.IPNet, map[string]string, error)

method:POST

URL: /IpamDriver.RequestAddress

payload:

{

"PoolID": string

"Address": string

"Options": map[string]string

}

Where:

PoolID 地址池标识符

Address 所请求的IP地址,格式为A.B.C.D。 若地址不满足请求将会失败。若空,IPAM驱动从地址池中选择一个可用地址。

Options IPAM驱动选项

请求成功返回的形式:

{

Address: string

Data: map[string]string

}

Where:

Address 指定的CIDR格式的地址 (A.B.C.D/MM)

Data IPAM驱动指定的元数据

ReleaseAddress

释放一个IP地址

method:POST

URL: /IpamDriver.ReleaseAddress

payload:

{

"PoolID": string

"Address: string

}

Where:

PoolID 地址池标识符

Address 将要释放的地址

GetCapabilities

在驱动注册期间,libnetwork会查询该驱动的能力。不要求驱动必须支持。若驱动不支持,libnetwork会自动增加空的能力集到内部驱动处理中。

method:POST

URL: /IpamDriver.GetCapabilities

no payload.

返回形式:

{

"RequiresMACAddress": bool

}

Capabilities

能力是IPAM驱动在注册期间所表达出来的需求、特点,目前libnetwork接受下面的能力:

RequiresMACAddress

布尔类型,用于告诉libnetwork IPAM是否需要知道接口的MAC地址,从而适当地处理RequestAddress() 调用。如果为true,在CreateEndPoint()时,libnetwork会为端点随机生成MAC地址(如果用户没有提供MAC地址),然后在RequestAddress()时传到options map中。键是 netlabel.MacAddress 常量:"com.docker.network.endpoint.macaddress"

附录

A Go extension for the IPAM remote API is available at docker/go-plugins-helpers/ipam

原文  http://dockone.io/article/1306
正文到此结束
Loading...