网络虚拟化 SDN
一.Linux Bridge :Linux中的网桥
假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是: 如何让 VM1 能够访问外网?
至少有两种方案
将物理网卡eth0直接分配给VM1,但随之带来的问题很多: 宿主机就没有网卡,无法访问了; 新的虚机,比如 VM2 也没有网卡。 下面看推荐的方案
给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge br0 将 eth0 和 vnet0 连接起来,如下图所示
Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能可以理解为一个二层交换机。多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。
在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据;
反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。
现在我们增加一个虚机 VM2,如下图所示
VM2 的虚拟网卡 vnet1 也连接到了 br0 上。
现在 VM1 和 VM2 之间可以通信,同时 VM1 和 VM2 也都可以与外网通信。
网桥实际上相当于一个物理路由器(交换机)。
brctl show 查看网桥信息,br100就是我们在这里搭建的网桥,后面挂接的虚拟机网卡和物理机网卡
virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。(NAT)
需要说明的是,使用 NAT 的虚机 VM1 可以访问外网,但外网无法直接访问 VM1。 因为 VM1 发出的网络包源地址并不是 192.168.122.6,而是被 NAT 替换为宿主机的 IP 地址了。
每张网卡都有唯一的MAC地址。
二.VLAN
首先搞清楚这几个概念:
LAN:Local Area Network 局域网
我们一般在公司组网,都是组建的LAN网络,用户在局域网里通信、传输文件。其获取到的是内部IP,LAN 信息交换使用的是交换机。我们可以
不连接WAN 口,把路由器当做普通交换机来使用。一个 LAN 表示一个广播域:LAN 中的所有成员都会收到任意一个成员发出的广播包。
WAN:Wide Area Network 广域网。WAN口是对外的接口,和运营商、上级网络打交道。
WLAN:Wireless LAN 无线局域网。WLAN 利用电磁波在空气中发送和接受数据,而无需线缆介质。
LAN和WLAN是对内的接口,内部的电脑、手机、PAD,都是接入到LAN或者WLAN。
一般的无线路由器,包含了完整的LAN、WAN、WLAN功能对LAN、WAN、WLAN,要放在一起理解,理解其在网络通信中扮演的角色。
那什么是VLAN呢?
VLAN 表示 Virtual LAN。一个带有 VLAN 功能的物理交换机能够将自己的端口划分出多个 LAN。计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。现在的交换机几乎都是支持 VLAN 的。通常交换机的端口有两种配置模式: Access 和 Trunk。
看下图,实际上是两台交换机,上面是一台,下面是一台。
Access 口:这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。
Trunk 口:有两个交换机 A 和 B。 如何让 AB 上相同 VLAN 之间能够通信呢?办法是将 A 和 B 连起来。这样的端口就是Trunk口了。 VLAN1、2、3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。
物理交换机有VLAN的功能,那么Linux Bridge中又是如何实现VLAN的呢?
该图实际上就是在物理服务器中实现了一个虚拟交换机,该交换机具有VLAN的功能 。凡是连接在brvlan10(网桥)上的虚拟机,共同组建成一个局域网,id为10;凡是连接在brvlan20上的虚拟机,共同组建成一个局域网,id为20。eth0相当于是Trunk口,与外界交换信息。这样,
VM1发出的数据包,会打上tag为10的标签,并且只会在id为10的局域网中产生广播风暴,而不会转发到id为20的局域网中,它们之间是相互隔离开来的。如果现在有多台物理服务器,那么它们之间就通过trunk口相连接,里面的虚拟机,就可以在id相同的局域网中通信了。
Linux Bridge + VLAN = 虚拟交换机
三.Neutron
“软件定义网络(software-defined networking, SDN)”是当今云时代网络管理的主流。Neutron 的设计目标是实现“网络即服务(Networking as a Service)”。Neutron 为 OpenStack 的整个环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和 VPN 等,Neutron 提供了一个灵活的框架。Neutron有如下几个重要功能:
1.二层交换(Switching):Nova 的 Instance 是通过虚拟交换机构建局域网的。Neutron 支持多种虚拟交换机,包括 Linux 原生的 Linux Bridge 和 OpenvSwitch。 OpenvSwitch(OVS)是一个开源的虚拟交换机,利用 Linux Bridge 和 OVS,Neutron 除了可以创建传统的 VLAN 网络,还可以创建基于隧道技术的 Overlay 网络,比如 VxLAN 和 GRE。
2.三层路由(routing):Instance 可以配置不同网段的 IP,即不同网段的虚拟机实现互相通信。Neutron 的 router(虚拟路由器)实现 instance 跨网段通信。router 通过 IP forwarding,iptables 等技术来实现路由和 NAT。
3.负载均衡:Load-Balancing-as-a-Service(LBaaS),提供了将负载分发到多个 instance 的能力。LBaaS 支持多种负载均衡产品和方案,不同的实现以 Plugin 的形式集成到 Neutron,目前默认的 Plugin 是 HAProxy。
4.要保证物理服务器的安全性,可以配一台防火墙。那么如何保证虚拟机的安全呢?
Neutron 通过下面两种方式来保障 instance 和网络的安全性。
Security Group 安全组:通过 iptables 限制进出 instance 的网络包。
Firewall-as-a-Service:FWaaS,限制进出虚拟路由器的网络包,也是通过 iptables 实现。
Neutron 管理的网络资源包括 Network,subnet 和 port
一个网络可以包含多个子网,一个子网会存在多个端口。port 可以看做虚拟交换机上的一个端口。port 上定义了 MAC 地址和 IP 地址,当 instance 的虚拟网卡 VIF(Virtual Interface) 绑定到 port 时,port 会将 MAC 和 IP 分配给该虚拟网卡。
network 是一个隔离的二层广播域。Neutron 支持多种类型的 network,包括 local, flat, VLAN, VxLAN 和 GRE。
flat:flat 网络是无 vlan tagging 的网络。flat 网络中的 instance 能与位于同一网络的 instance 通信,并且可以跨多个节点。
vlan:vlan 网络是具有 802.1q tagging 的网络。vlan 是一个二层的广播域,同一 vlan 中的 instance 可以通信,不同 vlan 只能通过 router 通信。
subnet 是一个 IPv4 或者 IPv6 地址段。instance 的 IP 从 subnet 中分配。每个 subnet 需要定义 IP 地址的范围和掩码
Neutron的架构:
与 OpenStack 的其他服务的设计思路一样,Neutron 也是采用分布式架构,由多个组件(子服务)共同对外提供网络服务。
Neutron 由如下组件构成:
Neutron Server:对外提供 OpenStack 网络 API,接收请求,并调用 Plugin 处理请求。
Plugin:处理 Neutron Server 发来的请求, 并调用 Agent 去处理请求。plugin 解决的是 What 的问题,即网络要配置成什么样子?而至于如何配置 How 的工作则交由 agent 完成。
Agent:真正的处理 Plugin 的请求,负责在 network provider 上真正实现各种网络功能。
network provider:提供网络服务的虚拟或物理网络设备,例如 Linux Bridge,Open vSwitch
Queue:Neutron Server,Plugin 和 Agent 之间通过 Messaging Queue 通信和调用(解耦)
Database:存放 OpenStack 的网络状态信息,包括 Network, Subnet, Port, Router 等。
以创建一个 VLAN100 的 network 为例,假设 network provider 是 linux bridge, 流程如下:
Neutron Server 接收到创建 network 的请求,通过 Message Queue(RabbitMQ)通知已注册的 Linux Bridge Plugin。
Plugin 将要创建的 network 的信息(例如名称、VLAN ID等)保存到数据库中,并通过 Message Queue 通知运行在各节点上的 Agent。
Agent 收到消息后会在物理节点的网卡(比如 eth0)上创建 VLAN 设备(比如 eth2.100),并创建 bridge (比如 brqXXX) 桥接 VLAN 设备。
plugin,agent 和 network provider 是配套使用的,比如上例中 network provider 是 linux bridge,那么就得使用 linux bridge 的 plugin 和 agent;如果 network provider 换成了 OVS ,plugin 和 agent 也得替换。
plugin 的一个主要的职责是在数据库中维护 Neutron 网络的状态信息,这就造成一个问题:所有 network provider 的 plugin 都要编写一套非常类似的数据库访问代码。为了解决这个问题,Neutron 实现了一个 ML2(Modular Layer 2)plugin,对 plugin 的功能进行抽象和封装。有了 ML2 plugin,各种 network provider 无需开发自己的 plugin,只需要针对 ML2 开发相应的 driver 就可以了,工作量和难度都大大减少。
plugin 按照功能分为两类: core plugin 和 service plugin。core plugin 维护 Neutron 的 netowrk, subnet 和 port 相关资源的信息,与 core plugin 对应的 agent 包括 linux bridge, OVS 等; service plugin 提供 routing, firewall, load balance 等服务。
Management 网络:用于节点之间 message queue 内部通信以及访问 database 服务,所有的节点都需要连接到 management 网络。API 网络:OpenStack 各组件通过该网络向用户暴露 API 服务。Keystone, Nova, Neutron, Glance, Cinder, Horizon 的 endpoints 均配置在 API 网络上。
VM 网络:VM 网络也叫 tenant 网络(租户网络),用于 instance 之间通信。VM 网络可以选择的类型包括 local, flat, vlan, vxlan 和 gre。VM 网络由 Neutron 配置和管理。
External 网络:External 网络指的是 VM 网络之外的网络,该网络不由 Neutron 管理。 Neutron 可以将 router attach 到 External 网络,为 instance 提供访问外部网络的能力。
网络拓扑
网络虚拟化 SDN的更多相关文章
- 网络虚拟化(SDN,NFV..)和企业骨干网的演化
本来昨天就规划了今天的这篇文章,无奈昨天中午自己喝了将近一瓶的52度二锅头...晚上想着今天怎么着也完了,要颓废难受一天了...没想到早上居然一点都不难受了.于是就写下了本文.正文之前,还是做个广告, ...
- SDN跟网络虚拟化的完美结合
SDN跟网络虚拟化的完美结合 之前说过,所谓的“SDN最适合的领域是数据中心”的说法,笔者认为更准确的说法应该是SDN最适合的领域是数据中心中的网络虚拟化应用.为什么说SDN 非常适合用在网络虚拟化中 ...
- 《重构网络:SDN架构与实现》Chapter7 SDN与网络虚拟化 随笔
参考: <重构网络:SDN架构与实现>,作者:杨泽卫.李呈. Chapter7 SDN与网络虚拟化 结构 7.1 网络虚拟化 7.1.1 为什么需要网络虚拟化技术 7.1.2 网络虚拟化 ...
- SDN网络虚拟化、资源映射等相关论文粗读
1. Control Plane Latency with SDN Network Hypervisors: The Cost of Virtualization 年份:2016 来源:IEEE NE ...
- 基于SDN的IP RAN网络虚拟化技术
http://www.zte.com.cn/cndata/magazine/zte_technologies/2014/2014_4/magazine/201404/t20140421_422858. ...
- 从SDN鼻祖Nicira到VMware NSX 网络虚拟化平台的简单探讨
以前的大二层技术,一般是在物理网络底层使用IS-IS路由技术,再在此基础之上,实现数据中心网络的二层扩展,如公有的Trill.SPB技术和Cisco私有的OTV.Fabricpath技术:前沿一些的网 ...
- 深入浅出Hyper-V网络虚拟化技术
年后综合症刚刚消失殆尽,转眼就要迎接各种新的工作任务了:之前写过一篇有关hyper-v网络虚拟化内容的博文,主要是从操作系统层面入手,概要性的总结了一下,基本也都是参考了大部分官方内容再加以个人修饰: ...
- 【Networking】容器网络大观 && SDN 资料汇总
SDNLAB技术分享(十五):容器网络大观 SDNLAB君• 16-06-17 •2957 人围观 编者按:本文系SDNLAB技术分享系列,本次分享来自SDN撕X群(群主:大猫猫)群直播,我们希望 ...
- 一:Neutron实现网络虚拟化
一 云计算时代数据中心物理网络的问题 数据中心虚拟化成为了趋势,最典型的场景莫过于:对数据中心的服务器进行虚拟化,来提高资源利用率,同时降低单位能耗. 但是,随着数据中心虚拟化程度的不断提高.虚拟化服 ...
随机推荐
- AWS系列-复制AMI到其他区域
复制AMI镜像到其他区域 1.1 打开EC2控制面板,找到AMI 选择需要迁移的AMI 1.2 选择复制的目标区域 选择复制到目标区域 我这里是 东京复制到新加坡 1.3 点击完成后,切换到相应的区域 ...
- MyEclipse10.6 安装SVN插件方法及插件下载地址
今天MyEclipse10.6出了点问题,所以重装了它,同一时候也把svn的插件重装了一次,把网上资源和自己的经历顺便在博客这里记录一下.建议直接看方法一好了,简单方便,不必要折腾太多. 下来 ...
- jqGrid排序的两种实现方式
实现方案一客户端实现排序: jqGrid属性 loadonce:true时,所有数据加载在客户端,点击列标题由jqGrid在客户端自动排序,不再从服务器取值. 参考文件:ccMxCxTjCc.js j ...
- LAMP集群项目二 初始化系统
1.关闭防火墙 /etc/init.d/iptables stop chkconfig iptables off 2.关闭selinux cat /etc/selinux/config #查看状态 s ...
- highcharts配置的效果如下
配置如下: function init(categoryArray,seriesData,month_first_day,month_last_day,currDay){ var chart = Hi ...
- Python--Get and Post
#python3 get and post 简单封装 from urllib import request, parse import json def RequestMethod(methodR, ...
- 启动windows服务的bat文件编写格式
1.bat文件需要和bin文件内容放在一起 启动服务的bat文件如下: sc create 邮件服务 binPath= "%~dp0可执行文件名称.exe" start= auto ...
- PacificA: Replication in Log-Based Distributed Storage Systems
PacificA: Replication in Log-Based Distributed Storage Systems - Microsoft Research https://www.micr ...
- python学习笔记(二)— 列表(list)
列表也叫数组,列表定义,使用[]即可:列表里面可以再套列表,一个里面套一个列表,叫二维数组:一个里面套一个列表,里面的列表再套一个列表,这个叫三维数组,套几层就是几维,定义格式如下: list1 = ...
- d3.js 之关联数据:data操作符
数据可视化 在可视化工作中,一个基本出发点是将不同的数值映射到不同的可视化 元素的属性上,使其表现出各自不同的视觉特征. 比如:以数组中的每一个值为直径分别创建一个圆,我们得到三个圆: 在d3中,可视 ...