gNMI 流媒体

您可以使用 gRPC 网络管理接口 (gNMI) 从 Cumulus Linux 收集系统资源、接口和计数器信息,并将其导出到您自己的 gNMI 客户端。

配置 gNMI 代理

netq-agent 软件包包含 gNMI 代理,默认情况下禁用它。要启用 gNMI 代理,请执行以下操作

 cumulus@switch:~$ sudo systemctl enable netq-agent.service
 cumulus@switch:~$ sudo systemctl start netq-agent.service
 cumulus@switch:~$ netq config add agent gnmi-enable true

gNMI 代理监听端口 9339。如果您在另一个应用程序中使用该端口,可以更改默认端口。/etc/netq/netq.yml 文件存储配置。

使用以下命令调整设置

  1. 禁用 gNMI 代理

    cumulus@switch:~$ netq config add agent gnmi-enable false
    
  2. 更改 gNMI 代理监听的默认端口

    cumulus@switch:~$ netq config add agent gnmi-port <gnmi_port>
    
  3. 重启 NetQ 代理以应用配置更改

    cumulus@switch:~$ netq config restart agent
    

gNMI 代理依赖于它从 NVUE 服务收集的数据。为了使用 gNMI 进行完整的数据收集,您必须启用 NVUE 服务。要检查 nvued 服务的状态,请运行 sudo systemctl status nvued.service 命令

