swarm源码分析(3)---manage cluster

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

1、构建流程

我们先看看cluster的构建。

代码在swarm\manage.go

初始化了一个cluster对象

更新nodes

另外在scheduler和api server中也都传进去了cluster对象。

说明cluster的重要

2、cluster

代码在swarm\cluster\cluster.go

先看结构体

里面最重要的两个东西

1、store,这个前面一篇文章已经分析过了

2、nodes,这个用于保存集群中的节点信息,并与节点进行连通的部分

看下NewCluster函数

下面我们看看cluster提供的一些接口

UpdateNodes

这是一个重要的接口,用于与discovery对接,用于node的更新

将传入的node,进行遍历,连接(Connect),并添加(AddNode)

AddNode

添加node,通过map存储信息,来判断是否重复添加。功能很简单

Events

用于设置eventhandler。在构建流程汇总,设置了一个loghandler

DeployContainer

部署一个Container

通过node进行create一个Container,创建成功后,将信息保存包store中。

DestroyContainer

销毁一个Container。

从node中销毁Container,成功后,也将其信息从store中删除。

小结

cluster的功能简单,就是属于一个简单地管理功能。具体的操作还是在node中。

3、Node

我们先看看结构体

代码在swarm\cluster\node.go

其中一些比较关键的东西有

containers:用于记录当前node上部署的containers

images:用于记录当前node上的镜像信息

client:这个是关键,用于与node连接的接口

下面我们看看container结构体

代码在swarm\cluster\container.go

下面看看node的一些操作

NewNode

创建node

都是一些基本参数的初始化

Connect

在构建完node之后,就会调用Connect对node进行连接

上面代码中构建了一个dockerclient,用于与node连接

对于上面代码中的流程,下面我们一个一个的进行分析

updateSpecs

其实这里才是对node结构体里面的成员进行初始化的地方。

获取到了id,name,cpus等等信息,将其初始化到node结构体中

RefreshContainers

更新node上的container信息。

通过dockerclient获取到container list信息。

updateContainer

在上面的RefreshContainers,只是获取到了container list,真正进行更新的是在updateContainer这个函数中

获取到Container信息后,判断是否已经有记录。

没有记录的则要重新调用dockerclient.InspectContainer获取Container信息。

refreshImages

用于更新images信息。

调用dockerclient,获取images list,并进行更新

refreshLoop

这个是死循环。

有两个chan信号

1、Container信息更新同步信号。下图是信号来源

2、强制超时Container信息更新同步信号,下图是超时时间

继续refresh loop

如果出错,则刷新images。

如果还是出错,则判断node disconnet,打印日志。

如果没有err,则判断是否healthy,如果不是,则要进行重连操作。先调用StopAllMonitorEvents,再调用StartMonitorEvents

handler

下面我们看看handler。这个很关键。这里提供了关于一些操作的接口。用于dockerclient的回调。具体还得需要看看dockerclient源码

4、dockerclient

代码在github.com\samalba\dockerclient\dockerclient.go

先看看结构体

从上面一看就知道,其是对httpclient的一个封装

NewDockerClient

构建了docketclient结构体,其最主要的还是构建httpclient

StartMonitorEvents

我们先来看看这个函数是干嘛用的

这里有一个标志位。然后调用了getEvents

这里像node发起了events的get请求,用于获取event。通过解码,获取event信息,然后调用node传入dockerclient中的handler来进行事件回调处理。

StopAllMonitorEvents

仅仅是设置了一个标志位

ListImages

通过像node发起get请求,获取images信息,然后解码返回

CreateContainer

把Container信息经过json编码,然后通过post请求发送到node上

小结

dockerclient还提供了很多的接口,基本上都是通过构建http请求,来与node进行通信。就不一一的去贴代码了。下图是docketclient提供的操作

文中如果有哪里讲解的不对的地方,还请见谅,望指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏TungHsu

这或许是对小白最友好的python入门了吧——2,变量和字符串

长期以来,编程界都认为刚接触一门新语言时,如果首先使用它来编写一个在屏幕上显示消息 “Hello world!” 的程序,将给你带来好运。 因为微信排版编辑问题...

2625
来自专栏Aloys的开发之路

屏幕输出VS文件输出

问题1:我们在编写程序时经常需要数一些数据到屏幕,来查看我们的结果是否正确,虽然直接输出到屏幕,查看起来呢很方便,但当数据量很大时,需要耗费大量的时间。于是我...

17610
来自专栏xingoo, 一个梦想做发明家的程序员

《vi和vim》 学习手记(2)

:set wm=10 设置与右边界的距离。右边界为10个字符。 o 移到一行的开头 s 移到一行的结尾 w 移到下一个单词的 b 退后一个单词 S 更改一行文本...

1738
来自专栏PHP技术

PHP转义Json里的特殊字符的函数

在给一个 App 做 API,从服务器端的 MySQL 取出数据,然后生成 JSON。数据中有个字段叫 content,里面保存了文章内容,含有大量 HTML ...

3196
来自专栏开源优测

python selenium2源码 - 核心package: remote分析

说明 本章主要对selenium2核心package remote 进行说明,remote主要包含了以下几个模块: __init__.py ...

3045
来自专栏Laoqi's Linux运维专列

MongoDB 操作配置

3074
来自专栏刘君君

Spring Boot 静态资源处理

3826
来自专栏性能与架构

小程序示例 - 不同页面间的消息传递

场景 假设有两个页面:用户列表页、信息编辑页 在列表中点击后某条信息后,进入编辑页面 ? 修改了用户信息后,返回到列表页,列表中需要显示修改后的信息 例如把 “...

3317
来自专栏Python爬虫实战

Python指南:文件处理

哪种文件格式最适合用于存储整个数据集——二进制、文本还是XML?这严重依赖于具体的上下文。

821
来自专栏代码世界

Django之路由系统

Django的路由系统   URL配置其实就是告诉Django项目你执行代码的路径,本质就是路径和调用的视图函数之间的映射关系表。Django通过这个表,可以把...

2617

扫描关注云+社区