在传统交换机的架构下,网络操作系统由各设备厂商基于芯片厂商负责提供的ASIC芯片和SDK自行设计、开发,设备厂商需要开发上层APP、适配层以在特定设备商完成应用,实现各种网络功能。传统交换机的软硬件开发均由设备厂商提供,系统完全封闭,无法适应新功能快速开发部署的需求:
为构建一个开放的系统,OCP(Open Compute Project, 开发计算项目)开始推动硬件、网络操作系统开源与标准化进程。其中,SONiC (Software for Open Network in the Cloud) 是由微软于2016年发起,并在2017年贡献给OCP的项目。SONiC的所有软件功能模块都开源,这极大地推动了OCP社区以及其他厂商/用户在开放网络方面的创新。SONiC通过将SAI作为南北向互联的中间件,屏蔽不同ASIC之间的驱动差异,也正是由于SAI的存在,SONiC的网络功能应用才能够支持多个厂家的ASIC。络软件建立在交换机抽象接口(SAI,SAI接口适配ASIC的工作由各个厂家实现)上,使其可以运行在各种硬件设备中,形成白盒交换机软件生态链。
SONiC自推出后,迅速得到了产业界的支持,大部分网络芯片供应商都在SDK上支持SAI,并配合微软为SAI版本添加新的接口,如网络分析接口、L3快速重路由和BFD等。
系统架构
SONiC构建在Linux系统之上,并且利用键值数据库(redis)、容器技术(docker)、标准化硬件接口定义等技术,使其成为一个软硬件彻底解耦、软件模块松耦合(loose coupling)、高可靠、易于扩展、开源开放的网络软件系统。其架构特点主要体现在3个方面:
- SAI接口:SAI是SONiC的核心,并为SONiC提供了统一的API。设备厂家、网络开发者可以基于芯片厂家提供的SAI接口开发应用,而不需要关心底层硬件实现,加速产品迭代与创新;
- 数据库架构:在数据库架构方面,SONiC使用数据库架构代替原有的模块化耦合架构,将应用模块之间的传递数据模式变成应用模块之间通过数据库进行数据交换的模式,从关注流程转变为关注数据,实现了功能模块之间的解耦。数据库成为了所有模块的枢纽,模块与模块之间解耦,数据库是稳定的,各个模块升级与故障不会影响其他模块,在整个切换过程中转发面不受到影响;
- 容器化组件:容器化使得SONiC具有极高的可扩展性,网络运营管理人员能够快速引入第三方、专有或开源组件,而不对原有业务造成影响;
- 与内核交互少: 运行在用户空间的SONiC系统,只有为数很少的模块(pmon、swss和syncd)与Linux内核之间存在交互关系,从而保证了系统的稳定性。
设计原则
- 软硬件解耦的理念和标准化的软硬件接口定义,分别让网络软件系统和硬件平台飞速发展;
- 网络软件系统的演进,也可以让快速迭代、按需定制、社区共建成为可能;
- 网络软件的开发形成了全新的共建、共享、开放的网络生态系统,快速推进网络自身的发展;
- 微软开源SONiC的同时,将自己在数据中心网络运营实践方面的经验也一并开放给了外界,everflow、netbouncer等功能就是SONiC软件里要支持的功能。这些功能的开放,是广大网络运维工程师的福音,让网络排障再也不仅仅只是依靠ping、traceroute或者纯人工经验,而是走向智能化和科学化;
- SONiC也提供了Ipv6的支持、Fast Reboot的功能,能够保证在升级的过程当中,数据平面的中断不超过30秒;
- 2018年,SONiC进一步引入了Warm Reboot功能,该功能可以把数据平面的中断控制在一秒之内,在很多现有的通用平台上,甚至能够做到无中断的升级。同时也引入了一些新的service,比如Streaming Telemetry和一些虚拟化的支持。
核心组件
- sonic-swss-common : 1.3万
- sonic-swss: 6万行
- sonic-sairedis : 22万
CLI、REST FUL API、CFG Manager 配置 redis 数据库 CFG_DB,redis 通过 key-space 机制将修改的信息发布给 SWSS 中的各个 mgrd,xxx-mgrd 调用linux命令或者发送 netlink 消息,将信息同步给linux,成功后,同时将信息插入到APP_DB的PORT_TABLE中,portorch 订阅 APPL_DB中的PORT_TABLE,接收相关信息,处理加工,并更新ASIC_DB信息。
大部分组件的表都是redis hash表,同类型中不同的对象表的前缀相同,后缀不同,同一个哈希表中,不同的key对应不同的属性。
SWSS 容器
SWSS (switch state service)是一套工具,用于协调所有SONiC模块之间、模块与redis引擎之间的通信。swss还承载以下服务,这些服务通过netlink与SONiC应用层交互(在其他容器中运行的进程除外,即fpmsyncd、teamsyncd和lldp_syncd)。下面的前三个服务(portsyncd、intfsyncd、neighsyncd)将状态推送到redis引擎,而最后三个服务(orchagent、intfMgrd、vlanMgrd)从引擎收集状态,并重新发布状态到应用。
- portsyncd :侦听与端口相关的netlink事件。当交换机启动时,portsyncd解析交换机的硬件配置文件以获取物理端口信息,然后将收集的状态推送到APPL_DB中。portsyncd 设置端口速度、lane和MTU,并将状态注入状态数据库。
- intfsyncd :侦听与接口相关的netlink事件,并将收集的状态推送到APPL_DB中。intfsyncd还管理与接口关联的新的或更改的IP地址等元素。
- neighsyncd :侦听新发现的邻居由于ARP处理而触发的与邻居相关的netlink事件,并将收集的状态推送到APPL_DB中。neighsyncd管理诸如MAC地址和邻居地址族之类的属性,并最终构建数据平面中用于二级重写目的所需的邻接表。
- teamd: 链接聚合(LAG)容器,它提供了在SONiC交换机上配置绑定的功能。teamd服务是LAG协议的一个基于Linux的开源实现。teamsyncd服务管理teamd和southbound子系统之间的交互。
- orchagent :swss子系统中最关键的组件。orchagent提取各种syncd服务注入的所有相关状态,相应地处理和发送这些信息,最后将其推送到ASIC_DB。orchagent在这些服务中是独一无二的,因为它既是消费者(如从APPL_DB获取状态)又是生产者(如推进ASIC_DB)。
- intfMgrd :对来自APPL_DB、CONFIG_DB和state_DB的状态作出反应,以配置Linux内核中的接口,前提是所监视的任何数据库中没有冲突或不一致的状态。
- vlanMgrd :对来自APPL_DB、CONFIG_DB和state_DB的状态作出反应,以在Linux内核中配置VLAN,前提是所监视的任何数据库中没有冲突或不一致的状态。
相关的模块功能角色总结如下:
- xxx-mgrd : 对来自APPL_DB、CONFIG_DB和state_DB的状态作出反应,以配置linux内核中的接口。
- xxx-syncd: 侦听与内核相关的netlink事件,并将收集的状态写入APP_DB。
- orchagent: swss子系统中最关键的组件。orchagent提取各种syncd服务注入的所有相关状态,相应地处理和发送这些信息,最后将其推送到ASIC_DB。orchagent在这些服务中是独一无二的,因为它既是消费者(如从APPL_DB获取状态)又是生产者(如推进ASIC_DB)。
syncd 容器
将交换机的网络状态与ASIC同步,这包括ASIC当前状态的初始化、配置和收集。主要逻辑组件包括:
- syncd:执行同步逻辑的进程。在编译时,syncd与ASIC SDK库链接,并将从接口收集的状态注入ASIC。syncd订阅ASIC_DB以接收来自swss参与者的状态,并将来自硬件的状态推回ASIC_DB。
- SAI API:交换机抽象接口(SAI)定义了API,以提供独立于供应商的方式来控制转发元素,如交换ASIC、NPU或软件交换机。
- ASIC SDK:驱动ASIC所需SDK的SAI兼容实现。SDK钩住syncd,syncd 负责驱动其执行。
网络应用容器
- lldp:链路层发现协议容器,在其中运行以下进程:1) lldpd:LLDP服务,它与外部对等方建立LLDP连接,以公布和接收系统功能。2) lldp_syncd:此服务将lldp发现状态上载到redis引擎(集中式系统的消息基础结构),将lldp状态传递给需要它的应用程序,如SNMP。3) lldpmgr:lldpd服务的配置工具。
- snmp:承载snmp功能。此容器中有两个相关流程:1) snmpd:处理来自外部网络元素的传入SNMP轮询的服务器。2) snmp代理:这是SONiC对AgentX snmp子代理SONiC_ax_impl的实现。sonic_ax_impl子代理向主代理(snmpd)提供从集中式Redis引擎中的sonic数据库收集的信息。
- pmon: 此容器是Sensord 服务运行的地方。sensord定期记录硬件组件的传感器读数,并在触发报警时发出警报。pmon容器还承载fancontrol进程,该进程从相应的平台驱动程序收集与风扇相关的状态。
- bgp: 运行路由堆栈。BGP容器运行以下服务: 1) bgpd:标准的BGP服务。外部方的路由状态通过常规TCP或UDP套接字接收,并通过zebra/fpmsyncd接口向下推送到转发平面。2) zebra:传统的IP路由管理器。它提供内核路由表更新、接口查找和跨各种路由协议的路由重新分配服务。zebra还通过netlink将计算出的FIB向下推送到内核,并通过转发平面管理器(FPM)推送到转发过程中涉及的南向组件。3) fpmsyncd:此服务收集zebra生成的FIB状态,并将其内容转储到redis引擎内的应用程序数据库(APPL_DB)中。
nfvschool 微信公共号: nfvschool
nfvschool网址: nfvschool.cn
参考
- SONi CSoftwareSubsystemsOverview-OCP-workshop 2018
- SONiC Application DB schema format
- SONiC官网
- SONiC官方wiki
- sonic orchagent与syncd之间的请求与应答
- 连接SONiC与P4交换芯片的SDE
- 详解:SONiC演进四部曲
- 微软解颖:SONiC Update 2020
- SONiC Warm Reboot
- 京东网络开放之路——自研交换机探索与实践
- 微软解颖:SONiC Update 2020
- RESTAPI在SONiC中的实现
- sonic-utilities
- ouyangxibao 的segmentfault
- docs-nvidia-system-architecture
Was this helpful?
2 / 0