本文共 2392 字,大约阅读时间需要 7 分钟。
本文原文QQ空间链接:
本文原文csdn博文链接:
我们先看看cluster的构建。
代码在swarm\manage.go
初始化了一个cluster对象
更新nodes
另外在scheduler和api server中也都传进去了cluster对象。
说明cluster的重要
代码在swarm\cluster\cluster.go
先看结构体
里面最重要的两个东西
1、store,这个前面一篇文章已经分析过了
2、nodes,这个用于保存集群中的节点信息,并与节点进行连通的部分
看下NewCluster函数
下面我们看看cluster提供的一些接口
这是一个重要的接口,用于与discovery对接,用于node的更新
将传入的node,进行遍历,连接(Connect),并添加(AddNode)
添加node,通过map存储信息,来判断是否重复添加。功能很简单
用于设置eventhandler。在构建流程汇总,设置了一个loghandler
部署一个Container
通过node进行create一个Container,创建成功后,将信息保存包store中。
销毁一个Container。
从node中销毁Container,成功后,也将其信息从store中删除。
cluster的功能简单,就是属于一个简单地管理功能。具体的操作还是在node中。
我们先看看结构体
代码在swarm\cluster\node.go
其中一些比较关键的东西有
containers:用于记录当前node上部署的containers
images:用于记录当前node上的镜像信息
client:这个是关键,用于与node连接的接口
下面我们看看container结构体
代码在swarm\cluster\container.go
下面看看node的一些操作
创建node
都是一些基本参数的初始化
在构建完node之后,就会调用Connect对node进行连接
上面代码中构建了一个dockerclient,用于与node连接
对于上面代码中的流程,下面我们一个一个的进行分析
其实这里才是对node结构体里面的成员进行初始化的地方。
获取到了id,name,cpus等等信息,将其初始化到node结构体中
更新node上的container信息。
通过dockerclient获取到container list信息。
在上面的RefreshContainers,只是获取到了container list,真正进行更新的是在updateContainer这个函数中
获取到Container信息后,判断是否已经有记录。
没有记录的则要重新调用dockerclient.InspectContainer获取Container信息。
用于更新images信息。
调用dockerclient,获取images list,并进行更新
这个是死循环。
有两个chan信号
1、Container信息更新同步信号。下图是信号来源
2、强制超时Container信息更新同步信号,下图是超时时间
继续refresh loop
如果出错,则刷新images。
如果还是出错,则判断node disconnet,打印日志。
如果没有err,则判断是否healthy,如果不是,则要进行重连操作。先调用StopAllMonitorEvents,再调用StartMonitorEvents
下面我们看看handler。这个很关键。这里提供了关于一些操作的接口。用于dockerclient的回调。具体还得需要看看dockerclient源码
代码在github.com\samalba\dockerclient\dockerclient.go
先看看结构体
从上面一看就知道,其是对httpclient的一个封装
构建了docketclient结构体,其最主要的还是构建httpclient
我们先来看看这个函数是干嘛用的
这里有一个标志位。然后调用了getEvents
这里像node发起了events的get请求,用于获取event。通过解码,获取event信息,然后调用node传入dockerclient中的handler来进行事件回调处理。
仅仅是设置了一个标志位
通过像node发起get请求,获取images信息,然后解码返回
把Container信息经过json编码,然后通过post请求发送到node上
dockerclient还提供了很多的接口,基本上都是通过构建http请求,来与node进行通信。就不一一的去贴代码了。下图是docketclient提供的操作
文中如果有哪里讲解的不对的地方,还请见谅,望指正。
龚浩华
QQ 月牙寂 道长 29185807
2016年5月11日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注