云舒网络:Rancher架构深度剖析

前言:

Rancher所有的服务都是运行在Container中,这给我们部署Rancher集群提供了非常大的便利, 不会像刚入门OpenStack那样需要手动安装每个组件让人心力憔悴。但是手动部署的确让我们知晓了一些其中内涵; Rancher给我们省去了部署的麻烦,但是作为技术人员我们若要去holdRancher,那么我们必须对它的架构了如指掌。

注:

本文初写时Rancher还没有Release正式版,所以架构每次小升级可能都会有些许变动, 需要声明,下面内容已跟踪至 Rancher-v0.59.0 版本。

 本文来源:http://www.cloudsoar.com/about/BlogNews/content/0/141/v1.1/


整体架构分析

 

Rancher-server是Rancher的控制节点,负责管理接入的各个host节点,里面运行着rancher的核心组件Cattle Rancher几乎全部的服务都是用Golang写的,而只有这个Cattle组件是Java写的。

 

关于Cattle组件为什么是Java写的,这里插播一段小故事。Rancher的创始人梁胜博士我们都知道是CloudStack创始人, CloudStack我们都知道是Java写的。梁博士早期在Sun工作搞过JVM,所以用Java来做CloudStack也是技术继承顺理成章的事。 在做CloudStack过程中,出现了一个奇人,这哥们就是Darren ShepherdDarren在另外一家名叫GoDaddy(卖域名那货)的公司工作, 这哥们是重构狂,把CloudStack的核心引擎重写了四五次。后来CloudStack被收购再后来梁博士出来搞Rancher就把Darren一起叫上, DarrenRancher的代码贡献量可以用吨来计算了。所以这个Cattle大家如果细心一点,应该能找到CloudStack的影子。

 

故事插播完毕。相信随着Rancher的不断升级优化,Cattle肯定会被分拆成各个小组件,然后用Golang实现,这是后话。下面我们先用一张图看下Rancher-server都包含了什么:

 

 

图解:

1.)Supervise负责对MysqlCattle服务进行进程监控,保证服务不宕机;

2.)CattleRancher的核心引擎,env/stack/service的逻辑管理,servicehealth check,调度策略等;

3.)websocket-proxy——通过UI查看Container log或是执行docker exec,都是通过该服务代理到对应的rancher-host上执行,数据传输使用websocket协议;

4.)Rancher-Catalog-Service——CatalogRancher一个应用市场,里面包含官方提供的各种应用,用还包括一些rancher本身的服务,如external-dns服务和convoy服务等;

5.)Rancher-Compose-executor——Rancher-Compose CLI的服务端实现;

6.)go-machine-service——使用docker-machine来做rancher-host的管理,create/active/delete/purge

 

Rancher-server管理的各个host节点,我们在添加它们时候都会在相应的host上启动一个拥有Privilege权限的Container, 这个Container基于Rancher/Agent镜像,它首先会连接Rancher-server验证一个Secret & Key, 成功后再启动一个Rancher/Agent container也是Privilege级别的,最终这个Container负责和Rancher-server保持连接,并接收各种操作的event。 如果当前host要使用Rancher Managed网络,那么还会启动一个基于 Rancher/Agent-Instance 镜像的Container。 同样如果添加了lb-servicelb-service也是基于Rancher/Agent-Instance来实现的。我们还是用一张图来有一个整体感官的了解:


图解:

1.)main-service是一个具有privileged权限的容器,负责和Rancher-serviceCattle引擎做通信,并管理host上的其他服务容器;

2.)Other-service是一个容器,负责给host上其他应用容器提供服务;

3.)每个LB-service都会在host上基于Rancher/Agent-Instance生成对应数量的容器。

 

值得一提的是Rancher-NET组件,从 v0.56 开始不用Racoon实现IPSec了,改成用Rancher-NET包装StrongSwan, 用Charon实现IKE,从Rancher-NETpackage架构看,未来是要实现多种backend,很期待VXLANVLAN的实现。 Docker-NETwork的接入应该只是时间问题。如果部署在内部环境里,用IPSec做网络隔离还是有点重。

 

我们运行很多个StackService之后,host上会有很多Container,我们会在Rancher-UI上看到Container的网络是10.42.0.0/16 host上的Container之间的网络是一种怎样的形式呢?分析这个主要还是看ContainerIP Addr &IP route, 以及hostiptables,我们还是一张图来看一下:


Rancher-DNS& Rancher-MetaData 是我们需要了解的重点组件。我们使用的Service Link功能其实就是通过Rancher-DNS实现的, Rancher-MetaDataConfd结合可以让我们在App-Container中动态载入配置, 另外RancherExternal-DNS也得依赖它,这个我会在后续的文章中具体描述。

 

host的内部网络看过之后,我们来看看Container跨主机通信的实现,主要通过两个UDP端口500 and 4500, 网络流量出站入站通过hostIPtables规则处理,IP地址为172.17.0.2这个Container就是运行Rancher-NETContainer


计算和网络聊完,我们再来看看存储。Rancher自己实现了一个Docker-Volume-DriverConvoyConvoy不生产存储, 它只是存储的搬运工,它相当于把各种存储接口做一个统一的抽象,目前支持Device MappeGlusterFS/NFSEBS等, 目前使用上可以参考Rancher-Catalog中的实现,我们可以在UI上看到Convoy GlusterFS & Convoy NFS, 如果你的环境中已经有NFSGlusterFS的实现,填写一些相关参数进行部署即可。 它主要做的事就是在每个host上部署Convoy-Agent服务并把对应的共享卷挂载上来,这样每个App-Container就可以用过Convoy使用共享卷。


Ok,本次分享暂告一个段落,了解更多Rancher中文资讯敬请关注我们!

温馨提示:

云舒网络 http://www.cloudsoar.com 携手Rancher Labs推出【Rancher | 实战微信群】,在线为您分享Docker技术干货,更有往期回顾精选期刊等你拿!

 

本群汇集了Rancher中国最强技术精英团队及业内技术派高人,宗旨是为了大家拥有更专业的平台交流Rancher实战技术,实时与Rancher创始团队面对面!同时欢迎各位分享自己的经验、疑难问题,我们将定期邀请分享嘉宾做各类话题分享及回顾,共同实践研究Docker容器生态圈。

RancherDocker技术感兴趣、或对本文中细节需继续探讨的朋友,欢迎加入本群参与讨论! 

加微信群方法:

  1.关注【云舒网络】公众号

  2.留言”我要加群” 

QQ群号:216521218