Rancher v1.2基础设施引擎整体架构分析

Rancher v1.2基础设施引擎整体架构分析

大家好,又见面了,我是全栈君。

Rancher Labs官方于12月1日发布了其容器部署与管理平台Rancher的最新版本,Rancher v1.2。Rancher v1.2可以说是一个里程碑版本,只要体会其新版功能,会发现漫长的等待绝对是值得的。

从架构角度看,用两个字来概括就是“解耦”,基础设施引擎的分离,agent节点的服务粒度更细;

从产品角度看,给了用户更多定制的空间,Rancher依然秉持着全部OpenSource的理念;

在开发语言上,之前遗留的通过shell脚本方式的粗糙实现也都基于Golang重写,解耦的新服务也几乎使用Golang开发,agent节点全线基于Golang这也为后续便利地支持ARM埋下伏笔;

在市场选择上,Rancher依然在kubernetes下面投入了大量精力,引入了万众期待的CNI plugin管理机制,坚持要做最好用的Kubernetes发行版。

本文就带着大家从架构角度总览Rancher v1.2版本的特性。

架构总览

在v1.2版本的整体架构图(如下图所示)上,Cattle引擎向下深入演化成了基础设施引擎,这一点上在v1.1时代也早有体现。Cattle更多得作为基础设施的管理工具,可以用它来部署其他服务和编排引擎,当然它本身编排能力还是可以使用的,习惯了stack-service的朋友仍然可以继续使用它,同时rancher scheduler的引入也大大增强了其调度能力。Rancher仍然支持Kubernetes、Mesos、Swarm三大编排引擎,Kubernetes可以支持到较新的v1.4.6版本,由于所有的部署过程的代码都是开放的,用户依然可以自己定制部署版本。值得一提的是,Rancher支持了新版的Swarm Mode也就是Swarmkit引擎,这也意味着Rancher可以在Docker1.12上部署,不小心装错Docker版本的朋友这回可以放心了。

wKiom1jGia6Sn-VCAAEFU6DDKpc100.png

在存储方面,Rancher引入了Kubernetes社区的flexvol来做存储插件的管理,同时也支持Docker原生的volume plugin机制,并实现了对AWS的EFS&EBS以及标准NFS的支持,先前的Convoy应该会被抛弃,Rancher最终还是选择参与社区标准。在网络方面,除了CNI插件机制的引入,用户还可以使用rancher-net组件提供的vxlan网络替代先前的ipsec网络。在可定制性方面,还体现在Rancher提供了用户可以自定义rancher-lb的机制,如果特殊场景下默认的Haproxy不是很给力时,用户可以自定义使用nginx、openresty或者traefik等等。下面便做一下详细分解。

 

基础设施引擎

初次安装v1.2版本,会发现多了Infrastructure(如下图所示)的明显标识,默认的Cattle引擎需要安装healthcheck、ipsec、network-services、scheduler等服务。这个是有rancher-catalog来定义的,https://github.com/rancher/rancher-catalog,新分离出来了infra-templates和project-templates:infra-templates就是Rancher定义的各种基础设施服务,包括基础服务和编排引擎;project-templates对应的是Env初始化时默认安装的服务,它可以针对不同的编排引擎进行配置。

wKioL1jGicDTKHowAABysR4ZS9o387.png

以Cattle引擎为例,可以在project-templates的Cattle目录中找到相应的配置文件,当ENV创建初始化时会创建这里面定义的服务,这样一个机制就可以让我们可以做更深入的定制,让ENV初始化时创建我们需要的服务:

wKiom1jGic6SjPCYAABmf1GDKxw835.jpg

在Cattle引擎调度方面,Rancher实现了rancher-scheduler,https://github.com/rancher/scheduler。它实现了允许用户按计算资源调度,目前支持memory、cpu的Reservation。其实现原理是,内部有一个resource watcher,通过监听rancher metadata的获取Host的使用资源数据变化,进而得到ENV内所有Host资源汇总信息。与此同时,监听rancher events的scheduler.prioritize、scheduler.reserve、scheduler.release等各种事件,通过排序过滤可用主机后发送回执信息,Rancher Server就有了可以选择的Host列表。如下图所示:

