Network Virtualization in Windows Server 2012

    在之前的Windows Server版本中,Hyper-V一直在做本宿主机的事情,即在本宿主机上进行资源的虚拟化,亦即池化。这也意味着资源的云化难以跨越宿主机之间的鸿沟。随着虚拟机对NUMA技术的支持,Hyper-V平台对存储性能的迅速提升,Windows Server 2012显然已经不满足于仅仅充当一个虚拟化节点了。无论从操作系统还是管理思路,都发生了很大的变化。从这一点来说,Windows Server被称之为Cloud OS是实至名归的。

    在新的云平台中,为了满足资源云化的要求,微软开始重视基于Windows Server 2012的私有云或者托管云建设。为了满足运营的要求,在新的平台中开始支持多租户的场景。您可能对物理机迁移到虚拟机已经不再陌生,但是如果涉及到多个组织(租户)使用相同的云平台,很容易发生IP地址空间重复的情况。

    举例来说,A公司(以下称之为Red)与B公司(以下称之为Blue)租用了相同运营商的托管云平台。或者是A公司与B公司使用了同一集团下的私有云平台。由于A公司B公司各自进行自己的IT架构建设,所以存在都使用相同私有IP地址的情况。

    我们无法保证A公司和B公司的虚拟机都运行在不同的宿主机上,那样也失去了资源池化的意义。因此,很有可能在宿主机上出现IP地址相同的虚拟机。传统虚拟机平台上,这会导致IP地址冲突,使得其中的虚拟机无法正常进行通信。

    为了解决这一问题,Windows Server 2012中引入了网络虚拟化。

    如上图,不同宿主机上运行了A公司和B公司的虚拟机。由于使用了相同的IP地址段,造成了虚拟机上的IP冲突。正如你所知道的,不论是A公司还是B公司,修改原有IT架构中的IP地址都会带来巨大的工作量和风险。为了避免这样的问题,Windows Server 2012使用网络虚拟化来解决。

    网络虚拟化有两种做法。一种被称之为标准路由封装(GRE,Generic Routing Encapsulation),在Windows Server 2012中也被称为NVGRE。另一种被称之为IP地址重写(IP Rewrite)。

    您可以把NVGRE理解为建立在宿主机之间的Site-To-Site的VPN。同样是为了避免内部机器使用外部地址,我们常见的VPN是为了让内部机器共享外部Internet地址,而NVGRE是为了宿主机上的虚拟机的IP地址(称之为CA,Customer Address)共享使用宿主机的IP地址(称之为PA,Provider Address)。

    在实际的物理网络上,宿主机之间建立起了各自的隧道,不同公司的虚拟机在各自的隧道中进行通信。他们之间是完全隔离的,安全的。

    (PS:微软画的图这一幅好像颜色标错了)

    具体实现方式也非常的简单,在原有虚拟机之间的IP包上,加上了GRE封装,添加上MAC地址和GRE Key,用以区分到不同的虚拟网络,然后再用宿主机的IP包头封装发送。

    为了支持这项工作,Windows Server 2012宿主机上必须完成几项工作。

    1. 首先需要在每台宿主机的网络适配器上启用网络虚拟化组件。可以使用如下的PowerShell命令。

Enable-NetAdapterBinding “[网络适配器]” -ComponentId “ms_netwnv”

        [网络适配器]表示需要进行网络虚拟化的NIC所使用的名称。

    2. 然后需要获取所有使用网络虚拟化的虚拟机的虚拟网络适配器的MAC地址。可以在Hyper-V管理器中查看每台虚拟机的配置,当然我们也有更快的办法。

Get-VM [虚拟机名称*] -ComputerName [宿主机1],[宿主机2] | Get-VNNetworkAdapter

        如果虚拟机采用了相同的命名规则,[虚拟机名称*]表示这些虚拟机开始的字母并可以使用通配符,否则需要使用“,”分隔列出,例如[虚拟机A1],[虚拟机A2],[虚拟机B1],[虚拟机B2]。[宿主机1],[宿主机2]表示使用“,”分隔的宿主机列表。命令行将返回这些虚拟机使用的网络适配器的信息。

    3. 接下来需要在每台宿主机上建立网络虚拟化查找记录.

