AWS的体量
要求网络设备必须开放解耦
不用黑盒,这辈子也不用商业设备了
从AWS自研交换机的初心看背锅侠的未来

解耦不仅仅
可以更好的控制功耗
同时也极大延续产品的生命周期
AWS六年, 谷歌六年, 微软六年, Meta五年

解耦带来的巨大威力
不仅让产品实现积木式Scale Out
更重要的是归一化软硬件带来Cap降低
所以从10G/25G速率开始AWS走上定制之路

这就为当前
100Tbps网络打下坚实基础

但是AWS和谷歌不同
热热闹闹的网络设备自研
从来没有公开过软件的技术细节
不过最近Amazon某设备被意外拿到
开机后发现系统是2014年的Almach版本

Almach是仙女座
(Andromeda)的第三亮星
是AWS CLOS Fabric的基础网络平台

Andromeda又是
谷歌SDN网络的虚拟化底层
所以谷歌和Amazon两家互为表里?

机缘巧合,我得到一台Quanta LB8交换机,装载了定制的早期版本的Cumulus NOS,并部署在Amazon。LB8是一台48端口10GbE交换机。
参考阅读:Cumulus的前世今生及资料合集
该交换机基于自动化工具部署,该工具禁用了带密码的ssh登录。为了进入交换机并配置设备,我需要以单用户模式启动并更新密码文件。这可以通过用ctrl-c停止uboot并将init进程改为bash来完成。
> setenv ramfsargs=setenv bootargs ${bootargs} rdinit=/bin/bash> boot
在Linux内核加载后,它将生成bash shell而不是init。在init中,我挂载了持久化的配置,并为自己添加了一个登录名。
# mount -t proc proc /proc# mount -t sysfs sys /sys# mount -t devpts devpts /dev/pts# mount -t jffs2 /mnt/mtdblock4 /mnt/persist# vi /mnt/persist/etc/passwd
现有的配置有两个部分,一个二层网桥和一个三层OSPF网络。看起来交换机是作为一个ToR部署的,其中端口1→38是一个172.X.X.X/24的L2网络,端口39和40在一个冗余的ECMP网络中被用于三层OSPF路由。Cumulus的配置反映了正常的Debian设置,其中/etc/network/interfaces定义了端口和网桥,而/etc/quagga/{zebra.conf,ospfd.conf}定义了OSPF的路由。连接到交换机的主机使用dhcpd代理来抓取172.X.X.X/24网络上的地址。
/mnt/persist挂载点是唯一在重启时被保存的东西。有一个cron job被定义为在文件被更新时将其复制过来以维持这一状态。另一个cron job从ec2中提取用户权限,以便维护一个集中的管理员数据库,这就是交换机拥有1300个用户账户的原因。
为了在我的实验室中使用该交换机,我镜像了我在LB6M上使用的配置,以便在LB8上测试ECMP。LB8上的Cumulus使用一个标准的Debian网络设置,这些是必要的文件。/etc/network/interfaces, /etc/quagga/zebra.conf, and /etc/quagga/ospfd.conf。下面是我的配置取代了亚马逊的配置后,LB8上的路由表。
root@lb8:~# vtyshHello, this is Quagga (version 0.99.21).Copyright 1996-2005 Kunihiro Ishiguro, et al.lb8# show ip routeCodes: K - kernel route, C - connected, S - static, R - RIP,O - OSPF, I - IS-IS, B - BGP, A - Babel,> - selected route, * - FIB routeK>* 0.0.0.0/0 via 10.3.2.1, eth0O 10.1.10.0/30 [110/10] is directly connected, jrp1, 01:00:21C>* 10.1.10.0/30 is directly connected, jrp1O 10.1.10.24/30 [110/10] is directly connected, jrp7, 01:00:21C>* 10.1.10.24/30 is directly connected, jrp7O 10.1.10.28/30 [110/10] is directly connected, jrp8, 01:00:21C>* 10.1.10.28/30 is directly connected, jrp8O 10.1.10.32/30 [110/10] is directly connected, jrp9, 01:00:21C>* 10.1.10.32/30 is directly connected, jrp9O 10.1.10.36/30 [110/10] is directly connected, jrp10, 01:00:21C>* 10.1.10.36/30 is directly connected, jrp10O 10.1.10.40/30 [110/10] is directly connected, jrp11, 01:00:21C>* 10.1.10.40/30 is directly connected, jrp11O 10.1.10.44/30 [110/10] is directly connected, jrp12, 01:00:20C>* 10.1.10.44/30 is directly connected, jrp12O 10.1.10.48/30 [110/10] is directly connected, jrp13, 01:00:17C>* 10.1.10.48/30 is directly connected, jrp13O 10.1.10.52/30 [110/10] is directly connected, jrp14, 01:00:16C>* 10.1.10.52/30 is directly connected, jrp14C>* 10.3.2.0/24 is directly connected, eth0O>* 10.10.37.0/24 [110/20] via 10.1.10.54, jrp14, 00:59:56* via 10.1.10.50, jrp13, 00:59:56O>* 10.10.74.0/24 [110/20] via 10.1.10.26, jrp7, 01:00:02* via 10.1.10.30, jrp8, 01:00:02O>* 10.10.120.0/24 [110/20] via 10.1.10.2, jrp1, 00:39:25O>* 10.10.121.0/24 [110/20] via 10.1.10.46, jrp12, 01:00:02* via 10.1.10.34, jrp9, 01:00:02* via 10.1.10.38, jrp10, 01:00:02* via 10.1.10.42, jrp11, 01:00:02C>* 127.0.0.0/8 is directly connected, loC>* 127.0.0.1/32 is directly connected, lo
Cumulus包括一个叫做ecmpcalc的工具,当有多个可能的接口时,它将显示一个路由将采取的接口。下面是一个例子,在下面的iperf测试中所采取的路径。参数-c 4告诉ecmpcalc有4个可能的接口,得出的数字是TCP连接使用的接口。
root@lb8:~# ecmpcalc -p tcp -i jrp1 -c 4 -s 10.1.10.2 --sport 33780 -d 10.10.121.1 --dport 5001ecmpcalc: will query hardware2root@lb8:~# ecmpcalc -p tcp -i jrp8 -c 4 -s 10.1.10.30 --sport 56900 -d 10.10.121.1 --dport 5001ecmpcalc: will query hardware0root@lb8:~# ecmpcalc -p tcp -i jrp13 -c 4 -s 10.1.10.50 --sport 48790 -d 10.10.121.1 --dport 5001ecmpcalc: will query hardware3
运行iperf的端口情况。
$ iperf -sServer listening on TCP port 5001TCP window size: 2.00 MByte (default)[ 4] local 10.10.121.1 port 5001 connected with 10.1.10.2 port 33780[ 5] local 10.10.121.1 port 5001 connected with 10.1.10.30 port 56900[ 6] local 10.10.121.1 port 5001 connected with 10.1.10.50 port 48790[ ID] Interval Transfer Bandwidth[ 4] 0.0-10.0 sec 11.0 GBytes 9.47 Gbits/sec[ 5] 0.0-10.0 sec 11.0 GBytes 9.45 Gbits/sec[ 6] 0.0-10.0 sec 11.0 GBytes 9.48 Gbits/sec
LB8上的ECMP是一个四层的Hash计算,基于端口和协议决定出方向。我还没有找到改变该算法的方法。
白盒交换机的先驱们
最早部署的大多是OPPF网络
如果感兴趣还可以尝试百度交换机
BGP 算个P!AWS 最爱原来是 OSPF
亚太互联网络信息中心 apnic 将在 3 月份将针对OSPF协议举行一场Operation Tutorial,感兴趣的同学点个赞和在看后,在公众号后台回复“tooyum46”可以获取报名地址及相关材料。
相关阅读:
P4教程 P4应用
P4可编程SDN交换机
Tofino1 | Tifino 2 |Tofino 3
从OpenFlow到P4:SDN在路上
基于可编程交换机的网络仿真平台



