1.Linux网络虚拟化基础
物理网络与虚拟化网络
Neutron最为核心的工作是对二层物理网络的抽象与管理,物理服务器虚拟化后,虚拟机的网络功能由虚拟网卡(vNIC)提供,物理交换机(Switch)也被虚拟化为虚拟交换机(vSwitch),各个vNIC连接在vSwitch的端口上,最后这些vSwitch通过物理服务器的物理网卡访问外部的物理网络。
Neutron为整个 Openstack环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和VPN等。 Neutron提供了一个灵活的框架,通过配置,无论是开源还是商业软件都可以被用来实现这些功能
1.1-Linux网络虚拟化实现技术
①网卡虚拟化
- TAP
- TUN
- VETH
②交换机虚拟化
- Linux Bridge
- Open vSwitch
③网络隔离
- Network
- Namespac
1.2-Linux网卡虚拟化-TAP/TUN/VETH
- TAP设备:模拟一个二层的网络设备,可以接收和发送二层网包
- TUN设备:模拟一个三层的网络设备,可以接收和发送三层网包
- VETH:虚拟Ethernet接口,通常以api的方式出现,一端发出的网包,会被另一端接收,可以形成两个网桥之间的通道。
- TAP/TUN提供了一台主机内用户空间的数据传输机制,它虚拟了一套网络接口,这套接口和物理的接口无任何区别,可以配置 IP,可以路由流量,不同的是,它的流量只在主机内流通。
- TAP/TUN 有些许的不同,TUN 只操作三层的 IP 包,而 TAP 操作二层的以太网帧。
- Veth-Pair 是成对出现的一种虚拟网络设备,一端连接着协议栈,一端连接着彼此,数据从一端出,从另一端进。它的这个特性常常用来连接不同的虚拟网络组件,构建大规模的虚拟网络拓扑,比如连接 Linux Bridge、OVS、LXC 容器等。一个很常见的案例就是它被用于 OpenStack Neutron,构建非常复杂的网络形态。
1.3-交换机虚拟化——Linux bridge
- Linux bridge:工作于二层的网络设备,功能类似于物理交换机
- Bridge可以帮绑定Linux上的其他网络设备,并将这些设备虚拟化为端口。
- 当一个设备被绑定到bridge时,就相当于物理交换机端口插入了一条连接着终端的网线。
- 使用brctl命令配置Linux bridge:
- Brctl addbr BRIDGE
- Brctl addif BRIDGE DEVICE
1.4-Linux交换机虚拟化-Open vSwitch
- Open vswitch是产品级的虚拟交换机
- Linux bridge更适用于小规模,主机内部间通信场景。
- Open vswitch更适合于大规模,多主机通信场景。
1.5-Linux网络隔离-network namespace
- Network namespace能创建多个隔离的网络空间,他们有独自的网络配置信息,例如网络设备、路由表、iptables等。
- 不同网络空间中的虚拟机运行的时候仿佛自己就在独立的网络中。
- Network Namespace通常与VRF(Virtual Routing Forwarding虚拟路由和转发)一起工作,VRF是一种IP技术,允许路由表的多个实例同时在同一路由器上共存。
- 使用VETH可以连接两个不同网络命名空间,使用Bridge可以连接多个不同网络命名空间。
2.Neutron概念
- neutron负责管理虚拟网络组件,专注于为OpenStack提供网络即服务(NaaS);为OpenStack计算提供网络连通和寻址服务。
2.1neutron功能
1. 二层交换
Neutron支持多种虚拟交换机,一般使用Linux Bridge和Open vSwitch创建传统的VLAN网络,以及基于隧道技术的Overlay网络,如VxLAN和GRE(Linux Bridge 目前只支持 VxLAN)。
2. 三层路由
Neutron从Juno版开始正式加入的DVR(Distributed Virtual Router)服务,它将原本集中在网络节点的部分服务分散到了计算节点上。可以通过namespace中使用ip route或者iptables实现路由或NAT,也可以通过openflow给OpenvSwitch下发流表来实现。
3. 负载均衡
LBaaS 支持多种负载均衡产品和方案,不同的实现以 Plugin 的形式集成到 Neutron,通过HAProxy来实现。
4. 防火墙
Neutron有两种方式来保障instance和网络的安全性,分别是安全组以及防火墙功能,均可以通过iptables来实现,前者是限制进出instance的网络包,后者是进出虚拟路由器的网络包。
- 为了便于操作管理,neutron对网络进行了抽象,有如下基本管理对象:
- Network
- Subnet
- Port
- Router
- Floating IP
1.network
- 网络;一个隔离的、虚拟二层广播域,可以看成一个虚拟交换机或者逻辑交换机。neutron支持多种类型的network,包括local、flat、VLAN、VXLAN和GRE
- Local:与其他网络和节点隔离。Local 网络中的虚拟机只能与位于同一节点上同一网络的 虚拟机通信,Local 网络主要用于单机测试。 本地网络,只能在同一台compute主机上的VM通信
- Flat:无VLAN tagging的网络。Flat网络中虚拟机能与位于同一网络的虚拟机通信,并可 以跨多个节点。VM可以在多台compute主机间通讯,不同子网可以通过路由
- VLAN:802.1q tagging网络。VLAN是一个二层的广播域,同一VLAN中的 虚拟机可以通 信,不同VLAN只能通过Router通信。 VLAN网络可跨节点,是应用最广泛的网络类型。
- VXLAN:基于隧道技术的overlay网络。 VXLAN网络通过唯一的segmentation ID(也叫 VNI)与其他 VXLAN网络区分。 VXLAN中数据包会通过VNI封装成UDP包进行传输。因 为二层的包通过封装在三层传输,能够克服 VLAN 和物理网络基础设施的限制。
- GRE:与VXLAN类似的一种overlay网络,主要区别在于使用IP包而非UDP进行封装。
- 生产环境中,一般使用的是VLAN、VXLAN或GRE网络。
2.subnet
子网;一个IPV4或者IPV6地址段。虚拟机的IP从subnet中分配。每个subnet需要定义IP地址的范围和掩码。subnet必须与network关联,subnet可选属性:DNS,网关IP,静态路由
3.port
端口;逻辑网络交换机上的虚拟交换端口,虚拟机通过port附着到network上,当instance上的虚拟网卡VIF(virtual interface)绑定到port时,port可以分配IP地址和Mac地址。
4.router
路由器;连接租户内同一network或不同network之间的子网,以及连接内外网。
5.fixed IP
固定IP;分配到每个端口上的IP,类似于物理环境中配置到网卡上的IP。
6.floating IP
浮动IP;floating IP是从external network创建的一种特殊port,可以将floating IP绑定到任意network中的port上,底层会做NAT转发,将发送给floating IP的流量转发到该port对应的fixed IP上。外界可以通过floating IP访问虚拟机,虚拟机也可以通过floating IP访问外界。
7.physical network
物理网络;在物理网络环境中连接openstack不同节点的网络,每个物理网络可以支持neutron中的一个或多个虚拟网络。
openstack必须通过physical network才能和真实物理网络通信。
8.provider network
由openstack管理员创建的,直接对应于数据中心现有物理网络的一个网段。Provider network通常使用VLAN或者Flat模式,可以在多个租户之间共享。
9.self- service network
自助网络服务\租户网络\项目网络;由openstack租户创建的,完全虚拟的,只在本网络内部连通,不能再租户之间共享。
- 通常使用VXLAN或者GRE模式,可以通过virtual router的SNAT与provider network通信。
- 不同Self-service Network中的网段可以相同,类似于物理环境中不同公司的内部网络。 Self-service Network如果需要和外部物理网络通信,需要通过Router,类似于物理环境中公司上网需要通过路由器或防火墙。
10.external network
外部网络\公共网络;一种特殊的provider network,连接的物理网络与数据中心或internal相通,网络中的port可以访问外网。
- 一般将租户的virtual router连接到该网络,并创建floating IP绑定该虚拟机,实现虚拟机与外网通信。
- External Network类似于物理环境中直接使用公网IP网段,不同的是,OpenStack中External Network对应的物理网络不一 定能直连Internet,有可能只是数据中心的一个内部私有网络。
11.security group
安全组;安全组是作用在neutron port上的一组策略,规定了虚拟机入口和出口流量的规则;安全组基于Linux IPtables(包过滤防火墙)实现。安全组默认拒绝所有流量,只有添加了放行规则的流量才能通过。每个openstack项目中都有一个default默认安全组,默认包含如下规则:拒绝所有入口流量,允许所有出口流量。安全组由L2 agent实现,如neutron-openvswitch-agent会将安全组规则转换成IPTables规则,一般发生在计算节点;
3.neutron架构图
- Neutron Server
对外提供 Openstack网络APl,接收请求,并调用 Plugin处理请求。
- Plugin
处理 Neutron Server发来的请求,维护 Openstack逻辑网络的状态,并调用 Agent处理请求。
- Agent
处理 Plugin的请求,负责在 network provider上真正实现各种网络功能。
- Network provider
提供网络服务的虚拟或物理网络设备,例如 Linux Bridge, Open vswitch或者其他支持Neutron的物理交换机。
- Queue
Neutron Server、 Plugin和 Agent之间通过 Messaging Queue通信和调用。
- Database
Database 用来存放 Openstack的网络状态信息,包括 Network、 Subnet、Port、 Router等。
Neutron 架构原则
统一API
核心部分最小化
可插入式的开放架构
可扩展
Message Queue
Neutron-server使用Message Queue与其他Neutron agents进行交换消息,但是这个 Message Queue不会用于Neutron-server与其他OpenStack组件(如nova )进行交换 消息。
L2 Agent
负责连接端口(ports)和设备,使他们处于共享的广播域(broadcast domain)。通常运 行在Hypervisor上。利用OVS、Linux的Bridge或者其他厂商的技术给每个project提供独立的网络服务。
L3 Agent (L3 Agent安装在哪里,哪里就是网络节点)
负责连接tenant网络到数据中心,或连接到Internet。在真实的部署环境中,一般都需要 多个L3 Agent同时运行。
DHCP agent
用于自动配置虚拟机网络。
Advanced Service
提供LB、Firewall和VPN等服务
- 通常,neutron-server部署在控制节点上,每个计算节点上都需要部署L2 Agent,L3 Agent一般运行在网络节点上,DHCP agent一般也部署在网络节点上;控制节点和网络节点是可以合并的, Neutron-server安装在哪里,哪里就是控制节点,L3 Agent安装在哪里,哪里就是网络节点,计算节点上一般只部署 L2 Agent
4.neutron架构说明
neutron的架构是基于插件的,不同的插件提供不同的网络服务,主要包含以下网络组件:
- Neutron server
对外提供网络API,并调用Plugi处理请求
Core api:基础组件组成,对外提供管理网络、子网和端口的RESTful API;service api:高级组件组成,对外提供管理路由、防火墙、VPN等资源的RESTful API.
- Plugin
处理neutron server的请求,维护网络状态,并调用Agent处理请求
- Agent
处理Plugin的请求,调用底层虚拟或物理网络设备实现各种网络功能
plugin、agent和network provider是配套使用的,如果network provider是Linux bridge,那么就得使用Linux bridge的plugin和agent,如果network provider换成了OVS或物理交换机,plugin和agent也得换
5.neutron组件
5.1-neutron server
Neutron server=APIs+Plugins,通过这种方式,可以自由对接不同网络后端能力。
- API定义各类网络服务
- Plugin实现各类网络服务
5.2-core Plugin
主要指ML2 plugin(Modular Layer 2),是一个开放性框架,在一个plugin下,可以集成各个厂家、各种后端技术支持的Layer 2网络服务。
- 通过Type Driver和Mechanism Driver调用不同的底层网络技术,实现二层互通
- ML2 Plugin的Drivers主要分为以下两种:
Type Driver:定义了网络类型,每种网络类型对应一个Type Driver。
Mechanism Driver:对接各种二层网络技术和物理交换设备,如OVS,Linux Bridge等。Mechanism Driver从Type Driver获取相关的底层网络信息,确保对应 的底层技术能够根据这些信息正确配置二层网络。
ML2 不但支持异构部署方案,同时能够与现有的Agent无缝集成:以前用的Agent不需要变,只需要将Neutron Server上的传统Core Plugin替换为ML2。有了ML2,要支持新的Network Provider就变得简单多了:无需从头开发Core Plugin,只需要开发相应的Mechanism Driver,大大减少了要编写和维护的代码。
5.3-service plugin
用于实现高阶网络服务,例如路由、负载均衡、防火墙和VPN服务等。L3 Service Plugin主要提供路由,浮动IP服务等。
5.4-Agent
向虚拟机提供二层和三层的网络连接、完成虚拟网络和物理网络之间的转换、提供扩展服务等
一套OpenStack中,只能使用一种交换模式。ML2 Plugin可以兼容底层两种交换模式,比如用一个ML2 Plugin统一管理一个Linux bridge,一个OVS
拓扑
一般compute节点有两个网卡,一个管理口,一个业务口,network节点有三个网卡,一个管理口,一个内部通讯网络(做路由的),一个与外部网络连接的网卡;
br-int用来提供内部网络通信;br-ex提供内外网互通;br-tun是隧道网络,只用于VXLAN(跨数据中心的的大二层技术【将二层网络封装在三层中进行传输】) GRE网络
不同租户的网络可以重叠吗?可以
同一个物理交换机是如何隔离不同租户的?namespace命名空间,一个租户一个namespace
veth是成对出现的(相当于一条网线连两台电脑),tap设备只有一个(相当于一张网卡)
flat网络
VM1和VM2通信,走它内部br-int的桥就通了;VM1访问VM3,通过br-eth1(虚拟交换机)连接物理网络就能通
小结:
neutron架构:
Neutron server接收api请求
Plugin/agent实现请求
database保存neutron网络状态
Message queue实现组件之间通信
instance在启动之前需要访问nova-metadata-api服务获取metadata和userdata,这些data是该instance的定制化信息,比如hostname、ip、public key等。但instance启动时并没有ip,如何能够通过网络访问到nova- metadata-api服务呢?答案就是 neutron- metadata- agent。该 agent让 Instance能够通过dhcp- agent或者
L3- agent与nova- metadata-api通信。
L3基础概念
L3即vrouter,主要功能是连接租户内同一network或不同network之间的子网,以及连接内外网(FIP/SNAT)。前者是数据中心内部虚机之前的通信,成为东西向流量。后者是虚机与外部通信,称为南北向流量。
vrouter分为两种模式:集中式,分布式。集中式指的是vrouter实例化在network节点,compute节点不实例化vrouter,当两个不同子网的vm通信时,流量需要在network节点上的vrouter做一次三层转发,走两次隧道。分布式指的是vruoter实例化在所有compute节点,三层转发的功能在本节点的vrouter实例中完成。从而只需要走一次隧道。
集中式路由
1.之和网络节点有关系,router所在节点即为网络节点,只有在网络节点上部署L3-agent,实现3层通信的功能。
2.所有3层流量必须经过网络节点
分布式路由
浮动IP
NAT:将私有地址和公有地址进行一个转换,可以解决IP地址不足的问题,还能避免来自外网的攻击,隐藏和保护内部虚拟机。
浮动IP:利用NAT原理给虚拟机配置一个外网IP,虚拟机访问外网时将原地址转换成该外网IP,外网访问该外网IP时转换成虚拟机IP实现通信