【星海随笔】SDN neutron (一)

2023-11-11 00:44
文章标签 随笔 星海 sdn neutron

本文主要是介绍【星海随笔】SDN neutron (一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

一、SDN的原理:

  1. 控制平面与数据平面分离:传统网络中,网络设备同时承担控制和数据转发功能,而SDN将这两个功能分离,使得网络控制集中在一个中心控制器上。

  2. 中心控制器:SDN架构中的中心控制器负责网络的全局控制和管理,通过与网络设备进行通信,下发指令和策略,实现对网络的灵活控制。

  3. 可编程性:SDN网络中的网络设备具备可编程性,可以根据控制器下发的指令进行灵活配置和调整,实现网络的动态适应和优化。

二、SDN的架构:

  1. 控制平面:控制平面由中心控制器和控制应用组成,负责网络的全局控制和管理。中心控制器通过与网络设备进行通信,下发指令和策略,控制网络的行为。

  2. 数据平面:数据平面由网络设备组成,负责实际的数据转发和处理。网络设备根据控制器下发的指令进行数据包的转发和处理。

  3. 控制平面与数据平面之间的通信:控制平面与数据平面之间的通信通常通过Open-Flow协议来实现。OpenFlow是SDN中最常用的协议之一,它定义了控制器与网络设备之间的通信接口和消息格式。

三、SDN的应用场景:

  1. 网络虚拟化:SDN可以实现网络的虚拟化,将物理网络资源划分为多个虚拟网络,提供更灵活的网络服务和资源隔离。

  2. 动态流量工程:SDN可以根据网络流量的实时情况,动态调整网络路径和带宽分配,实现流量的优化和负载均衡。

  3. 安全与策略管理:SDN可以通过集中的控制器,实现对网络安全策略的集中管理和实时调整,提高网络的安全性和可管理性。

  4. 云计算和数据中心网络:SDN可以为云计算和数据中心网络提供灵活的网络服务和资源管理,实现快速部署和动态调整。
    在这里插入图片描述

网络虚拟化

Neutron北向有自己的REST API,中间有自己的业务逻辑层,有自己的DB和进程之间通讯的消息机制。
Neutron常见的进程包括Neutron-server和Neutron-agent,分布式部署在不同的操作系统。

Neutron是一个用Python写的分布式软件项目,用来实现OpenStack中的虚拟网络服务,实现软件定义网络。

Neutron北向有自己的REST API,中间有自己的业务逻辑层,有自己的DB和进程之间通讯的消息机制。同时Neutron常见的进程包括Neutron-server和Neutron-agent,分布式部署在不同的操作系统。

在这里插入图片描述

neutron的入口

pbr -python 合理编译工具
这是一个一致的管理python setuptools 的工具库。
pbr模块读入setup.cfg文件的信息,并且给setuptools 中的setup hook 函数填写默认参数
python库的基本信息(作者、联系方式、当前库的版本等)

需要打包的文件
依赖包安装与版本管理
python环境限制
生成脚本
c/c++ 拓展
cmdclass自定义命令行为

neutron事件

neutron-server = neutron.cmd.eventlet.server:main_wsgi_eventlet

Web服务器网关接口(Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
在这里插入图片描述

  1. Neutron-sever可以理解为类似于nova-api那样的一个专门用来接收API调用的组件,负责将不同的api发送到不同Neutron
    plugin。
  2. Neutron-plugin可以理解为不同网络功能实现的入口,接收server发来的API,向database完成一些注册信息。然后将具体要执行的业务操作和参数通知给对应的agent来执行。
  3. Agent就是plugin在设备上的代理,接受相应的plugin通知的业务操作和参数,并转换为具体的命令行操作。

neutron-server中的RPC
neutron_rpc = service.serve_rpc()
方法的实现代码(目录:neutron/neutron/service.py)如下

def serve_rpc():plugin = manager.NeutronManager.get_plugin()service_plugins = (manager.NeutronManager.get_service_plugins().values())if cfg.CONF.rpc_workers < 1:cfg.CONF.set_override('rpc_workers', 1)if not plugin.rpc_workers_supported():LOG.debug("Active plugin doesn't implement start_rpc_listeners")if 0 < cfg.CONF.rpc_workers:LOG.error(_LE("'rpc_workers = %d' ignored because ""start_rpc_listeners is not implemented."),cfg.CONF.rpc_workers)raise NotImplementedError()try:rpc = RpcWorker(service_plugins)LOG.debug('using launcher for rpc, workers=%s', cfg.CONF.rpc_workers)session.dispose()launcher = common_service.ProcessLauncher(cfg.CONF, wait_interval=1.0)launcher.launch_service(rpc, workers=cfg.CONF.rpc_workers)if (cfg.CONF.rpc_state_report_workers > 0 andplugin.rpc_state_report_workers_supported()):rpc_state_rep = RpcReportsWorker([plugin])LOG.debug('using launcher for state reports rpc, workers=%s',cfg.CONF.rpc_state_report_workers)launcher.launch_service(rpc_state_rep, workers=cfg.CONF.rpc_state_report_workers)return launcherexcept Exception:with excutils.save_and_reraise_exception():LOG.exception(_LE('Unrecoverable error: please check log for ''details.'))

其中,RpcWorker(plugin)主要通过调用plugin的方法来创建rpc服务端,最重要的工作是调用plugin的start_rpc_listeners来监听消息队列:

在neutron.plugin.ml2.plugin.ML2Plugin类中,该方法创建了一个topic为topics.PLUGIN的消费rpc。

def start_rpc_listeners(self):self.endpoints = [rpc.RpcCallbacks(self.notifier, self.type_manager),agents_db.AgentExtRpcCallback()]self.topic = topics.PLUGINself.conn = n_rpc.create_connection(new=True)self.conn.create_consumer(self.topic, self.endpoints,fanout=False)return self.conn.consume_in_threads()

1.neutron-agent中的RPC
在dhcp_agent、l3_agent、metadata_agent,metering_agent的main函数中都存在一段创建一个rpc服务端的代码,下面以dhcp_agent为例。

def main():register_options(cfg.CONF)common_config.init(sys.argv[1:])config.setup_logging()server = neutron_service.Service.create(binary='neutron-dhcp-agent',topic=topics.DHCP_AGENT,report_interval=cfg.CONF.AGENT.report_interval,manager='neutron.agent.dhcp.agent.DhcpAgentWithStateReport')service.launch(cfg.CONF, server).wait()

最核心的,也是跟rpc相关的部分包括两部分,首先是创建rpc服务端。

server = neutron_service.Service.create(binary='neutron-dhcp-agent',topic=topics.DHCP_AGENT,report_interval=cfg.CONF.AGENT.report_interval,manager='neutron.agent.dhcp.agent.DhcpAgentWithStateReport')

该代码实际上创建了一个rpc服务端,监听指定的topic并运行manager上的tasks。

create()方法返回一个neutron.service.Service对象,neutron.service.Service继承自neutron.common.rpc.Service类。

首先看neutron.common.rpc.Service类,该类定义了start方法,该方法主要完成两件事情:一件事情是将manager添加到endpoints中;一件是创建rpc的consumer,分别监听topic的队列消息。

而在neutron.service.Service类中,初始化中生成了一个manager实例(即neutron.agent.dhcp_agent.DhcpAgentWithStateReport);并为start方法添加了周期性执行report_state方法和periodic_tasks方法。report_state方法没有具体实现,periodic_tasks方法则调用manager的periodic_tasks方法。

manager实例(即neutron.agent.dhcp_agent.DhcpAgentWithStateReport)在初始化的时候首先创建一个rpc的client端,通过代码

2.neutron-plugin中的RPC

主要对ML2Plugin进行分析,包括两个类:RpcCallbacks和AgentNotifierApi。

RpcCallbacks:负责当agent往plugin发出rpc请求时候,plugin实现请求的相关动作,除了继承自父类(dhcp rpc、dvr rpc、sg_db rpc和tunnel rpc)中的方法,还包括get_port_from_device、get_device_details、get_devices_details_list、update_device_down、update_device_up、get_dvr_mac_address_by_host、get_compute_ports_on_host_by_subnet、get_subnet_for_dvr等方法。

AgentNotifierApi:负责当plugin往agent发出rpc请求(plugin通知agent)的时候,plugin端的方法。

def start_rpc_listeners(self):"""RpcCallbacks中实现的方法:Start the RPC loop to let the plugin communicate with agents."""self._setup_rpc()self.topic = topics.PLUGINself.conn = n_rpc.create_connection(new=True)self.conn.create_consumer(self.topic, self.endpoints, fanout=False)return self.conn.consume_in_threads()

创建一个通知rpc的客户端,用于向OVS的agent发出通知。所有plugin都需要有这样一个发出通知消息的客户端,创建了一个OVS agent的通知rpc客户端。之后,创建两个跟service agent相关的consumer,分别监听topics.PLUGIN
在这里插入图片描述
ovs_neutron_agent也会创建RPC的consumer,用来监听topics.UPDATE、topics.DELETE等操作。

NOVA实例调度

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这篇关于【星海随笔】SDN neutron (一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386410

相关文章

cpp随笔——浅谈右值引用,移动语义与完美转发

右值引用 什么是右值 在cpp11中添加了一个新的类型叫做右值引用,记作&&,而在开始今天的正文之前我们先来看一下什么是左值什么是右值: 左值(&):存储在内存中,有明确存储地址的数据右值(&&):临时对象,可以提供数据(不可取地址访问) 而在cpp11中我们可以将右值分为两种: 纯右值:非引用返回的临时变量,比如运算表达式产生的临时变量,原始字面量以及lambda表达式等将亡值:与右值

随笔(一点感悟

听说要成为真正的强者,就要承受七重的孤独,于我而言,大抵确实如此,现在我的生活就是不断的进步不断地进步,我舍弃掉了99%占据我时间对我长期发展无益的事了,我在不断的磨练自己的精神与身体。在我很弱不知道如何进步的时候,我总是幻想一个强者是怎样怎样的,当我真正走上这条路的时候,我才明白,强者之所以是强者,那是因为它们每一天都比昨天的自己强,这才是一个真正的强者最需要的品质,无论先天差异有多大,磨练到最

工作第三周:之前的随笔

1:几个需求 1.1:假如我们只有两个activity,如何实现界面跳转1.2:okhttp支持HTTPS怎么配置1.3:activity管理栈的好处1.4:状态的标识,杜绝用true,false2: 什么是4k对齐,android打包过程术3:如何判断某个view是否是在界面可见 几个需求: 假如我们只有两个activity,如何实现界面跳转        假如界面现在需要只能有两个act

rust函数指针和闭包异同探索随笔

//rust需要在编译时确定某个类型的值究竟会占据多少内存,而且同一类型的所有值都必须使用相同大小的内存,否则编译无法进行。 //对于DST动态大小类型在编译器期间无法得知其确切大小,所以直接定义此种类型的变量,rust编译无法通过! //那么如何应对?基本上采用:引用、智能指针、impl等方式即可解决。 //rust函数是一等公民,当然可以作为参数传递存储返回。 //rust函数指针fn

车联网随笔

车联网随笔 互联网时代让事物充满无限的可能2G/3G/4G时代以TBOX为代表的一系列具备联网功能的车载智能硬件远程控制远程启动数据采集自定义场景(落水或碰撞熄火后自动开启车窗解锁车门)行车记录仪语音助手......5G时代车联网产品形态变得更为丰富CAN总线向以太网升级V2X产生的海量数据(大数据:数据处理,数据分析)视频(视频图像处理识别检测)音频(音频处理特征检测识别)人工智能(机器学

【Linux】CentOS 7 安装配置 postfix 邮件服务器随笔

本文并不是完整配置教程,只是配置过程中零散代码随笔,不成系统 记录配置 PostFix 邮件服务器过程,由于经常用到,会不定时更新完善 yum install -y postfix dovecot cyrus-sasl-plain cyrus-sasl mailx# 设置hostnamehostnamectl set-hostname mail.i7do.comcat /etc/hostn

面向对象的JS随笔

Scoping 全局与局部 全局变量可用在所有环境中,局部变量只可用在局部 js中连接变量至一个从未声明的变量,后面的变量自动提升成一个全局变量(不要这样用,不易阅读) 只有function(){中才算局部} var makearray=fuction(){ return[]; }; var array1=makearray(); var arr

postgreSQL随笔-总结一下PG的查询流程

客户端发起查询请求 客户端与服务进程进行通信中有两个关键的共享缓冲区: PgRecvBuffer:存储服务端接收请求,默认8192字节PqSendBuffer:存储服务端发送请求,默认8192字节 客户端与服务进程之间存在两种连接方式:网络连接与本地访问;根据这两种不同的连接方式,PG可以获取客户端发送的请求,这时查询的命令将会被保存到inBuf里。 static intReadComm

PostgreSQL随笔-对象标识符OID

总览 在PostgreSQL中,对象标识符OID用来在整个数据集簇(initdb初始化的数据存储区即为数据集簇)中唯一地标识一个数据库中的对象,这个对象可以是数据库、表、索引、视图、元祖、类型等。PostgreSQL内置了Oid类型表示OID,它本身时一个无符号整数。 分配策略 通常从1开始首先一部分分配给了系统表相关的对象(如元祖、索引等),此外为了扩展会保留一般部分OID,可以从系统表对