场景介绍
很多企业用户和电信运营商会在相关业务中使用组播技术,例如在线直播、视频会议、视频转码、金融交易平台、多媒体广播及多播传输系统(MBMS)等服务。现在越来越多的用户将本地数据中心的业务迁移到云上,用户不仅仅需要云上环境支持组播,还需要支持本地数据中心与云上之间的组播通信。
云上环境的组播技术已经在云企业网-企业版中实现,通过云企业网-企业版实现VPC内或者跨VPC的组播通信,详细信息可以参考官方文档。但是有些用户需求是实现本地数据中心与云上之间的组播通信,期望能够支持IGMP,组播路由协议例如PIM(Protocol Independent Multicast)。阿里云原生系统和产品目前还无法支持这种需求,本文介绍一种解决方案实现阿里云混合云组播。
解决方案概述
此解决方案需要在阿里云VPC中部署第三方支持组播路由的应用,并且需要通过隧道打通阿里云与数据中心之间的组播域。至于阿里云与数据中心互通方式是没有限制的,可以通过公网互通,也可以使用专线内网互通。
解决方案的组成部分:
Underlay 网络:
-
使用物理设备,物理连接,IP路由和VPC网络沟通的底层网络
Overlay网络:
-
虚拟化的组播网络层,包含使能组播功能的网络设备和阿里云组播组件,设备间通过隧道技术交互组播信息与组播数据
如下图是此解决方案的整体概览:
前提条件
Underlay网络要求
要实现此解决方案的第一步能够通过内网实现阿里云网络与数据中心网络之间的互通,互通的方式有很多种方式,例如:
-
高速通道专线互联到数据中心,然后配置边界路由器VBR,VBR添加到云企业网企业版中,实现VPC与数据中心IDC互通。
-
通过VPN实现内网阿里云网络与数据中心网络互通,VPN可以是公网VPN也可以是私网VPN。
-
通过公网隧道模式实现阿里云与数据中心内网互通
公网隧道模式
本方案中使用公网方式实现阿里云与数据中心之间的互通,然后使用GRE隧道实现混合云内网互通。在阿里云网络中部署一台服务器,服务器上运行虚拟路由器,虚拟路由器上配置了公网EIP,通过EIP可以与数据中心的组播路由器公网互通。然后在阿里云虚拟路由器和数据中心组播路由器上均配置GRE(Generic Routing Encapsulation)隧道,通过GRE隧道实现阿里云虚拟路由器与数据中心组播路由器之间内网互通。
虚拟路由器、安全组
在阿里云虚拟路由器中需要开启组播路由和PIM协议,PIM协议需要运行在GRE隧道tunnel接口上。通过GRE隧道实现阿里云虚拟路由器与数据中心组播路由器建立PIM邻居,PIM协议可以选择使用密集模式(PIM Dense Mode)也可以选择稀疏模式(PIM Sparse Mode),如果使用稀疏模式,需要指定静态汇合点( Rendezvous Point ) 或者使用AutoRP功能。配置完成后需要观察PIM邻居是否正常建立完成。
在虚拟路由器的服务器安全组中,需要在入方向安全组中添加安全组规则放行GRE协议和UDP协议流量。因为组播报文是通过UDP协议传输,虚拟路由器会把组播报文封装在GRE隧道中与数据中心之间传输。
Overlay网络组播配置
虚拟路由器
步骤一:创建虚拟路由器
在阿里云ECS服务器上运行虚拟路由器Cisco Catalyst 8000V镜像,镜像可以在阿里云市场中获取,推荐使用g5ne规格创建镜像。通过镜像创建虚拟路由器实例后即可登录系统进行路由配置。
步骤二:配置隧道和组播PIM协议
登录虚拟路由器后配置GRE隧道和PIM协议,阿里云虚拟路由器可以与数据中心路由器通过GRE隧道建立PIM邻居
ip multicast-routing distributed //开启组播路由功能
ip pim rp-address 10.0.0.1 //配置静态RP地址
interface Tunnel1
ip address 10.0.0.1 255.255.255.252 // 配置tunnel接口IP地址
ip pim sparse-mode //启用PIM稀疏模式
tunnel source GigabitEthernet1 //ECS端口
tunnel destination 8.208.89.x //数据中心组播路由器公网IP
router ospf 10 //运行ospf协议,通过VPC网段和tunel网段,与IDC之间互相学习到内网路由
network 10.0.0.0 0.0.0.255 area 0
network 192.168.0.0 0.0.0.255 area 0
CEN转发路由器
步骤一:开启组播功能
在使用企业版转发路由器搭建组播网络前,需要为企业版转发路由器开启组播功能。您可以通过以下两种方式开启企业版转发路由器的组播功能:
-
手动创建企业版转发路由器实例时直接开启组播功能。
-
如果您已经创建了企业版转发路由器实例,但未开启企业版转发路由器的组播功能,您可以通过以下步骤进行开启。
本文在创建创建企业版转发路由器时直接开启了组播功能。
步骤二:创建组播域
开启组播功能后,需要创建组播域并为组播域关联交换机,以此来划分一个组播网络范围。仅在组播网络范围内的资源才能发送和接收组播流量。
点击步骤一中创建的转发路由器实例ID,进入转发路由器配置界面,点击‘组播’ 标签页,创建组播域。在组播域中添加已经连接到转发路由器的VPC实例ID和VPC中的交换机实例ID。创建完成之后可以看到有一个组播域ID和组播域中绑定的交换机信息。
步骤三:创建组播源
创建组播域后,您需要在组播域下创建组播源,并为组播源指定其所属的组播组。组播源创建完成后,会向组播组发送组播流量,该组播组下的组播成员可以接收到该组播源发送的组播流量。
在组播域详情界面点击‘创建组播源’,创建组播源的时候填写组播地址IP,选择组播源所在的交换机和对应的弹性网卡。
步骤四:创建组播成员
创建组播源后,您需要指定组播成员,组播资源只有成为组播成员才能接收到组播流量。组播成员仅接收其所属组播组的组播流量。
在组播域详情界面点击‘创建组播成员’,创建组播成员的时候选择需要加入的组播组,选择组播成员所在的交换机和对应的弹性网卡。此步骤中需要将虚拟路由器添加为组播组成员。
使用案例-组播视频流
此案例整体拓扑如下所示:
此案例中组播源部署在阿里云ECS服务器中,组播成员在客户数据中心。组播数据流量可以在组播路由器中进行复制从而减小带宽占用,在阿里云中网络中转发路由器负责组播流量的转发和流量复制。
在阿里云ECS服务器上运行Linux操作系统,在Linux上安装ffmpeg软件。提前准备ts(Transport Stream)格式的视频文件,此文件可以通过UDP端口在组播组中进行视频流的传输,例如使用如下命令:
ffmpeg -re -i 11.ts -c copy -f mpegts udp://239.0.0.10:1234?pkt_size=1000
ffmpeg软件读取本地.ts文件,指定传输格式为mpegts,将流媒体文件通过组播组239.0.0.10 端口是1234进行传输,传输报文大小为1000字节。
在数据中心侧,我们可以使用wireshark和VLC客户端来接收组播流。通过Wireshark抓包可以证明组播流量可以通过网络传输到数据中心的服务器,VLC可以更直观的显示传输的视频信息。当配置VLC的时候,需要指定与客户端ffmpeg相同的组播组和传输的UDP端口。
在cisco-8000v虚拟路由器中配置如下信息
1、GRE隧道接口,使阿里云与IDC之间数据可以通过GRE互通
2、运行ospf动态路由协议,阿里云和IDC之间互相学习到对方的内网网段路由
3、接口运行PIM协议与手工指定组播RP地址
确保GRE隧道可以正常互通,cisco-8000v可以ping通IDC组播路由器隧道接口IP 10.0.0.2
cisco-8000v#ping 10.0.0.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.0.0.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms
查看组播pim邻居表
cisco-8000v#sh ip pim neighbor
PIM Neighbor Table
Mode: B - Bidir Capable, DR - Designated Router, N - Default DR Priority,
P - Proxy Capable, S - State Refresh Capable, G - GenID Capable,
L - DR Load-balancing Capable
Neighbor Interface Uptime/Expires Ver DR
Address Prio/Mode
10.0.0.2 Tunnel1 00:00:58/00:01:15 v2 1 / S P G
查看cisco-8000v组播路由表,可以看到组播(*,239.0.0.10)的组播路由表,出口地址为Tunnel1接口,当组播路由器收到239.0.0.10的组播流量后,会自动生成一条(S,G)的组播路由条目。
cisco-8000v#show ip mroute
IP Multicast Routing Table
Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
(*, 239.0.0.10), 00:00:11/00:03:23, RP 10.0.0.1, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
Tunnel1, Forward/Sparse, 00:00:11/00:03:23
(192.168.0.128, 239.0.0.10), 00:00:02/00:02:57, flags: FT //这是组播(S,G)路由条目,只有组播源发送组播流量的时候才会生成这条路由
Incoming interface: GigabitEthernet1, RPF nbr 0.0.0.0
Outgoing interface list:
Tunnel1, Forward/Sparse, 00:00:02/00:03:27
查看组播接口信息,可以查看每个接口的首发组播流量信息,组播流量从G1接口流入,从tunnel1接口流出。
cisco-8000v#show ip multicast interface
Tunnel1 is up, line protocol is up
Internet address is 10.0.0.1/30
Multicast routing: enabled
Multicast switching: fast
Multicast packets in/out: 0/5964
Multicast TTL threshold: 0
Multicast Tagswitching: disabled
GigabitEthernet1 is up, line protocol is up
Internet address is 192.168.0.129/24
Multicast routing: enabled
Multicast switching: fast
Multicast packets in/out: 5096/0
Multicast TTL threshold: 0
Multicast Tagswitching: disabled
当组播源通过ffmpeg发送组播视频流时,可以在IDC组播成员服务器中抓到组播报文。
端到端组播流量分析
上面的案例展示了从阿里云ECS发送组播流量到IDC组播服务器的环境和拓扑,下面进一步说明下报文在此拓扑中的转发情况。
1、ECS作为组播源发送组播报文到组播组中,报文源192.168.0.128,目的239.0.0.10。
2、转发路由器配置组播域、组播源、组播成员信息,当收到组播源发送的数据后,会复制和转发数据给组播成员。
3、虚拟路由器作为组播域中的组播成员,接收来自转发路由器的组播报文。
4、组播路由器将组播报文封装到GRE隧道中,发送给IDC边界组播路由器。
5、IDC边界组播路由器接收来自阿里云的封装组播报文的GRE报文。
6、IDC边界组播路由器解封装GRE报文,获取到内层组播报文,将报文进一步查找组播路由表发给组播成员。
7、IDC中的组播成员接收到组播报文。
如果IDC中的服务器作为组播源,云上ECS作为组播服务器,流量和拓扑是类似的,组播流量通过相同的网元进行转发。
负载冗余
网络架构中往往需要保证线路冗余与高可用,可以配置两条隧道实现阿里云与数据中心互通,但是这时候组播流量会从两条隧道中发送,组播成员会收到两份相同的组播数据,这种场景依赖于应用能否处理两份相同数据以及收到相同数据的时候是否会出现异常。
这种情况,可以调整网络结构,使其实现主备冗余功能。在数据中心路由器上配置IP SLA探测,当探测主GRE隧道接口正常的时候关闭备线路GRE接口,当探测到主GRE隧道接口异常的时候就开启备GRE隧道接口。这时候组播流量在同一时刻只会在一条GRE隧道上转发,目的服务器不会收到重复的组播数据,而且还保证了网络的高可用。
总结
本文介绍了如何使用阿里云云企业网转发路由器与IDC数据中心之间通过公网实现组播流量互通,实现了混合云组播交互的网络架构模型。其他互通模式,如专线内网互通,VPN内网互通方案与此类似,不在赘述。