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

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

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

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

什么是CNI规范

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

容器 能够被认为是Linux网络命名空间的同义词。与之相对应的单元取决于特定的容器运行时实现:例如,在应用容器规范(如Rkt)的实现中,每一个容器运行在惟一的网络名称空间中。另外一方面,在Docker中,每一个单独的Docker容器一般都存在网络名称空间。服务器

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

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。
    image

基于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。 github.com/barnettZQG/…
咱们基于Golang须要封装了midonet client,支持1.*和5.*API版本的经常使用API。 建立步骤以下:

  1. 建立租户,调用Keystone API。
  2. 建立Router,并包含建立进出Chain。
  3. 建立PrivierRouter Port并赋IP,建立Router Port并赋IP。建立PortLink链接两个Port。
  4. 为前面建立的Chain建立对应的路由规则
  5. 为前面建立的Port建立包过滤规则
  6. 建立一个默认的Bridge。并建立Port连上Router。
  7. 存储以上建立的相关数据进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插件实现的注意事项

  1. CNI插件的添加和删除操做应该具备幂等性,即一样的参数传入无论调用多少次都应该有相同的效果。
  2. CNI插件应该支持并发性,主要是租户相关组件的建立和IP地址分配的强一致性。
  3. CNI插件有必定的规范,请参考:github.com/containerne…

FAQ

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

  • Midonet CNI-Plugin是否开源? Midonet CNI-Plugin做为Rainbond网络组件的一部分开源。 项目地址: https://github.com/goodrain/midonet-cni

相关文章
相关标签/搜索