wKioL1jGid2DK27lAABq1_FiUuc335.png

需要注意的是,rancher-scheduler并没有和rancher-server部署在一起,而是在你添加Host时候部署在agent节点上,当然rancher-scheduler在一个ENV内只会部署一个。

Agent节点服务解耦

agent节点一个最大的变化就是,agent-instance容器没有了,它被拆分成多个容器服务,包括rancher-metadata、network-manager、rancher-net、rancher-dns、healthcheck等。

wKiom1jGie7BKzPDAACb4HbwTu8268.png

metadata服务是老朋友了,它在每个agent节点上保存了host、stack、service、container等的信息,可以非常方便的在本地调用取得,https://github.com/rancher/rancher-metadata,在新的体系中它扮演了重要角色,几乎所有agent节点上的服务均依赖它。在先前的体系中,metadata的answer file的更新是通过事件驱动shell脚本来执行下载,比较简单粗暴。v1.2开始使用监听rancher events方式来reload metadata的answer file,但是answer file还需要到rancher server端下载,总的来说效率还是有一定提升的。

dns在新的体系中仍然承担着服务发现的功能,https://github.com/rancher/rancher-dns。除了拆分成单独容器之外,它也在效率上做了改进,它与rancher-metadata容器共享网络,以metadata的结果生成dns的answer file。与之前的架构相比,省去了dns answer file下载的过程。需要注意的是,rancher-dns的TTL默认是600秒,如果出于各种原因觉得dns作为服务发现不是很可靠,那么可以使用etc-host-updater和rancher-metadata的组合,etc-host-updater(https://github.com/rancher/etc-host-updater)会根据metadata数据动态生成hosts文件并写入容器内,这样通过服务名访问时,其实已经在本地转换成了IP,无需经过dns,如下图所示:

wKioL1jGifqSd_4sAAAuPeUgOeo905.png

rancher-net作出了比较重大的革新,https://github.com/rancher/rancher-net,除了继续支持原有的ipsec外,还支持了vxlan。这个支持是原生支持,只要内核有vxlan的支持模块就可以。vxlan并不是Cattle的默认网络,使用时可以在infra-catalog中重新选择它来部署,其实现以及部署方式后续会在专门的文章中进行探讨:

wKioL1jGigTC-WZhAABmVssbXCQ850.png

network-manager的引入为Rancher v1.2带来了一个重要特性就是CNI插件管理,在之前的版本中很多用户都提到rancher-net本身的网络无法满足业务需求。容器网络之争,无非就是CNM与CNI,Rancher选择站队CNI,这也是为了更好与Kubernetes融合。而CNI的插件很多种,Calico、Weave等之流,每个插件的部署方式都不一样。Rancher为了简化管理提出了network-manager,https://github.com/rancher/plugin-manager,它可以做到兼容主流的CNI插件,它实际上定义了一个部署框架,让CNI插件在框架内部署。network-manager是以容器方式部署,由于每种插件在初始化时可能需要暴露端口或加入一些NAT规则,所以network-manager能够动态设置不同插件的初始化规则,它的做法是以metadata作为 host port和host nat规则的数据源,然后获取数据后生成相应的Iptables规则加入的Host中。而对于真正的CNI插件,需要在network-manager容器内/opt/cni目录下部署对应cni插件的执行程序(calico/weave),/etc/cni目录下部署cni插件的配置,这两个目录映射了docker卷rancher-cni-driver,也就是Host上的/var/lib/docker/volumes/rancher-cni-driver目录下。

关于healthcheck,先前是通过agent-instance镜像实现,里面内置了Haproxy,事件驱动shell脚本来下载healchcheck配置并reload。新的架构中,Rancher实现了单独的healthcheck,https://github.com/rancher/healthcheck,采用Golang微服务的方式,数据源是metadata。当然healthcheck的最终检查仍然是通过与Haproxy sock通信来查看相应member的健康状态(原理如下图),healthcheck的实现主要是为了将其从agent-instance中解耦出来。

