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

2019-04-19 17:40:07 浏览数 (1)

今天跟大家分享Rainbond基于Midonet的多租户网络设计和思考。Rainbond对于多租户的支持一个最大的构成是多租户网络支持,Rainbond公有云要求每个租户之间网络必须隔离,形成相互安全的租户网络环境。对于不同的SDN网络,实现方式各不相同,例如Calico从路由规则上隔离,Midonet可以为不同租户创建子网等。Rainbond底层产用Kubernetes作为应用运行方案,其采用标准的CNI网络接入规范,这一点对于我们为Rainbond支持多种网络提供了标准化支持。对于中小集群用户,Rainbond推荐使用基于Calico的网络方案,作为Kubernetes社区常用方案之一,本文不再详细介绍。对于大型集群或对租户网络隔离有严格要求的用户,我们使用基于Midonet的方案,这就是我们今天分享的重点。

什么是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容器通常都存在网络名称空间。

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

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。 创建步骤如下:

  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插件有一定的规范,请参考:https://github.com/containernetworking/cni

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

0 人点赞