New-NetVirtualizationLookupRecord -VirtualSubnetID “5001” -CustomerAddress “10.1.1.11” -ProviderAddress “192.168.1.10” -MACAddress “[VM1-MAC]” -Rule “TranslationMethodEncap”
New-NetVirtualizationLookupRecord -VirtualSubnetID “5001” -CustomerAddress “10.1.1.12” -ProviderAddress “192.168.1.20” -MACAddress “[VM2-MAC]” -Rule “TranslationMethodEncap”
New-NetVirtualizationLookupRecord -VirtualSubnetID “6001” -CustomerAddress “10.1.1.11” -ProviderAddress “192.168.1.10” -MACAddress “[VM3-MAC]” -Rule “TranslationMethodEncap”
New-NetVirtualizationLookupRecord -VirtualSubnetID “6001” -CustomerAddress “10.1.1.12” -ProviderAddress “192.168.1.20” -MACAddress “[VM4-MAC]” -Rule “TranslationMethodEncap”

        [VM1-MAC]等表示的是各个虚拟机使用的虚拟网络适配器的MAC地址。可以看到PoweShell命令将其分配到了不同的虚拟子网5001和6001中。建立了查找记录后,就能够在宿主机上进行NVGRE的封装发送和拆包投递。

    4. 然后需要在每台宿主机上,为虚拟机之间建立路由。

New-NetVirtualizationCustomerRoute -RoutingDomainID “{11111111-2222-3333-4444-000000005001}” -VirtualSubnetID “5001” -DestinationPrefix “10.1.1.0/24” -NextHop “0.0.0.0” -Metric 255
New-NetVirtualizationCustomerRoute -RoutingDomainID “{11111111-2222-3333-4444-000000006001}” -VirtualSubnetID “6001” -DestinationPrefix “10.1.1.0/24” -NextHop “0.0.0.0” -Metric 255

        虚拟机是无法得知NVGRE该向何处通信的。就如同虚拟机自己不知道自己是虚拟的,对于虚拟机来说,虚拟网络是透明的,就像物理网络一样。因此需要将虚拟机的通信路由到虚拟子网上去。

        {11111111-2222-3333-4444-000000005001}是路由领域ID,这里仅仅为了方便输入做的设定。

    5. 在每台宿主机上,最后还需要为网络适配器绑定PA。

New-NetVirtualizationProviderAddress -InterfaceIndex [网络适配器索引号] -ProviderAddress “192.168.1.10” -PrefixLength 24
New-NetVirtualizationProviderAddress –InterfaceIndex [网络适配器索引号] -ProviderAddress “192.168.1.20” -PrefixLength 24

        网络适配器索引号可以通过Get-NetworkAdapter进行查看。此步骤即是为启用了网络虚拟化的网络适配器分配PA地址。

    6. 最后,需要为每台虚拟机的虚拟网络适配器设置虚拟网络ID。

Get-VMNetworkAdapter [虚拟机A1]|Set-VMNetworkAdapter –VirtualSubnetId 5001
Get-VMNetworkAdapter [虚拟机B1]|Set-VMNetworkAdapter –VirtualSubnetId 6001
Get-VMNetworkAdapter [虚拟机A2]|Set-VMNetworkAdapter –VirtualSubnetId 5001
Get-VMNetworkAdapter [虚拟机B2]|Set-VMNetworkAdapter –VirtualSubnetId 6001

        设置好虚拟机的虚拟网络ID后,虚拟机的网络通信就能够使用虚拟网络ID进行NVGRE封装了。

 

    网络重写是另一种网络虚拟化的实现方式。通过将虚拟机发出的IP包包头地址重写,使得这些原本地址重复的包能够在相同的物理网络上进行传输。实现起来会比较简单,不需要维护查找记录和路由,但是需要额外占用许多IP地址。

 

    有必要对两种网络虚拟化做一个简单的比较。

  NVGRE Encapsulation   IP Rewrite

  • Recommended for most scenarios because of scalability benefits
  • Compatible with today’s network infrastructure hardware
  • As few as one IP address per host lowering burden on switches
  • Standards based – RFCs 2784 & 2890 and industry support
    • NVGRE draft RFC co-authors: Arista, Broadcom, Dell, Emulex, HP, Intel
  • Full MAC headers and explicit Virtual Subnet ID marking supports multi-tenant traffic analysis, metering and control
  • NVGRE-aware hardware will offer similar performance as IP Rewrite

  • Appropriate today for high performance scenarios such as a virtual machine requiring 10 Gbps

此条目发表在Cloud Computing, Virtualization, Windows Server分类目录,贴了, , , , 标签。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 登出 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 登出 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 登出 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 登出 /  更改 )

Connecting to %s