wKiom1jGihPAtkZwAAG3WqTZsfM638.png

总结

Rancher v1.2的新特性非常多,基础设施引擎的变化是一切特性的基础,在这篇开篇之作之后,我们后续会持续为大家带来Kubernetes与Swarmkit的支持、自定义rancher-lb、vxlan的支持、各种CNI插件的集成以及各种存储接入的实践操作指南等等。

本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/1906140

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108004.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 对成绩进行排序c语言_c语言对学生成绩进行排序

    对成绩进行排序c语言_c语言对学生成绩进行排序解题思路:注意事项:注意姓名字符串的长度要大于8,因为这个调了很多次参考代码:#include#include#includeusingnamespacestd;structstudent{intnumber;charname[9];intscore;}buf[100000];boolcmp1(studenta,studentb){returna.number}boolcm…

    2022年9月25日
  • 怎样学习工业PLC

    怎样学习工业PLC可编程控制器是集计算机技术、通讯技术、自动控制技术为一体的工业控制装置。对于初学者来说掌握了plc基本原理,熟悉常用的编程方法,在进行简单系统编程时尚可以运用自如,但对较为复杂的控制系统设计往往力不从心,要想在PLC应用方面得心应手,学习者除了要建立正确的学习方法,深入学习plc编程技巧,最重要的是相关知识的学习。下面从六个方面谈谈我的教学心得。一、多收集程序范例、增加编程经验在PLC的编程方…

    2022年10月18日
  • if python用法_for循环语句

    if python用法_for循环语句今天,我们将学习Python中if语句的基本使用。if在Python中用作某个条件或值的判断,格式为:if条件: 执行语句1else: 执行语句2else是当条件不成立时运行的代码。我们先来看个例子,程序判断天气情况并输出是否要带伞:weather=input(“今日天气是:”)ifweather==”雨天” print(“今天出门需要带伞”)else: print(“今天出门不需要带伞”)运行代码,输入雨天会提示要带伞。if语句中用的两个“=”是什么呢

    2022年9月26日
  • 关于面试总结11-selenium面试题[通俗易懂]

    关于面试总结11-selenium面试题[通俗易懂]前言面试web自动化必然会问到selenium,问selenium相关的问题定位是最基本的,也是自动化的根本,所以面试离不开元素定位问题。之前看到招聘要求里面说“只会复制粘贴xpath的就不要投简历了”,说明面试官对求职者的自动化能力要求不能停留在复制粘贴上。还是那句话,想学自动化的话,需牢记:录制穷三代,复制毁一生!1.如何判断一个页面上元素是否存在?这个可以说是被问烂的题了,判断元素存在方法有三种:方法一,用try…except…defis_element_exsist(driver,

    2022年6月20日
  • 文本挖掘实例[通俗易懂]

    文本挖掘实例[通俗易懂]文本挖掘junjun2016年2月4日文本分析的应用越来越广泛,今天就讲讲关于评论数据的那点事。评论数据的获取:一般通过网络爬虫的方式抓取各大网站的评论数据,本次分析数据就来源于携程网某酒店的评论,成功爬取该酒店的评论数据,于是我开始使用这些数据做相关的分析。(注意:数据分析、挖掘时,这部分工作可以有专门的人员来完成)1、加载数据和包#1)本文使

    2022年6月26日
  • springboot 之 使用jasypt加密解密插件[通俗易懂]

    springboot 之 使用jasypt加密解密插件[通俗易懂]简单使用jasypt是一个java实现的安全框架1、该工具支持注解方式开启jasypt功能,以及注解方式引入一个或多个需要处理的配置文件。 2、该工具同时支持properties与yml文件的解析处理。 3、该工具支持自定义加解密类型和复写加解密方法。引入插件<dependency> <groupId>com.github.ulisesbocchio&…

    2022年9月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号