jjzjj

SRv6实践项目(五):ONOS控制平面实现控制

a1164520408 2024-02-28 原文

在先前的几个小结中,一共了解了:

  • p4的编译过程
  • p4runtime的实现原理
  • NDP协议的简单工作流程
  • YANG模型的定义以及用处
  • 基于YANG的配置和状态的读写

一共实现了:

  • Mininet拓扑创建
  • p4的基本框架编写
  • 对数据平面进行订阅以实现状态读取
  • 对数据平面进行进行配置操作
  • 对数据平面的p4交换机进行流表操作

1 ONOS的介绍

在本文中,我们将进一步的介绍ONOS作为控制平面的工作原理:

 让我们打开docker -compose.yml可以看见ONOS的应用程序有哪些

- ONOS_APPS=gui2,drivers.bmv2,lldpprovider,hostprovider

首先make restart,当我们打开的时候,启动了ONOS控制平面,控制平面集成了几个重要功能:

  1. gui2: ONOS的用户界面
  2. drivers.bmv2: 基于 P4Runtime, gNMI, and gNOI的BMv2/Stratum驱动,stratum中最下层就是bmv2,然后第二层就是它提供的P4RT,gNMI,gNOI,因此在ONOS中需要在协议上一一对应他们的驱动实现,双方以gRPC交流(gNMI/gNOI作为交换机的配置/操作接口)
  3. lldpprovider: 基于LLDP的链路发现运用
  4. hostprovider: 主机发现运用

这是Stratum与ONOS在网络的云原生的一些运用,来源云原生视角下的开放网络 | SDNLAB | 专注网络创新技术

这是对ONOS的一些基本介绍:来源:SDN系统方法 | 3. 基本架构 - 掘金 (juejin.cn)

Stratum在交换机与外部世界的所有交互中起到中介作用,包括加载P4编译器生成的目标文件,该文件定义了数据平面和控制平面之间的契约。契约有效的用自动生成的规范替换了OpenFlow的流规则抽象。其他Stratum管理API定义如下:

  • P4Runtime: 控制转发行为的运行时接口,是填充转发表和操作转发表状态的关键。P4Runtime独立于任何特定P4程序,并且与底层硬件无关。这与OpenFlow形成了鲜明对比,OpenFlow对转发模型以及如何与控制平面交互有着相当明确的规定。(为了完整起见,图15还列出了OpenFlow作为另一个控制接口。)
  • gNMI(gRPC Network Management Interface): 用于设置和检索配置状态。gNMI通常与OpenConfig YANG模型配对,后者定义配置和状态树的结构。
  • gNOI(gRPC Network OperationsInterfaces): 用于设置和检索运行状态,如证书管理、设备测试、软件升级、组网故障处理等。

我们基于ONOS(开放网络操作系统, Open Network Operating System) 这一特定网络操作系统作为范例来完整描述这一概念,ONOS在性能、可伸缩性和可用性方面是最好的。简单来说,ONOS负责三件事情:

  • 管理拓扑(Managing Topology): 跟踪网络基础设施及其互联设备,为平台和其他应用程序提供网络环境的共享视图。
  • 管理配置(Managing Configuration): 帮助在多个网络设备上执行、跟踪、回滚和验证原子配置操作。这可以有效反映每个交换机的配置和操作接口(也使用gNMI和gNOI),但是在网络级别而不是设备级别上实现的。
  • 控制交换(Controlling Switches): 控制网络交换机的数据平面数据包处理流水线,并对流水线内的流规则、组、监控等构建块进行后续控制。

使用make onos-cli进入ONOS建立ONOS的连接,并进入命令行:

先看看我们有多少应用程序,有这么多,但是我们总共才4个,其他应用程序时一些驱动应用(org.onosproject.drivers ),以及流水线基础(pipelines.basic )等等

2 ONOS的使用方法

在app文件夹下,有如下几个应用

  • PipeconfLoader.java:一个在应用程序激活时注册pipeconf的组件;
  • InterpreterImpl.java:PipelineInterpreter驱动程序行为的实现;
  • PipelinerImpl.java:Pipeliner驱动程序行为的实现;

我们用make app-build app reload分别build应用程序以及把应用程序装载到ONOS上面,应用程序激活后,您应该会在ONOS日志(make-ons log)中看到以下消息,表明pipeconf已经注册,并且不同的应用程序组件已经启动

在onos指令行键入pipeconfs可以查看流水线的信息:

现在ONOS和Mininet正在运行,是时候让ONOS知道如何到达四个p4交换机并控制它们了,我们通过使用位于mininet/netcfg.json的配置文件来实现这一点,该文件包含以下信息:

  • 与每个Stratum设备相关联的gRPC地址和端口;

  • 用于每个设备的ONOS驱动程序,在这种情况下均为stratum-bmv2;

  • 用于每个设备的pipeconf,在本例中为org.nosproject.ngsdn-tutorial,如PipeconfLoader.java中所定义;
  • 特定于我们的自定义应用程序的配置(fabricDeviceConfig)

我们来看看这个json文件的格式,是这样的,后续再解释应用程序的具体实现:

我们使用make netcfg来将网络配置信息装载到ONOS上,这样就使他发现了交换机了

devices -s就可以发现有这么多的设备

portstats device:spine1 查看设备上的端口信息

flows -s any device:leaf1 查看设备上的流表信息

有关SRv6实践项目(五):ONOS控制平面实现控制的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  6. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  7. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  8. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  9. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  10. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

随机推荐