返回 登录
0

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

前言:
Rancher所有的服务都是运行在Container中,这给我们部署Rancher集群提供了非常大的便利, 不会像刚入门OpenStack那样需要手动安装每个组件让人心力憔悴。但是手动部署的确让我们知晓了一些其中内涵; Rancher给我们省去了部署的麻烦,但是作为技术人员我们若要去hold住Rancher,那么我们必须对它的架构了如指掌。
注:
本文初写时Rancher还没有Release正式版,所以架构每次小升级可能都会有些许变动, 需要声明,下面内容已跟踪至 Rancher-v0.59.0 版本。

整体架构分析

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

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

故事插播完毕。相信随着Rancher的不断升级优化,Cattle肯定会被分拆成各个小组件,然后用Golang实现,这是后话。下面我们先用一张图看下Rancher-server都包含了什么:
图片描述
图解:
1.)Supervise负责对Mysql和Cattle服务进行进程监控,保证服务不宕机;
2.)Cattle是Rancher的核心引擎,env/stack/service的逻辑管理,service的health check,调度策略等;
3.)websocket-proxy——通过UI查看Container log或是执行docker exec等,都是通过该服务代理到对应的rancher-host上执行,数据传输使用websocket协议;
4.)Rancher-Catalog-Service——Catalog是Rancher一个应用市场,里面包含官方提供的各种应用,用还包括一些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-service,lb-service也是基于Rancher/Agent-Instance来实现的。我们还是用一张图来有一个整体感官的了解:
图片描述
图解:
1.)main-service是一个具有privileged权限的容器,负责和Rancher-service的Cattle引擎做通信,并管理host上的其他服务容器;
2.)Other-service是一个容器,负责给host上其他应用容器提供服务;
3.)每个LB-service都会在host上基于Rancher/Agent-Instance生成对应数量的容器。

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

我们运行很多个Stack、Service之后,host上会有很多Container,我们会在Rancher-UI上看到Container的网络是10.42.0.0/16, host上的Container之间的网络是一种怎样的形式呢?分析这个主要还是看Container的IP Addr &IP route, 以及host的iptables,我们还是一张图来看一下:
图片描述
Rancher-DNS& Rancher-MetaData 是我们需要了解的重点组件。我们使用的Service Link功能其实就是通过Rancher-DNS实现的, Rancher-MetaData与Confd结合可以让我们在App-Container中动态载入配置, 另外Rancher的External-DNS也得依赖它,这个我会在后续的文章中具体描述。

host的内部网络看过之后,我们来看看Container跨主机通信的实现,主要通过两个UDP端口500 and 4500, 网络流量出站入站通过host的IPtables规则处理,IP地址为172.17.0.2这个Container就是运行Rancher-NET的Container。
图片描述
计算和网络聊完,我们再来看看存储。Rancher自己实现了一个Docker-Volume-Driver即Convoy。Convoy不生产存储, 它只是存储的搬运工,它相当于把各种存储接口做一个统一的抽象,目前支持Device Mappe、GlusterFS/NFS、EBS等, 目前使用上可以参考Rancher-Catalog中的实现,我们可以在UI上看到Convoy GlusterFS & Convoy NFS, 如果你的环境中已经有NFS和GlusterFS的实现,填写一些相关参数进行部署即可。 它主要做的事就是在每个host上部署Convoy-Agent服务并把对应的共享卷挂载上来,这样每个App-Container就可以用过Convoy使用共享卷。
图片描述
Ok,本次分享暂告一个段落,了解更多Rancher中文资讯敬请关注我们!

本文来源:链接内容

评论