docklet/doc/devdoc/networkmgr.md

68 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Network Manager
## About
网络管理是为docklet提供网络管理的模块。
关于需求,主要有两点:
* 一个中心管理池,按 网络段IP/CIDR 给用户分配网络池
* 很多用户网络池,按 一个或者几个网络地址 给用户的cluster分配网络地址
## Data Structure
面对这两种需求,设计了两种数据结构来管理网络地址。
* 区间池 / interval pool 分配、回收 网络段
interval pool 中的元素为区间,其由很多个区间组成。
一个朴素的 区间池 是这样的 interval pool : [A1,A2],[B1,B2],[C1,C2],...[X1,X2]
每次申请一段地址的时候,从上述区间中选择一个区间分配,并将该区间中剩余部分放回区间池
而考虑到 网络段IP/CIDR 是 2 的幂的结构,所以可以将区间池进一步设计成如下结构:
interval pool:
... ...
cidr=16 : [A1,A2], [A3,A4], ...
cidr=17 : [B1,B2], [B3,B4], ...
cidr=18 : [C1,C2], [C3,C4], ...
... ...
上述结构还可以进一步优化,因为 每一个区间的结尾地址可以通过开始地址和CIDR算出来所以每个区间只需要写一个起始地址就可以了
所以:
interval pool:
... ...
cidr=16 : A1, A3, ...
cidr=17 : B1, B3, ...
cidr=18 : C1, C3, ...
... ...
而其中,每一个元素,比如 A1其实代表的是一个区间 [A1, A1+2^16-1]
这种基于2的幂的区间设计的好处是可以方便的进行 分配 和 合并 区间,操作起来更加高效。
* 枚举池 / enumeration pool : 分配、回收一个、多个网络地址
enum pool 中的元素为单个网络地址,比如:
enum pool : A, B, C, D, ... X
## API
操作上述两种数据结构的API这里省略
## Network Manager Storage Design
* center : 中心池,提供 用户网络段 的分配、回收
info : IP/CIDR
intervalpool :
cidr16 : ...
cidr17 : ...
... ...
* system 系统保留地址,为系统内部的 网络地址 提供 分配回收
info : IP/CIDR
enumpool : ...
* vlan/<username&gt; : 为某个用户提供地址分配回收服务
info : IP/CIDR
enumpool : ...
vlanid : id