当前位置: 首页 > Linux

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

时间:2023-04-06 04:27:06 Linux

今天给大家分享Rainbond基于Midonet的多租户网络设计与思考。Rainbond支持多租户的基础是网络对多租户的支持。Rainbond公有云要求每个租户的网络必须相互隔离,形成相互安全的租户网络环境。对于不同的SDN网络,实现方法是不同的。例如,Calico与路由规则隔离,Midonet可以为不同的租户创建子网。Rainbond底层采用Kubernetes作为应用运行方案,采用标准的CNI网络接入规范,为Rainbond提供标准化支持,支持多网络。对于中小型集群用户,Rainbond推荐使用基于Calico的网络方案。作为Kubernetes社区常用的解决方案之一,本文不做详细介绍。我们今天分享的重点是针对拥有大型集群的用户或者对租户网络隔离有严格要求的用户,即基于Midonet的方案。什么是CNI规范(CNI)[https://github.com/containern...](ContainerNetworkingInterface)是为Linux上运行的容器提出的一种通用的基于插件的网络解决方案,最初来源于TheRkt容器网络设计目前有Kubernetes等项目标准支持。其最新已到0.3.0版本,目前Rainbond支持0.2.0版本。它面向两个抽象实体:容器可以被认为是Linux网络命名空间的同义词。相应的单元取决于特定的容器运行时实现:例如,在Rkt等应用程序容器规范的实现中,每个容器都运行在唯一的网络命名空间中。另一方面,在Docker中,每个单独的Docker容器通常都有一个网络名称空间。网络是指一组可唯一寻址并且可以相互通信的实体。这可以是单个容器(如上所述)、机器或其他网络设备(例如路由器)。从概念上讲,容器可以添加到一个或多个网络或从中删除。Rainbond中每个应用运行实例都使用一个网络空间,运行实例的创建和销毁会分别建立和回收网络资源。因此,网络资源是一种动态的、可重用的资源。MidoNetSDN网络MidoNet是日本SDN公司Midkura开发的一款网络虚拟化软件。它基于底层物理设施实现网络虚拟化。它是分布式的、去中心化的和多层次的。它主要用作OpenStack中的默认网络组件,允许虚拟网络解决方案,特别是那些为网络基础设施设计的解决方案,为OpenStack等云平台服务,并虚拟化他们的网络存储堆栈。MidoNet为每个租户分配一个逻辑路由器。租户相互隔离,租户之间可以相互通信。Midonet支持L2交换、L3路由、L4负载平衡有状态和无状态NAT、逻辑和分布式防火墙、BGP和ECMP支持。其架构主要包括以下组件:Midolman(MidonetAgent):MidonetAgent安装在各个计算节点上,负责建立网络流量控制,提供分布式Midonet网络服务、路由、NAT等,将相关的虚拟网络信息存储在NSDB中。NetworkStateDatabase(NSDB):存储网络配置和状态、网络拓扑、路由,Midonet不集中处理网络功能,由MidonetAgent处理,MidonetAgent会与NSDBs实时同步,有时及时更新NSDB变化。MidonetAPImidonet提供了一个restfulAPI接口,提供了全套的模型操作,这为我们为它制作CNI-plugin奠定了基础。MidoNet支持大规模SDN集群,其架构理论上支持数万个节点。Rainbond基于Midonet网络,可支持数万节点集群。它最初是为OpenStack虚拟机网络设计的。我们将其适配到容器中,使其成为标准的容器网络解决方案。MidoNet多租户网络结构模型SDN(software-definednetwork),midonet软件定义了你熟悉的网络组件。下面简单介绍几个软件定义的核心概念:Router(路由器)一个租户对应一个Router,连接在同一个Router上的Bridge网络进行通信。Midonet会创建一个PrivierRouter,所有租户的Router都连接到PrivierRouter上与外部网络进行通信。可以理解为路由器与内网通信,连接上层路由器访问公网。Bridge(网桥)一个租户下可以有多个Bridge,每个Bridge使用不同的网段。例如,一个Bridge的网段是192.168.0.0/24,那么这个Bridge最多可以连接253个虚拟设备。端口(设备通信端口)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作为我们的数据存储服务,它的全局一致性保证了我们端口分配的正确性。租户路由器创建一个新租户。第一个实例启动阶段会在Midonet中为当前租户创建一个虚拟租户子网。并直接连接到PrivierRouter和外围设备。TenantBridgeCreation一个租户可以有一个或多个Bridge,根据实例的数量,每个bridge有不同的虚拟网段,最多支持253个运行的实例。容器网卡创建为目标容器创建网卡接口是CNI插件的必备功能。可以根据需要创建多个或一个。这里需要网卡才能访问MidonetBridge。端到端的连接建立每个Bridge需要和租户Router建立连接,每个运行的实例需要和对应的Bridge建立连接。路由和过滤规则PrivierRouter到租户Router需要路由规则,租户Router到Bridge需要路由规则和过滤规则。租户网络初始化当新租户第一次创建容器时,会初始化并创建租户虚拟设备。我们已经介绍了租户需要创建的虚拟设备。下面我就详细说一下。Midonet提供Rest-API来操作虚拟设备。这里注意,根据使用的Midonet版本不同,使用不同版本的API。https://github.com/barnettZQG/golang-midonetclient我们需要封装基于Golang的midonet客户端,支持1.和5.API版本的通用API。创建步骤如下:创建租户,调用KeystoneAPI。创建一个Router,包括创建一个in-outChain。创建PrivierRouterPort并分配IP,创建RouterPort并分配IP。创建一个PortLink来连接两个端口。为之前创建的Chain创建对应的路由规则为之前创建的Port创建包过滤规则创建默认Bridge。并创建一个连接到路由器的端口。将上面创建的相关数据存储到etcd中。容器网卡创建和网络绑定VirtualEthernetPair简称vethpair是一对配对的端口,所有从这一对端口的一端进入的数据包都会从另一端出来,反之亦然。它的两端可以存在于不同的网络空间(NetworkNamespace)中。容器创建成功后,就有了网络空间。创建容器时调用CNI插件的ADD方法配置网络。该插件首先创建一个Veth对。将其一端放置在宿主机的网络空间中,调用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/cniFAQ什么是Rainbond?它是开源的吗?Rainbond是国内第一个开源的生产级ServerlessPaaS。深度融合基于Kubernetes的容器管理、多类型CI/CD应用构建与交付、多数据中心资源管理等技术,提供云原生应用全生命周期解决方案。构建应用与基础设施之间、应用与基础设施之间、基础设施之间互联互通的生态系统。Rainbond目前是基于L-GPL(v3)开源协议开源的。项目地址:https://github.com/goodrain/r...官网:http://www.rainbond.comMidonetCNI-Plugin是否开源?MidonetCNI-Plugin作为Rainbond网络组件的一部分是开源的。项目地址:https://github.com/goodrain/m...