Kuryr项目是想把neutron的网络给容器用。那要怎么做呢?
一、docker那边需要先挖好坑,把网络部分的接口暴露出来。
docker把网络部分提取成了libnetwork,并为此实现了几个driver,host、overlay、null和remote,其中remote就是为用其他项目来管理docker的网络留的接口。remote采用rpc的方式将参数通过网络发给外部管理程序,外部程序处理好了后通过json返回结果给remote。
libnetwork的remote driver定义了基本的创建网络、创建port的接口,只要对应的REST Server实现了这些接口,就可以提供整套docker的网络。这些接口有:Create network、Delete network、Create endpoint、Delete endpoint、Join(绑定)、Leave(去绑定)。
remote driver的接口定义在 https://github.com/docker/libnetwork/blob/master/docs/remote.md
用remote driver分配了设备一般是不带IP的,libnetwork使用ipam driver来管理ip。这些接口有:GetDefaultAddressSpaces 获取保留IP,RequestPool获取IP地址池,ReleasePool释放IP地址池,RequestAddress获取IP地址,ReleaseAddress释放IP地址。
ipam driver的接口定义在 https://github.com/docker/libnetwork/blob/master/docs/ipam.md
libnetwork的插件发现机制在 https://github.com/docker/docker/blob/master/docs/extend/plugin_api.md#plugin-discovery
二、kuryr这边就按照docker给的接口转为neutron的操作。
1. 配置文件里面定义好参数,以便能连上neutron。
2. 使用Flask(而不是wsgi)实现一个REST Server,以便接收remote driver传过来的参数。
3. 使用libnetwork的插件机制,在 /usr/lib/docker/plugins/ 目录下建立kuryr的插件描述的json文件。
4. docker daemon启动的时候,libnetwork发现kuryr这个新插件,并且通过 /Plugin.Active 验证这个插件可用。
5. 使用docker network create --driver=kuryr foo 在docker中创建一个网络
6. 用户使用docker创建一个容器的时候,指定网络为 foo
7. kuryr从libnetwork接收到请求,并用很多硬编码的schemata来验证用户输入的参数对不对,然后把创建 Network/Sandbox/Endpoint转为对应neutron的资源,发送给neutron。
8. kuryr接收neutron的结果,再用pyroute2创建veth pair,一个bind到neutron的port,一个以给veth设置netns的方式给容器。
9. kuryr把neutron返回的结果包装成libnetwork的样式,转发给libnetwork。
这样容器就能用neutron的网络了,并且可以使用因此而来的附加功能:安全组、租户网络。。。。
kuryr类似ovs-agent,也需要每个计算节点安装一个。
另外,kuryr提供了vagrant的安装环境的方式,这是一种使用虚拟机空手套白狼安装环境的方法,相当好用。