资讯专栏INFORMATION COLUMN

Rainbond设计分享系列(1)基于Midonet的多租户网络设计

QLQ / 3140人阅读

摘要:今天跟大家分享基于的多租户网络设计和思考。对多租户支持的实现基础是对多租户的网络支持,公有云要求每个租户之间网络必须隔离,形成相互安全的租户网络环境。

今天跟大家分享Rainbond基于Midonet的多租户网络设计和思考。

Rainbond对多租户支持的实现基础是对多租户的网络支持,Rainbond公有云要求每个租户之间网络必须隔离,形成相互安全的租户网络环境。对于不同的SDN网络,实现方式各不相同,例如Calico从路由规则上隔离,Midonet可以为不同租户创建子网等。Rainbond底层采用Kubernetes作为应用运行方案,其采用标准的CNI网络接入规范,为Rainbond支持多种网络提供了标准化支持。

对于中小集群用户,Rainbond推荐使用基于Calico的网络方案,作为Kubernetes社区常用方案之一,本文不再详细介绍。我们今天分享重点是对于大型集群或对租户网络隔离有严格要求的用户,也就是基于Midonet的方案。

什么是CNI规范

(CNI)[https://github.com/containern...](Container Networking Interface)是为在Linux运行的容器提出的一种通用的基于插件的网络解决方案,其最初来源于Rkt容器网络设计,目前被Kubernetes等项目标准支持。其最新已到0.3.0版本,目前Rainbond支持0.2.0版本。其面向两个抽象实体:

容器 可以被认为是Linux网络命名空间的同义词。与之相对应的单元取决于特定的容器运行时实现:例如,在应用容器规范(如Rkt)的实现中,每个容器运行在唯一的网络名称空间中。另一方面,在Docker中,每个多带带的Docker容器通常都存在网络名称空间。

网络 是指一组实体,它们是唯一可寻址的,可以相互通信。这可以是单个容器(如上所述),机器或其他网络设备(例如路由器)。容器可以在概念上添加到一个或多个网络或从中删除。

Rainbond中每个应用运行实例使用一个网络空间,运行实例创建和销毁分别会设置和回收网络资源。因此,网络资源是一个动态的可复用的资源。

MidoNet SDN网络

MidoNet是由日本的SDN公司Midkura研发的一款网络虚拟化软件,其基于底层物理设施来实现网络虚拟化,具有分布式、分散、多层次的特点,主要作为OpenStack中的默认网络组件,可以让虚拟网络解决方案,特别是专为网络基础设施设计的方案,为云平台如OpenStack服务,并且将其网络存贮栈虚拟化。MidoNet为每个租户分配一个逻辑router,租户与租户之间是相互隔离的,租户内部之间是能够相互通讯的,Midonet支持L2交换、L3路由、L4负载均衡
有状态和无状态NAT,逻辑和分布式防火墙,BGP与ECMP支持。其架构主要包含以下组件:

Midolman(Midonet Agent):Midonet

Agent安装在各个计算节点,负责建立网络流量控制和提供分布式Midonet网络服务,路由,NAT等他把相关的虚拟网络信息存放到NSDB。

Network State

Database(NSDB):存储网络配置和状态,网络拓扑,路由,Midonet不集中处理网络功能,由Midonet Agent处理,Midonet Agent会跟NSDBs做实时同步当有变化时候会及时同步并且更新NSDB

MidonetAPI

midonet提供restful API接口提供全套的模型操作,这对于我们为其做CNI-plugin奠定基础。

MidoNet支持大规模SDN集群,其架构理论上支持上万节点。Rainbond基于Midonet网络可支持上万节点集群,其最初设计用于OpenStack虚拟机网络,我们将其与容器适配,使其成为标准的容器网络解决方案。

MidoNet多租户下网络结构模型

SDN(软件定义网络),midonet软件定义你所熟知的网络组件。以下简单介绍几个核心的软件定义概念:

Router(路由器)
一个租户对应一个Router,连接到同一个Router的Bridge网络互通。Midonet会创建一个PrivierRouter,所有租户Router连接到PrivierRouter与外网互通。可以理解为一个路由器内网互通,连接上级路由器接入公网。

Bridge(网桥)
一个租户下可以有多个Bridge,每个Bridge使用不同的网段。例如一个Bridge网段为192.168.0.0/24,最多可以有253个虚拟设备连接到本Bridge。

Port(设备通信端口)
Router与Router之间,Router与Bridge之间的通信接口。

Route(路由)
路由规则,给Router定义流量包转发端口的规则。

Rule(过滤规则)
定义包过滤条件。类似于iptables。

基于MidoNet的CNI插件实现

midonet数据交换工作在三层,但是其本身不提供IP地址管理(IPAM),因此基于Midonet的cni插件需要完成以下工作:

IPAM 区别不同的租户为应用实例分配可用IP和回收已销毁实例的IP地址,同时还需要为下文涉及的Router,Bridge 分配IP网段。每一个Router具有一个IP地址,且全局唯一不冲突。每一个Bridge具有一个唯一网段,连接的虚拟网卡具有全局唯一IP。IPAM需要数据存储,本该是有状态的守护服务。但是CNI-Plugin必须设计成无状态的命令,因此我们使用etcd作为我们的数据存储服务,其全局一致性保证了我们端口分配的正确性。
租户Router创建 一个新租户第一个实例启动阶段会为当前租户在Midonet中创建虚拟租户子网。并连接到PrivierRouter与外围直连。
租户Bridge创建 一个租户可以有一个或多个Bridge,根据其实例数量决定,每个网桥具有不同的虚拟网段,最多支持253个运行实例。
容器网卡创建 为目标容器创建网卡接口是CNI插件必备的功能,根据需要可创建多个或一个,这里接入Midonet Bridge需要一个网卡。
端到端连接建立 每一个Bridge需要与租户Router建立连接,每一个运行实例需要与对应的Bridge建立连接。
路由过滤规则 PrivierRouter到租户Router需要路由规则,租户Router到Bridge需要路由规则和过滤规则。

租户网络初始化

当新租户第一次创建容器时进行租户虚拟设备的初始化创建,上文我们已经介绍了一个租户需要创建的虚拟设备有哪些,这里我讲讲细节。
Midonet提供了Rest-API来操作虚拟设备。这里注意,根据使用的不同版本的Midonet使用不同版本的API。
https://github.com/barnettZQG/golang-midonetclient
我们基于Golang需要封装了midonet client,支持1.和5.API版本的常用API。
创建步骤如下:

创建租户,调用Keystone API。

创建Router,并包含创建进出Chain。

创建PrivierRouter Port并赋IP,创建Router Port并赋IP。创建PortLink连接两个Port。

为前面创建的Chain创建对应的路由规则

为前面创建的Port创建包过滤规则

创建一个默认的Bridge。并创建Port连上Router。

存储以上创建的相关数据进etcd.

容器网卡创建和网络绑定

Virtual Ethernet Pair

简称veth pair,是一个成对的端口,所有从这对端口一端进入的数据包都将从另一端出来,反之也是一样.其两端可存在于不同的网络空间(Network Namespace)。容器创建成功后具有一个网络空间,容器创建时调用CNI插件ADD方法进行网络设置。插件首先创建一对Veth pair。将其一端置于宿主机网络空间,调用Midonet 绑定API将其与Bridge一个Port绑定。另一端在容器内并由IPAM模块分配并赋予IP地址,其与Docker0网卡部分原理一致。

设置容器内路由规则

将默认路由设置到上文创建的网卡上。例如上文创建的网卡命名为eth0,默认出口路由设置到eth0网卡,如此用户应用的出口网络将默认使用Midonet网络统一管理。在Rainbond的用例中,需要外网访问的应用除了eth0网卡以外还有一块接入宿主机的网卡eth1,其映射到宿主机后由边缘负载均衡代理向外网提供服务,因此Rainbond还会设置自定义的路由规则。

设置DNS
根据需要设置一些DNS信息,例如Rainbond会设置Rainbond相关的应用DNS信息。

CNI插件实现的注意事项

CNI插件的添加和删除操作应该具有幂等性,即同样的参数传入不管调用多少次都应该有相同的效果。

CNI插件应该支持并发性,主要是租户相关组件的创建和IP地址分配的强一致性。

CNI插件有一定的规范,请参考:https://github.com/containernetworking/cni

FAQ

Rainbond是什么?是否开源?

Rainbond是国内首个开源的生产级无服务器PaaS,深度整合基于Kubernetes的容器管理、多类型CI/CD应用构建与交付、多数据中心的资源管理等技术,提供云原生应用全生命周期解决方案,构建应用与基础设施、应用之间及基础设施之间的互联互通生态体系。Rainbond目前基于L-GPL(v3)开源协议开源。
项目地址: https://github.com/goodrain/r...
官网: http://www.rainbond.com

Midonet CNI-Plugin是否开源?

Midonet CNI-Plugin作为Rainbond网络组件的一部分开源。
项目地址: https://github.com/goodrain/m...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10394.html

相关文章

  • kubernetes容器网络接口(CNI) midonet网络插件的设计与实现

    摘要:相关原理概述先来讲讲什么是容器网络接口是一种操作容器网络规范,包含方法规范,参数规范等。只关心容器的网络连接,在容器创建时分配网络资源,并在删除容器时删除分配的资源。容器创建成功后具有一个网络空间,此时调用插件方法进行网络设置。 相关原理概述 先来讲讲什么是CNI? CNI(容器网络接口)是一种操作容器网络规范,包含方法规范,参数规范等。CNI只关心容器的网络连接,在容器创建时分配网络...

    OldPanda 评论0 收藏0
  • 高可用负载均衡:开源PaaS Rainbond组件Rainbond-Entrance揭秘

    摘要:负载均衡是开源的亮点功能,主要由软件定义负载均衡控制器完成。的组件设计,使之可以集成集成多种负载均衡插件,也就是说,不仅支持常用的,还可以支持其它负载均衡插件,例如商业支持的等。 负载均衡(Load Balancing)是开源PaaS Rainbond的亮点功能,主要由软件定义负载均衡Rainbond-Entrance控制器完成。 本文将围绕设计架构和实现介绍Rainbond-Entr...

    时飞 评论0 收藏0
  • 云帮(ACP)3月升级,支持PHP7、修复若干Bug

    摘要:本月产品层面的升级主要集中在语言源码构建方面,全面支持和并兼容开发框架。研发团队在这一个月中对底层组件进行了升级与调整,修复了个中等级别以上的。因为这个焦点,有广泛的支持,规格易于实现。 全面支持一条命令安装云帮平台、调整SDN网络组件、8 个中等级别以上的bug修复、云帮社区版 迎来2017年3月升级版本,本次升级主要集中在平台底层服务,以及云帮的私有化安装部署的流程上,针对SDN网...

    lastSeries 评论0 收藏0
  • 上手kubernetes之前,你应该知道这6件事

    摘要:在上更进一步时,我们需要了解一些之前不存在的东西,比如基于角色的访问控制等等。这些功能一年前还没有,但现在正在变得越来越重要,对于在整个流程上的不同角色来说好处多多,确保正在做的事情不会影响到其他不该触及的事情。 在过去的一年多时间了里,我们深入了解了容器编排工具,引导团队构建并发布了可以部署在kubernetes上的cloud native GitLab helm chart。对于正...

    xi4oh4o 评论0 收藏0
  • 如何把应用转移到Kubernetes

    摘要:如果我们还没有完成应用容器化,那么把应用转移到上会是一件高强度的工作,本文目的则是介绍应用与集成的方法。采用一个多实例架构在我们把应用迁移到之前,需要确认向最终用户交付的方式。这需要我们反复的尝试和验证,也有一些工具可以替我们达成这一目的。 Ben Sears Kubernetes是时下最流行的管理和编排工具,它提供了一个配置驱动的框架,让我们可以通过定义和操作获得整个网络、磁盘和应用...

    NusterCache 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<