原文地址: https://github.com/docker/libn ... am.md
在docker网络中,CNM(Container Network Management)模块通过IPAM(IP address management)驱动管理IP地址的分配。Libnetwork内含一个默认的IPAM驱动,同时它也允许动态地增加第三方IPAM驱动。在用户创建网络时可以指定libnetwork使用的IPAM驱动。本文档用于解释IPAM驱动需要遵守的API以及相关的HTTPS请求和响应消息体。
在注册远程network驱动的时候,libnetwork使用Init()函数初始化ipams.remote包。libnetwork传递ipamapi.Callback类型对象给Init()作为参数,该类型对象实现了注册IPAM驱动RegisterIpamDriver()。远程驱动包使用这个接口去注册带有libnetwork网络控制器的远程驱动。远程驱动通过Docker插件包注册并与libnetwork通信。ipams.remote提供远程驱动进程的代理。
通信协议与远程网络驱动一样。
在驱动注册期间,libnetwork会查询默认的本地和全局地址空间、驱动器能力。更多详细信息将在其他小节中详细描述。
远程驱动需要管理自己的数据。
远程IPAM驱动必须能够处理以下请求:
GetDefaultAddressSpaces
RequestPool
ReleasePool
Request address
Release address
下面的章节解释了上面的每个请求的含义,以及调用的时候相关的HTTP请求和响应的内容。
在创建网络的时候,用户可以通过NetworkOptionIpam()函数来提供IPAM相关的配置。
func NetworkOptionIpam(ipamDriverstring, addrSpacestring, ipV4 [] IpamConf, ipV6 [] IpamConf, optsmap[string]string) NetworkOption
调用者必须提供IPAM驱动的名字,可选提供地址空间、IPv4和IPv6的一组IpamConf结构体。IPAM驱动名称必须提供否则网络创建会失败。
在配置列表中每一个元素都有如下的结构:
在创建网络时,libnetwork会遍历IpamConf列表并执行下面的请求:
通过RequestPool()请求地址池
通过RequestAddress()请求指定的网关地址,如未指定则选择任意可用地址作为网关。
通过 RequestAddress()请求指定的附加地址。
如果IPv4配置是空的,libnetwork会自动增加一个空的IpamConf结构体。使libnetwork从指定的地址空间中向IPAM驱动请求一个IPv4地址池,如果未指定地址空间则使用IPAM驱动的默认地址空间。如果IPAM驱动无法提供地址池那么将无法创建网络。如果IPv6配置是空的,libnetwork不会做任何操作。在上面1到3点执行过程中,从IPAM驱动传回的数据将会保存在network的IpamInfo结构体中。
创建端点的时候,libnetwork会遍历配置列表并执行下面的操作:
从IPv4池中请求一个IPv4地址,并把它配置成端点接口的地址,成功则停止遍历。
从IPv6池(若存在)中请求一个IPv6地址,并把它配置成端点接口的地址,成功则停止遍历。
以上任何操作执行失败都会导致端点创建失败。
删除端点时,libnetwork会执行以下操作:
释放端点接口的IPv4地址
释放端点接口的IPv6地址(若存在)
删除网络时,libnetwork会遍历IpamData结构列表并向IPAM驱动执行下面的请求:
通过 ReleaseAddress() 释放网关地址
通过 ReleaseAddress() 释放附加地址
通过 ReleasePool() 释放地址池
GetDefaultAddressSpaces 为IPAM返回默认的本地和全局地址空间名。地址空间是一组相互不重叠的地址池,并且与其他地址空间的地址池隔离。换句话说,不同的地址空间中可以存在相同的地址池。
地址空间映射到租户名。在libnetwork中,本地和全局地址空间的含义是本地地址空间不需要与集群同步,而全局地址空间则需要与集群同步。除非指定了IPAM配置,否则libnetwork将从默认本地或者默认全局地址空间中请求一个地址池。例如,如果没有指定配置,libnetwork将会从默认本地地址空间中为bridge网络请求地址池,从默认全局地址空间中为overlay网络请求地址池。
在注册期间,远程驱动将接收一个URL为 /IpamDriver.GetDefaultAddressSpaces没有payload的POST消息。驱动返回的形式:
{
"LocalDefaultAddressSpace": string
"GlobalDefaultAddressSpace": string
}
这个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(poolID string) error
method:POST
URL: /IpamDriver.ReleasePool
payload:
{
"PoolID": string
}
Where:
PoolID 地址池的标识符
成果返回空:
{}
请求一个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驱动指定的元数据
释放一个IP地址
method:POST
URL: /IpamDriver.ReleaseAddress
payload:
{
"PoolID": string
"Address: string
}
Where:
PoolID 地址池标识符
Address 将要释放的地址
在驱动注册期间,libnetwork会查询该驱动的能力。不要求驱动必须支持。若驱动不支持,libnetwork会自动增加空的能力集到内部驱动处理中。
method:POST
URL: /IpamDriver.GetCapabilities
no payload.
返回形式:
{
"RequiresMACAddress": bool
}
能力是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