今天跟你们分享Rainbond基于Midonet的多租户网络设计和思考。git
Rainbond对多租户支持的实现基础是对多租户的网络支持,Rainbond公有云要求每一个租户之间网络必须隔离,造成相互安全的租户网络环境。对于不一样的SDN网络,实现方式各不相同,例如Calico从路由规则上隔离,Midonet能够为不一样租户建立子网等。Rainbond底层采用Kubernetes做为应用运行方案,其采用标准的CNI网络接入规范,为Rainbond支持多种网络提供了标准化支持。github
对于中小集群用户,Rainbond推荐使用基于Calico的网络方案,做为Kubernetes社区经常使用方案之一,本文再也不详细介绍。咱们今天分享重点是对于大型集群或对租户网络隔离有严格要求的用户,也就是基于Midonet的方案。golang
(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公司Midkura研发的一款网络虚拟化软件,其基于底层物理设施来实现网络虚拟化,具备分布式、分散、多层次的特色,主要做为OpenStack中的默认网络组件,可让虚拟网络解决方案,特别是专为网络基础设施设计的方案,为云平台如OpenStack服务,而且将其网络存贮栈虚拟化。MidoNet为每一个租户分配一个逻辑router,租户与租户之间是相互隔离的,租户内部之间是可以相互通信的,Midonet支持L2交换、L3路由、L4负载均衡 有状态和无状态NAT,逻辑和分布式防火墙,BGP与ECMP支持。其架构主要包含如下组件:架构
Agent安装在各个计算节点,负责创建网络流量控制和提供分布式Midonet网络服务,路由,NAT等他把相关的虚拟网络信息存放到NSDB。并发
Database(NSDB):存储网络配置和状态,网络拓扑,路由,Midonet不集中处理网络功能,由Midonet Agent处理,Midonet Agent会跟NSDBs作实时同步当有变化时候会及时同步而且更新NSDB负载均衡
midonet提供restful API接口提供全套的模型操做,这对于咱们为其作CNI-plugin奠基基础。
MidoNet支持大规模SDN集群,其架构理论上支持上万节点。Rainbond基于Midonet网络可支持上万节点集群,其最初设计用于OpenStack虚拟机网络,咱们将其与容器适配,使其成为标准的容器网络解决方案。
SDN(软件定义网络),midonet软件定义你所熟知的网络组件。如下简单介绍几个核心的软件定义概念:
192.168.0.0/24
,最多能够有253个虚拟设备链接到本Bridge。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。 建立步骤以下:
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信息。
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