【星海随笔】SDN neutron (一)

【星海随笔】SDN neutron (一)_第1张图片

一、SDN的原理:

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

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

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

二、SDN的架构:

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

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

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

三、SDN的应用场景:

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

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

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

  4. 云计算和数据中心网络:SDN可以为云计算和数据中心网络提供灵活的网络服务和资源管理,实现快速部署和动态调整。
    【星海随笔】SDN neutron (一)_第2张图片

网络虚拟化

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

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

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

【星海随笔】SDN neutron (一)_第3张图片

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应用程序或框架之间的一种简单而通用的接口。
【星海随笔】SDN neutron (一)_第4张图片

  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
【星海随笔】SDN neutron (一)_第5张图片
ovs_neutron_agent也会创建RPC的consumer,用来监听topics.UPDATE、topics.DELETE等操作。

NOVA实例调度

【星海随笔】SDN neutron (一)_第6张图片
【星海随笔】SDN neutron (一)_第7张图片
【星海随笔】SDN neutron (一)_第8张图片

你可能感兴趣的:(php,开发语言)