cumulus@switch:mgmt:~$ sudo systemctl status nvued.service
● nvued.service - NVIDIA User Experience Daemon
   Loaded: loaded (/lib/systemd/system/nvued.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2023-03-09 20:00:17 UTC; 6 days ago

如果需要,启用并启动服务

cumulus@switch:mgmt:~$ sudo systemctl enable nvued.service
cumulus@switch:mgmt:~$ sudo systemctl start nvued.service

仅使用 gNMI 代理

NVIDIA 建议您同时使用 gNMI 和 NetQ 代理收集数据。但是,如果您不想同时使用这两个代理收集数据,或者您没有将数据流式传输到 NetQ,则可以禁用 NetQ 代理。然后,Cumulus Linux 仅将数据发送到 gNMI 代理。

要禁用 NetQ 代理

cumulus@switch:~$ netq config add agent opta-enable false

您不能同时禁用 NetQ 和 gNMI 代理。如果您在 Cumulus Linux 上同时启用这两个代理,并且 NetQ 服务器不可访问,则交换机不会从以下模型向 gNMI 发送数据

  • openconfig-interfaces
  • openconfig-if-ethernet
  • openconfig-if-ethernet-ext
  • openconfig-system
  • nvidia-if-ethernet-ext

WJH、openconfig-platformopenconfig-lldp 数据在此状态下继续流式传输到 gNMI。如果您仅使用 gNMI 且 NetQ 遥测服务器不存在,请通过将 opta-enable 设置为 false 来禁用 NetQ 代理。

支持的订阅模式

Cumulus Linux 支持以下 gNMI 订阅模式

  • POLL 模式
  • ONCE 模式
  • STREAM 模式,仅支持 ON_CHANGE 订阅

支持的模型

Cumulus Linux 支持以下 OpenConfig 模型

模型支持的数据
openconfig-interfaces名称、Operstatus、AdminStatus、IfIndex、MTU、LoopbackMode、Enabled、计数器(InPkts、OutPkts、InOctets、InUnicastPkts、InDiscards、InMulticastPkts、InBroadcastPkts、InErrors、OutOctets、OutUnicastPkts、OutMulticastPkts、OutBroadcastPkts、OutDiscards、OutErrors)
openconfig-if-ethernetAutoNegotiate、PortSpeed、MacAddress、NegotiatedPortSpeed、计数器(InJabberFrames、InOversizeFrames、InUndersizeFrames)
openconfig-if-ethernet-ext帧大小计数器(InFrames_64Octets、InFrames_65_127Octets、InFrames_128_255Octets、InFrames_256_511Octets、InFrames_512_1023Octets、InFrames_1024_1518Octets)
openconfig-system内存、CPU
openconfig-platform平台数据(名称、描述、版本)
openconfig-lldpLLDP 数据(PortIdType、PortDescription、LastUpdate、SystemName、SystemDescription、ChassisId、Ttl、Age、ManagementAddress、ManagementAddressType、Capability)
模型支持的数据
nvidia-if-wjh-drop-aggregate聚合的 WJH 丢弃,包括第 1 层、第 2 层、路由器、ACL、隧道和缓冲区丢弃
nvidia-if-ethernet-ext扩展以太网计数器(AlignmentError、InAclDrops、InBufferDrops、InDot3FrameErrors、InDot3LengthErrors、InL3Drops、InPfc0Packets、InPfc1Packets、InPfc2Packets、InPfc3Packets、InPfc4Packets、InPfc5Packets、InPfc6Packets、InPfc7Packets、OutNonQDrops、OutPfc0Packets、OutPfc1Packets、OutPfc2Packets、OutPfc3Packets、OutPfc4Packets、OutPfc5Packets、OutPfc6Packets、OutPfc7Packets、OutQ0WredDrops、OutQ1WredDrops、OutQ2WredDrops、OutQ3WredDrops、OutQ4WredDrops、OutQ5WredDrops、OutQ6WredDrops、OutQ7WredDrops、OutQDrops、OutQLength、OutWredDrops、SymbolErrors、OutTxFifoFull)

客户端可以使用以下 YANG 模型作为参考

nvidia-if-ethernet-ext
nvidia-if-wjh-drop-aggregate

使用 gNMI 收集 WJH 数据

您可以将 刚刚发生了什么 (WJH) 数据从 NetQ 代理导出到您自己的 gNMI 客户端。请参阅上面的 nvidia-if-wjh-drop-aggregate 参考 YANG 模型。

支持的功能

gNMI 代理支持 WJH 事件的 CapabilitiesSTREAM 订阅请求。

WJH 丢弃原因

NetQ 发送到 gNMI 代理的数据采用 WJH 丢弃原因的形式。SDK 生成丢弃原因,Cumulus Linux 将它们存储在 /usr/etc/wjh_lib_conf.xml 文件中。使用此文件作为指导,以筛选特定原因类型(L1、ACL 等)、原因 ID 或事件严重性。

第 1 层丢弃原因

原因 ID原因描述
10021端口管理关闭验证端口配置
10022自动协商失败手动设置端口速度,禁用自动协商
10023与对等链路的逻辑不匹配检查电缆或收发器
10024链路训练失败检查电缆或收发器
10025对等设备正在发送远程故障更换电缆或收发器
10026信号完整性不良更换电缆或收发器
10027不支持电缆或收发器使用支持的电缆或收发器
10028电缆或收发器已拔下插入电缆或收发器
10029校准失败检查电缆或收发器
10030电缆或收发器状态不良检查电缆或收发器
10031其他原因其他 L1 丢弃原因

第 2 层丢弃原因

原因 ID原因严重性描述
201MLAG 端口隔离注意预期行为
202目标 MAC 已保留 (DMAC=01-80-C2-00-00-0x)错误从对等设备收到错误的数据包
203VLAN 标记不匹配错误验证链路两端的 VLAN 标记配置
204入口 VLAN 过滤错误验证链路两端的 VLAN 成员配置
205入口生成树过滤器注意预期行为
206单播 MAC 表操作丢弃错误为此目标 MAC 验证 MAC 表
207组播出口端口列表为空警告验证 IGMP 加入或组播路由器端口不存在的原因
208端口环回过滤器错误为此目标 MAC 验证 MAC 表
209源 MAC 是组播错误从对等设备收到错误的数据包
210源 MAC 等于目标 MAC错误从对等设备收到错误的数据包

路由器丢弃原因

原因 ID原因严重性描述
301不可路由的数据包注意预期行为
302黑洞路由警告为此目标 IP 验证路由表
303未解析的邻居或下一跳警告验证邻居或下一跳的 ARP 表
304黑洞 ARP 或邻居警告验证下一跳的 ARP 表
305组播范围 FFx0:/16 中的 IPv6 目标注意预期行为 - 数据包不可路由
306组播范围 FFx1:/16 中的 IPv6 目标注意预期行为 - 数据包不可路由
307非 IP 数据包注意目标 MAC 是路由器,数据包不可路由
308单播目标 IP 但组播目标 MAC错误从对等设备收到错误的数据包
309目标 IP 是环回地址错误从对等设备收到错误的数据包
310源 IP 是组播错误从对等设备收到错误的数据包
311源 IP 在 E 类中错误从对等设备收到错误的数据包
312源 IP 是环回地址错误从对等设备收到错误的数据包
313源 IP 未指定错误从对等设备收到错误的数据包
314校验和或 IPver 或 IPv4 IHL 太短错误不良电缆或从对等设备收到的不良数据包
315组播 MAC 不匹配错误从对等设备收到错误的数据包
316源 IP 等于目标 IP错误从对等设备收到错误的数据包
317IPv4 源 IP 是有限广播错误从对等设备收到错误的数据包
318IPv4 目标 IP 是本地网络 (destination=0.0.0.0/8)错误从对等设备收到错误的数据包
320入口路由器接口已禁用警告验证您的配置
321出口路由器接口已禁用警告验证您的配置
323IPv4 路由表 (LPM) 单播未命中警告为此目标 IP 验证路由表
324IPv6 路由表 (LPM) 单播未命中警告为此目标 IP 验证路由表
325路由器接口环回警告验证接口配置
326数据包大小大于路由器接口 MTU警告验证路由器接口 MTU 配置
327TTL 值太小警告实际路径长于 TTL

隧道丢弃原因

原因 ID原因严重性描述
402Overlay 交换机 - 源 MAC 是组播错误对等设备发送了错误的数据包
403Overlay 交换机 - 源 MAC 等于目标 MAC错误对等设备发送了错误的数据包
404解封装错误错误对等设备发送了错误的数据包

ACL 丢弃原因

原因 ID原因严重性描述
601入口端口 ACL注意验证访问控制列表配置
602入口路由器 ACL注意验证访问控制列表
603出口路由器 ACL注意验证访问控制列表
604出口端口 ACL注意验证访问控制列表

缓冲区丢弃原因

原因 ID原因严重性描述
503尾部丢弃警告监控网络拥塞
504WRED警告监控网络拥塞
505端口 TC 拥塞阈值已超过注意监控网络拥塞
506数据包延迟阈值已超过注意监控网络拥塞

gNMI 客户端请求

您可以使用主机上的 gNMI 客户端来请求代理订阅的功能和数据。以下示例使用 gNMIc 客户端

以下示例显示了针对 WJH 数据的 gNMIc STREAM 请求

gnmic -a 10.209.37.121:9339 -u cumulus -p ****** --skip-verify subscribe --path "wjh/aggregate/l2/reasons/reason[id=209][severity=error]/state/drop" --mode stream --prefix "/interfaces/interface[name=swp8]/" --target netq

{
  "source": "10.209.37.121:9339",
  "subscription-name": "default-1677695197",
  "timestamp": 1677695102858146800,
  "time": "2023-03-01T18:25:02.8581468Z",
  "prefix": "interfaces/interface[name=swp8]/wjh/aggregate/l2/reasons/reason[severity=error][id=209]",
  "target": "netq",
  "updates": [
    {
      "Path": "state/drop",
      "values": {
        "state/drop": "[{\"AggCount\":283,\"Dip\":\"0.0.0.0\",\"Dmac\":\"1c:34:da:17:93:7c\",\"Dport\":0,\"DropType\":\"L2\",\"EgressPort\":\"\",\"EndTimestamp\":1677695102,\"FirstTimestamp\":1677695072,\"Hostname\":\"neo-switch01\",\"IngressLag\":\"\",\"IngressPort\":\"swp8\",\"Proto\":0,\"Reason\":\"Source MAC is multicast\",\"ReasonId\":209,\"Severity\":\"Error\",\"Sip\":\"0.0.0.0\",\"Smac\":\"01:00:5e:00:00:01\",\"Sport\":0}]"
      }
    }
  ]
}
{
  "source": "10.209.37.121:9339",
  "subscription-name": "default-1677695197",
  "timestamp": 1677695132988218890,
  "time": "2023-03-01T18:25:32.98821889Z",
  "prefix": "interfaces/interface[name=swp8]/wjh/aggregate/l2/reasons/reason[severity=error][id=209]",
  "target": "netq",
  "updates": [
    {
      "Path": "state/drop",
      "values": {
        "state/drop": "[{\"AggCount\":287,\"Dip\":\"0.0.0.0\",\"Dmac\":\"1c:34:da:17:93:7c\",\"Dport\":0,\"DropType\":\"L2\",\"EgressPort\":\"\",\"EndTimestamp\":1677695132,\"FirstTimestamp\":1677695102,\"Hostname\":\"neo-switch01\",\"IngressLag\":\"\",\"IngressPort\":\"swp8\",\"Proto\":0,\"Reason\":\"Source MAC is multicast\",\"ReasonId\":209,\"Severity\":\"Error\",\"Sip\":\"0.0.0.0\",\"Smac\":\"01:00:5e:00:00:01\",\"Sport\":0}]"
      }
    }
  ]
}

以下示例显示了针对接口端口速度的 gNMIc ONCE 模式请求

gnmic -a 10.209.37.121:9339 -u cumulus -p ****** --skip-verify subscribe --path "ethernet/state/port-speed" --mode once --prefix "/interfaces/interface[name=swp1]/" --target netq
{
  "source": "10.209.37.123:9339",
  "subscription-name": "default-1677695151",
  "timestamp": 1677256036962254134,
  "time": "2023-02-24T16:27:16.962254134Z",
  "target": "netq",
  "updates": [
    {
      "Path": "interfaces/interface[name=swp1]/ethernet/state/port-speed",
      "values": {
        "interfaces/interface/ethernet/state/port-speed": "SPEED_1GB"
      }
    }
  ]
}

以下示例显示了针对接口状态的 gNMIc POLL 模式请求

gnmic -a 10.209.37.121:9339 -u cumulus -p ****** --skip-verify subscribe --path "state/oper-status" --mode poll --prefix "/interfaces/interface[name=swp1]/" --target netq
{
  "timestamp": 1677644403153198642,
  "time": "2023-03-01T04:20:03.153198642Z",
  "prefix": "interfaces/interface[name=swp1]",
  "target": "netq",
  "updates": [
    {
      "Path": "state/oper-status",
      "values": {
        "state/oper-status": "UP"
      }
    }
  ]
}
received sync response 'true' from '10.209.37.123:9339'
{
  "timestamp": 1677644403153198642,
  "time": "2023-03-01T04:20:03.153198642Z",
  "prefix": "interfaces/interface[name=swp1]",
  "target": "netq",
  "updates": [
    {
      "Path": "state/oper-status",
      "values": {
        "state/oper-status": "UP"
      }
    }
  ]
}