【星海随笔】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 and
            plugin.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 launcher
    except 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.PLUGIN
        self.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.PLUGIN
    self.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实例调度

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/129473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强化学习 - 策略梯度(Policy Gradient)

引言 强化学习常见的方法为基于值函数或者基于策略梯度。 值函数&#xff1a;值函数最优时得到最优策略&#xff0c;即状态s下&#xff0c;最大行为值函数maxQ(s,a)对应的动作。 但对于机器人连续动作空间&#xff0c;动作连续时&#xff0c;基于值函数&#xff0c;存在以下问…

C语言C位出道心法(五):内存管理

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体|结构体指针|链表 C语言C位出道心法(三):共用体|枚举 C语言C位出道心法(四):文件操作 C语言C位出道心法(五):内存管理 一:C语言内存管理认知 二:C语言中内存堆|栈认知 三:C语言中引用内存丢失认知

秋招进入尾声了,还有哪些公司和岗位可以投递?

24届秋招基本已经进入尾声了&#xff0c;接下来就是秋招补录了&#xff0c;最近在微信群看到一些同学再问哪些公司还在招人的。 在这里跟大家分享一份2024届秋招信息汇总表&#xff0c;目前已更新2000家&#xff0c;不仅有互联网公司&#xff0c;还有外企、国企、各类研究所&am…

使用WinDbg分析CPU100%的问题

在我们软件运行的时候&#xff0c;偶尔会出现CPU占比100%的问题&#xff0c;而且极其不容易排查&#xff0c;概率极低&#xff0c;我硬是操作了一个下午&#xff0c;出现了一次&#xff0c;然后找到了dmp文件&#xff0c;也没有任何的规律&#xff0c;那么就可以借助windbg进行…

轻松下载网页音频和视频

在网页上看到好看的视频或者听到的音乐想保存&#xff0c;让我来教你&#xff08;仅供学习&#xff09; 注意&#xff1a;有极少部分的网站视频经过加密&#xff0c;无法下载 一、视频下载 1.打开视频网页 2.右键“检查” 3.刷新网页 4.按照下图中步骤操作 5.把复制的链接放…

如何利用产品帮助中心提升用户体验

在当今竞争激烈的市场中&#xff0c;提供优秀的用户体验是吸引和保留客户的关键。而一个高效和易于使用的产品帮助中心&#xff0c;正成为越来越多企业用以提升用户体验的重要工具。产品帮助中心是一个集中的信息库&#xff0c;为用户提供关于产品功能、故障排除、常见问题解答…

11.10

.text .global _start _start: 1.RCC时钟使能GPIOE RCC_MP_AHB4ENSETR[4]->1 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) ORR R1,R1,#(0x1<<1) STR R1,[R0] 2.设置PE10为输出模式 GPIOE_MODER[21:20]->01 先清0 LDR R0,0x50006000 LDR R1,[R0]…

思科C9300交换机堆叠

思科C9300交换机堆叠仅支持同质堆叠&#xff0c;即仅以Cisco Catalyst 9300系列交换机作为堆叠成员的Cisco Catalyst 930O系列交换机堆叠。需要专用电缆&#xff0c;除数据交接支持堆叠外&#xff0c;还支持电源的堆叠。 在所有交换机上运行命令 "switch convert mode sta…

金融帝国实验室(Capitalism Lab)官方正版游戏『最新销售政策』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2023双11特卖」 ■优惠时限&#xff1a;2023.11.01&#xff5e;11.30 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&am…

如何在苹果iOS系统ipa应用中获取当前版本号和Bundle ID

在iOS应用开发过程中&#xff0c;了解如何获取和使用应用的当前版本号、Bundle ID和其他相关信息是至关重要的。无论是在应用内显示这些信息&#xff0c;还是在编写一些版本依赖的逻辑时&#xff0c;掌握这些知识点都将帮助开发者进行更有效的管理和维护。本文将详细介绍如何在…

数据分析是什么?

第一章- 数据分析是什么 数据分析是指 根据分析目的&#xff0c;用适当的分析方法及工具&#xff0c;对数据进行分析&#xff0c;提取有价值的信息&#xff0c;形成有效结论的过程。 数据分析的作用 通过观察数据&#xff0c;知道当前发生什么&#xff1f;通过具体的数据拆解…

Matplotlib数据可视化综合应用Matplotlib图形配置在线闯关_头歌实践教学平台

Matplotlib数据可视化综合应用图形配置 第1关 配置颜色条第2关 设置注释第3关 自定义坐标刻度第4关 配置文件与样式表 第1关 配置颜色条 任务描述 本关任务&#xff1a;使用colorbar绘制一个热成像图。 编程要求 在右侧编辑器Begin-End处补充代码&#xff0c;根据输入数据绘制…

【编程语言发展史】Go语言的发展历史

目录 Go的起源 Go语言发展时间轴 logo Go的起源 Go 语言起源 2007 年&#xff0c;并于 2009 年正式对外发布。它从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目&#xff0c;即相关员工利用 20% 的空余时间来参与 Go 语言的研发工作。该项目的三位领导者均是著名的 …

3 Paimon数据湖中的表类型详解

更多Paimon数据湖内容请关注&#xff1a;https://edu.51cto.com/course/35051.html Paimon中支持多种表类型&#xff0c;下面我们来看一下。 3.1 全局维度 首先从全局维度来看&#xff0c;Paimon中的表类型可以大致划分为4种&#xff1a; 内部表、外部表、分区表和临时表。 …

接收表单数据

如果您尝试按下提交按钮&#xff0c;浏览器将显示“Method Not Allowed”错误。这是因为到目前为止&#xff0c;前一节中的登录视图函数完成了一半的工作。它可以在网页上显示表单&#xff0c;但是还没有逻辑来处理用户提交的数据。这是Flask-WTF使工作变得非常简单的另一个领域…

Python语法基础(字符串 列表 元组 字典)

目录 字符串(str)字符串的创建特殊情况字符串的转义字符字符串的运算符字符串常用方法求字符串长度去掉多余空格是否包含某子串分割字符串合并字符串替换字符串统计统计字符串出现的次数 练习&#xff1a;判断字符串是否为回文串 列表(list)列表的创建列表常用方法遍历列表列表…

redis配置文件详解

一、配置文件位置 以配置文件启动 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf ( Windows名为redis.windows. conf) 例: # 这里要改成你自己的安装目录 cd ./redis-6.0.8 vim redis.conf redis对配置文件对大小写不敏感 二、配置文件 1、获取当前服务的…

2023.11.10联赛 T4题解

题目大意 题目思路 我们考虑分块处理。 我们可以维护一个状态&#xff0c;表示块内每个字母对应的真实字母&#xff0c;因为只有 3 3 3个字母&#xff0c;所以只有 6 6 6种情况。 对于每一个块&#xff0c;我们可以对于每种状态、每种块&#xff0c;预处理出以 A A A或 B B …

文件缓存的读写

文件系统的读写&#xff0c;其实就是调用系统函数 read 和 write。下面的代码就是 read 和 write 的系统调用&#xff0c;在内核里面的定义。 SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) {struct fd f fdget_pos(fd); ......loff_t pos f…

sjvisualizer,一个超强的Python数据可视化动画库

大家好&#xff0c;今天给大家介绍一个非常棒的数据可视化库&#xff0c;sjvisualizer。 根据时间序列数据制作动态图表&#xff0c;包含条形图、饼图、堆叠条形图、折线图、堆叠面积图。 可以先看一下官方的示例~ 只需几行代码&#xff0c;就可以制作电脑浏览器发展史的动态…