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

今天跟大家分享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。
    Rainbond设计分享系列(1)基于Midonet的多租户网络设计_第1张图片
    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。
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

你可能感兴趣的:(Rainbond设计分享系列(1)基于Midonet的多租户网络设计)