68 lines
2.3 KiB
Markdown
68 lines
2.3 KiB
Markdown
|
# 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> : 为某个用户提供地址分配、回收服务
|
|||
|
|
|||
|
|
|||
|
info : IP/CIDR
|
|||
|
enumpool : ...
|
|||
|
vlanid : id
|