libnetwork源码分析(一)-controller(3)-v1-12-3
本次文档将接着上次分析,介绍controller对sandbox的管理及sandbox的相关代码的分析。
(三) 管理sandbox
在controller中,有sandboxes字段存储sandbox。
controller中相关函数
controller:NewSandbox()
NewSandbox()可以创建一个新的sandbox。
|
|
NewSandbox()的流程如下:
- 重名检查;
- 构造sandbox结构体值;
- 初始化sandbox的endpoints字段;
- 处理useDefaultSandBox情况,生成osSbox,并赋值给sb.osSobx,host模式走此分支;
- 处理!useExternalKey情况生成osSbox,与useDefaultSandBox不同的是,osl.NewSandbox()传入的有效参数为true;
- 把sandbox放入controller的sandboxes中;
- 调用sb.storeUpdate()存储sandbox。
controller::Sandboxes()
Sandboxes()可以获取controller的sandboxes字段中的sandbox。
|
|
controller::WalkSandboxes()
WalkSandboxes()对每一个sandbox做操作,直到walker()返回true。
|
|
controller::SandboxByID()
SandboxByID()依据id获取sandbox。
|
|
controller::SandboxDestroy()
SandboxDestroy()可以依据id删除sandbox。
|
|
controller::SandboxContainerWalker()
SandboxContainerWalker()可以返回指定containerID的walker,该walker可以找到与containerID匹配的sandbox,并把sandbox赋给out。
|
|
controller::SandboxKeyWalker()
与SandboxContainerWalker()相同,只是比较的是存储Key。
|
|
Sandbox
再来看下sandbox的定义,Sandbox定义在/libnetwork/sandbox.go中,表示一个net namespace:
|
|
主要字段含义如下:
- id: 随机生成的sandbox号;
- containerID: 容器ID;
- osSbox: 真正的net namespace;
- controller: sandbox所属的controller;
- resolver: 容器的DNS域名服务器(因为对swarm不熟悉,所以还不知道为什么不直接设置一个公共的域名服务器);
- endpoints: 该sandbox中绑定的endpoint,endpoints的类型是epHeap,但实际上是[]*endpoint;
- epPriority: endpoints的优先级;
sandbox::ID()
ID()可以返回sandbox的id。
|
|
sandbox::ContainerID()
ContainerID()可以返回sandbox的containerID。
|
|
sandbox::Key()
Key()可以返回该sandbox的存储key。
|
|
sandbox::Delete()
Delete()可以删除本sandbox。Delete()调用了delete(),delete()的流程如下:
- 标识inDelete,表示该sandbox在删除中;
- 释放绑定的endpoints;
- 停止resolver;
- 移除osSbox,即真正的net namespace;
- 从store中删除;
- 从controller中删除该sandbox。
其中步骤2通过调用endpoint的Leave()和Delete()完成。
|
|
sandbox::Rename()
Rename()可以更改绑定的endpoint的name,但现在还不知道为什么要更改名字。
|
|
sandbox::Refresh()
Refresh()先解绑所有的endpoint,重新配置后再绑定之前的endpoint。
|
|
sandbox::Endpoints()
Endpoints()可以返回sandbox中所有的endpoint,返回的类型是Endpoint interface。
|
|
sandbox::getConnectedEndpoints()
和Endpoints()一样,只是返回的类型为endpoint。
|
|
sandbox::removeEndpoint()
removeEndpoint()从sandbox中移除endpoint。
|
|
sandbox::execFunc()
execFunc()可以在net namespace中执行命令。
|
|
其他
ResolveName(): 通过name获取ip;
ResolveIP(): 通过ip获取name;
SetKey(): 更新sandbox key,当使用外来的net namespace时使用,将在controller的监听unix socket中详细分析。