感谢各位已经关注我的微信公众号(VIPDOCKER)的同学,正是你们的鼓励让我能继续坚持写下来,如果还没有关注,欢迎你的加入!新近公众被赋予了原创公众号权限,大家可以直接留言了,欢迎任何建议,谢谢!
CNM Design
。 Docker IPAM可以参考
Docker IPAM
而对于Mesos则是遵循CNI的规范。CNI规范可以参看
CNI Spec
。
不过对于只需要动态管理IP地址的话,基于任何一种IPAM的接口都是可以的。所以我们经过老肖(@熟人云)介绍,参考了Talking Data公司的
Shrike
来做动态的IP管理。Shrike是基于Docker deamon的IPAM的方案, 所以只能用于基于Docker容器的方案,如果是用mesos unified container,则需要自己去改造成对接CNI的IPAM的接口。
虽然Shrike比较简单,但是目前Shrike有些局限,所以我们需要在上面做一些改造,以支持后续的扩展。主要包括:
-
Shrike
这个进程如果意外退出,IP的释放消息(
Release address
)未被处理,就会造成IP被永久占用。目前我们的思路是,在
shrike
启动的时候主动去扫描本机的docker container,然后和etcd上的数据比对,如果有IP没有被释放,则主动清理。
-
对于上面这个约束,我们需要改造Etcd中数据结构,以支持将主机IP存入etcd中,便于后续的主动清理。同时改造etcd数据结构也是为了限流使用。
mesos attr resource
在这里还是要吐槽一下
Marathon
,开发的进度和
Mesos
太不一致了,希望Mesosphere的同学好好push一下。
这条路暂时走不通,那么在用
Shrike
做动态IP分配的时候,我想能不能在IP动态分配的时候就同时做了这个容器的带宽限制呢?所以就有了以下方案
"shrike"
主要的流程如下:
-
在Shrike中增加一个Throttling的模块,Shrike动态分配IP后发送一条消息给这个Throttlilng模块,包含容器ip信息(可惜没有容器的id)
-
Throttling模块收到消息后,调用docker daemon接口查询这个ip对应的容器在主机的网络名称(这里可以用unix socket接口或者http接口,因为是本机调用)
-
查询这个容器的环境变量如net_in, net_out的值(这个目前是启动容器的时候配置上去的)
-
通过调用linux下的wondershape工具来对容器进行限制带宽
这个方案还有后续几个事宜我们还没有处理的: