1 SONIC简介
SONiC(Software for Open Networking in the Cloud)是一个开源的网络操作系统,主要针对数据中心网络和云服务提供商的场景。相比于传统交换件,SONIC交换机的优点之一是实现了软硬件的解耦,类似windows操作系统和PC机硬件的关系,无论是哪种硬件或者芯片类型,SONIC系统都能够适配。另外SONIC是完全开源的NOS系统,功能特性能够快速的迭代,满足用户的使用需求。
SONIC采用了容器化的技术,相互之间隔离,保证了数据的健壮性及模块的稳定性,并且缩小了故障域,单个网络应用容器的故障并不影响其他容器运行。网络应用容器的数据交互均使用数据库作为中转。
SONIC框架图
2 SONIC容器化组件
要解释容器化组件,首先需要了解什么容器化?所谓的容器化是指将软件代码和所需的所有组件(例如库、框架和其他依赖项)打包在一起,让它们隔离在自己的"容器"中。
这样,容器内的软件或应用就可以在任何环境和任何基础架构上一致地移动和运行,不受该环境或基础架构的操作系统影响。容器就像是一个气泡(或者是应用周围的计算环境),把应用和周围环境隔离开来。它相当于是一个功能全面、便于移植的计算环境。
将应用打包装入可在平台和基础架构之间移动的容器后,只用把该容器移动到某个位置,应用就能在那里成功运行使用,因为容器中包含了成功运行应用所需的一切。
而SONIC容器化组件是指采用了容器化技术中各种docker组件,其包含syncd、swss、database、网络应用容器等等,具体如SONIC容器化框图所示:
SONIC系统容器化组件框图
2.1 SWSS容器
SWSS (SONiC Switch State Service)作为sonic重要容器化组件之一,用于收集、存储和处理网络状态信息,并且协调所有SONiC模块之间、模块与redis数据库之间的通信。swss还承载以下服务,这些服务通过netlink与SONiC应用层交互(在其他容器中运行的进程除外,即fpmsyncd、teamsyncd和lldp_syncd)。portsyncd、intfsyncd、neighsyncd将状态推送到redis数据库,而orchagent、intfMgrd、vlanMgrd从redis数据库收集状态,并重新发布状态到应用。
2.1.1 portsyncd
侦听与端口相关的netlink事件。当交换机启动时,portsyncd解析交换机的硬件配置文件以获取物理端口信息,然后将收集的状态推送到APPL_DB中。portsyncd 设置端口速度、lane和MTU,并将状态注入状态数据库。
2.1.2 intfsyncd
侦听与接口相关的事件,并将收集的状态推送到APPL_DB中。intfsyncd还管理与接口关联的新的或更改的IP地址等元素。
2.1.3 neighsyncd
侦听新发现的邻居由于ARP处理而触发的与邻居相关的netlink事件,并将收集的状态推送到APPL_DB中。neighsyncd管理诸如MAC地址和邻居地址族之类的属性,并最终构建数据平面中用于二级重写目的所需的邻接表。
2.1.4 orchagent
swss子系统中最关键的组件。orchagent提取各种syncd服务注入的所有相关状态,相应地处理和发送这些信息,最后将其推送到ASIC_DB。orchagent在这些服务中是独一无二的,因为它既是消费者(如从APPL_DB获取状态)又是生产者(如推进ASIC_DB)。
2.1.5 intfMgrd
对来自APPL_DB、CONFIG_DB和STATE_DB的状态作出反应,以配置Linux内核中的接口,前提是所监视的任何数据库中没有冲突或不一致的状态。
2.1.6 vlanMgrd
对来自APPL_DB、CONFIG_DB和state_DB的状态作出反应,以在Linux内核中配置VLAN,前提是所监视的任何数据库中没有冲突或不一致的状态。
2.2 SYNCD 容器
syncd是SONiC中的一个重要组件,主要负责管理和监控网络设备的光模块(SFP、QSFP等)和连接线缆等硬件设备,同时syncd会监控和管理网络设备的端口状态,包括速率、双工模式、状态等参数,并根据需要进行相应的配置和调整。
2.2.1 syncd
执行同步逻辑的进程。在编译时,syncd与ASIC SDK库链接,并将从接口收集的状态注入ASIC。syncd订阅ASIC_DB以接收来自swss参与者的状态,并将来自硬件的状态推回ASIC_DB。
2.2.2 SAI API
交换机抽象接口(SAI)定义了API,以提供独立于供应商的方式来控制转发元素,如交换ASIC、NPU或软件交换机。
2.2.3 ASIC SDK
驱动ASIC所需SDK的SAI兼容实现。SDK钩住syncd,syncd 负责驱动其执行。
2.3 DATABASE容器
database用于存储网络设备的各种配置信息和状态信息,其包含的核心数据库如下:
0号数据库:APPL_DB,存储所有应用程序生成的状态——路由、下一跳、邻居等。这是应用程序与其他SONiC子系统交互的入口点;
1号数据库:ASIC_DB,存放底层 ASIC 的状态信息和配置表项,格式对底层芯片友好,芯片重启可以从ASIC_DB快速恢复;
2号数据库:CONTERS_DB,存放每个端口计数器和统计信息,这些信息可以被cli使用或者反馈给telemetry;
3号数据库:LOGLEVEL_DB,存放日志配置等级信息;
4号数据库:CONFIG_DB,存储SONiC应用程序创建的配置状态——端口配置、接口、VLAN等,有的APP/模块可能没有配置,可以没有对应表,有的配置直接调用linux的命令进行配置,有的配置还需要下发到芯片,这时需要往APPL_DB里写;
5号数据库:FLEX_COUNTER_DB,存放灵活计数器配置;
6号数据库:STATE_DB,存储系统中配置实体的“关键”操作状态。此状态用于解决不同SONiC子系统之间的依赖关系。例如,LAG端口channel(由teamd子模块定义)可能指系统中可能存在或不存在的物理端口。另一个例子是VLAN的定义(通过vlanmgrd组件),它可能引用系统中存在未知的端口成员。本质上,该数据库存储了解决跨模块依赖关系所需的所有状态。
2.4 应用层容器
2.4.1 lldp
链路层发现协议容器,在其中运行以下进程:1) lldpd:LLDP服务,它与外部对等方建立LLDP连接,以公布和接收系统功能。2) lldp_syncd:此服务将lldp发现状态上载到redis数据库,将lldp状态传递给需要它的应用程序,如SNMP。3) lldpmgr:lldpd服务的配置工具。
2.4.2 bgp
运行路由堆栈。BGP容器运行以下服务: 1) bgpd:标准的BGP服务。外部方的路由状态通过常规TCP或UDP套接字接收,并通过zebra/fpmsyncd接口向下推送到转发平面。2) zebra:传统的IP路由管理器。它提供内核路由表更新、接口查找和跨各种路由协议的路由重新分配服务。zebra还通过netlink将计算出的FIB向下推送到内核,并通过转发平面管理器(FPM)推送到转发过程中涉及的南向组件。3) fpmsyncd:此服务收集zebra生成的FIB状态,并将其内容转储到redis数据库内的应用程序数据库(APPL_DB)中。
2.4.3 snmp
承载snmp功能。此容器中有两个相关流程:1) snmpd:处理来自外部网络元素的传入SNMP轮询的服务器。2) snmp代理:这是SONiC对AgentX snmp子代理SONiC_ax_impl的实现。sonic_ax_impl子代理向主代理(snmpd)提供从集中式Redis数据库中的sonic数据库收集的信息。
2.4.4 Pmon
此容器是Sensord 服务运行的地方。sensord定期记录硬件组件的传感器读数,并在触发报警时发出警报。pmon容器还承载fancontrol进程,该进程从相应的平台驱动程序收集与风扇相关的状态。
2.4.5 teamd
链接聚合(LAG)容器,它提供了在SONiC交换机上配置绑定的功能。teamd服务是LAG协议的一个基于Linux的开源实现。teamsyncd服务管理teamd和southbound子系统之间的交互