联机诊断系统 (Online Diagnostic System, ODS) 功能可在运行时自动调试 NSX。ODS 通过内置于 NSX 中的操作手册实现。操作手册包含调试过程,并具有对 NSX 组件的完全可观察性。操作手册会生成调试报告。此外,它还会生成某个问题的运行时工件,例如数据包捕获、用户进程实时核心转储以及脚本和工具的输出。可以稍后收集这些工件,将其用于脱机分析和调试。请注意,您无法修改预定义的操作手册。

您可以使用 API 执行以下操作手册操作:

  • 调用操作手册以启动运行时调试
  • 检查调试报告
  • 下载由调用的操作手册生成的工件
  • 管理操作手册的生命周期

预定义的操作手册

NSX 4.1.1 开始,Unified Appliance (UA) 也支持 ODS。下表列出了操作手册以及可用于运行这些操作手册的节点。

表 1.
操作手册 描述 节点 版本
PnicPerf 此操作手册可以识别 pNIC TX 和 RX 性能问题。

此操作手册可将逻辑端口的 ID 作为输入参数进行诊断。

ESXi 4.1
OverlayTunnel 此操作手册可以确定覆盖网络隧道故障,例如,网关配置错误,隧道丢失、隧道关闭。

此操作手册将源 VTEP 的 IP 地址和目标 VTEP 的 IP 地址作为输入参数。

ESXi 4.1
PortBlock 此操作手册可以识别端口被阻止的原因,例如 DVPort 可能会因为 LSP/LS 配置不正确而被阻止。 ESXi 4.1
AdfCollect 此操作手册通过 ADF 收集器收集 ESXi 数据路径性能数据。

此操作手册将接受以下输入参数:

  • advanced:是否启用高级性能工具。
  • cycle:ADF 收集周期数。
  • interval:连续 ADF 收集周期之间的等待时间间隔(以秒为单位)。
ESXi 4.1
ControllerConn 此操作手册可以识别由控制器故障、代理故障、底层网络中断或 FQDN 解析失败导致的控制器连接问题。

此操作手册将 ESXi 主机的 IP 地址和控制器的 IP 地址作为输入参数。

ESXi 4.1
NxgiPlatform

此操作手册将对 NXGI 平台数据路径中的问题进行诊断,且支持分布式 MPS、端点保护、IDFW、IDS 和 Intelligence 等功能。

此操作手册将功能作为输入参数。这是需要检查或调试的依赖于 NXGI 的特定功能(MPS、IDFW、IDS、EPP 和 Intelligence 之一,默认为 EPP)。

ESXi 4.1.1
VifInfo

此操作手册将获取有关虚拟接口的详细信息,这些信息可用作其他操作手册的输入。

本操作手册将 VIF 作为输入参数。

ESXi 4.1.1
EdgeHealth
本操作手册执行以下功能:
  • 对部署和升级期间发生的常见 Edge 关闭问题进行分类。
  • 提出解决办法,以将 Edge 节点恢复为正常状态并恢复正常运行。

此操作手册没有任何输入参数。

Edge 4.1.1
MacAddressInfo
此操作手册将对与特定 MAC 地址相关的问题进行诊断,并检查和修复主机交换机上的性能问题。它执行以下功能:
  • 提供 MAC 地址和主机交换机后,此操作手册将从主机交换机 MAC 地址表中获取 MAC 地址详细信息(如 MAC、VLAN、VNI 和 portID),并在 MAC 不存在的情况下提供诊断。
  • 对于 VNIC 使用的给定静态 MAC 地址,它还会检索 VNIC 端口的 VLAN 和 VNI 信息。

此操作手册将主机交换机名称和 MAC 地址作为输入参数。

ESXi 4.1.1
EdgeDpBfd

此操作手册将对 NSX Edge BFD 问题进行分类。

此操作手册将 BFD 会话的源 IP 和目标 IP 作为输入参数。它还将捕获功能作为可选参数,以确保仅筛选和捕获特定于会话的 BFD 数据包。

Edge 4.1.1
DistributedMp

此操作手册将验证恶意软件防护服务 (MPS) 管道的运行状况,并诊断 MPS 遇到的任何问题,例如特定虚拟机上的防护措施不起作用或某些文件未被扫描。

此操作手册的输入参数是要进行防护诊断的虚拟机的虚拟机 UUID。

ESXi 4.1.1
DuplicateVtepDetectorProvider

此操作手册可检测 VTEP 中的任何重复 IP 或标签。

此操作手册没有任何输入参数。

UA 4.1.1
LspStaleInfo

此操作手册提取失效的逻辑端口。

此操作手册没有任何输入参数。

UA
BgpNeighborState

此操作手册将对可能导致 BGP 邻居关闭的各种流量进行诊断。此操作手册还会收集以下支持工件以进行脱机调试。

  • BGP 和 BFD 数据包捕获。
  • Ping 和 traceroute 结果。

此操作手册将接受以下输入参数:

  • 对等 IP:这是必需参数,它将接受 BGP 邻居 IP 地址。
  • 逻辑路由器名称:这是必需参数,它将接受由用户配置的逻辑路由器名称。
  • 数据包捕获:这是一个可选参数。如果此参数设置为 True,则该操作手册将捕获 BGP/BFD 数据包。默认情况下,此选项设置为 False。
Edge 4.1.1
PimMrouteState

此操作手册将对由于各种原因而发生的多播流量丢失问题进行分类。

提供多播流量发送方的源 IP 和多播流量的组 IP 后,此操作手册将帮助确定问题的根本原因,并收集相关支持工件以进行脱机调试。

此操作手册将源 IP、组 IP 和流量方向作为输入参数。

Edge 4.1.1
OspfNbrState

此操作手册将通过诊断各种逻辑流量来对 OSPF 邻居状态问题进行分类。

此操作手册将邻居 IP 地址作为输入参数。

Edge 4.1.1
IdpsDpStatus

此操作手册检查 IDPS/IDS 模块(上下文引擎)和 IDPS 引擎的状态。它还会比较 IDPS 模块和 IDPS 引擎模块中加载的配置文件、规则、特征码和捕获的事件。

此操作手册没有任何输入参数。

ESXi 4.1.1
NxgiPlatformUA

此操作手册将对 NXGI 平台的管理平面中的问题进行诊断,且支持分布式 MPS、端点保护、IDFW、IDS、Intelligence 等功能。此操作手册可以与传输节点上运行的 NxgiPlatform 操作手册结合使用。

此操作手册将传输节点 ID 作为可选输入参数。

UA 4.1.1
CorfuServer

此操作手册可检查 Corfu 服务器布局稳定性、基础架构 ping 和磁盘 IO 状况以及压缩器运行状况。

为了覆盖日志事件的默认回溯天数或小时数,此操作手册将回溯天数和回溯小时数作为输入参数。

UA 4.1.1
EdgeIDPS

此操作手册检查并检索 Edge 中存在的 IDS/IPS 特征码的统计信息。

此操作手册将特征码 ID 作为输入参数。

Edge 4.1.1
EdgeRouting

此操作手册将检查给定逻辑路由器运行状况的多个方面,并提供运行状况不佳的 Edge 进程列表。该操作手册针对常见的南北向路由问题提供了故障排除说明。

操作手册收集各种信息,并报告路由协议、隧道和端口的状态。它将对 Edge 上路由操作所用的路由堆栈和各种守护进程执行运行状况检查。对于提供的目标 IP,它将检查 RIB、FIB 和 ARP 表。它还会使用源和目标 IP 来运行 ping 和 traceroute。

此操作手册将接受以下输入参数:
  • 目标/对等 IP:这是必需参数。
  • 源 IP:这是必需参数。源 IP 用于 ping 和 traceroute,并且必须是目标 IP 预期定向到的接口的 IP。
  • 逻辑路由器 (LR) 名称:这是必需参数。这是系统中配置的逻辑路由器名称。
Edge 4.1.1

PimConfigCheck

此操作手册将提供有关在 Edge 抛出 routing_config_error 时失败的确切对象的更多详细信息。它还有助于对问题进行分类。

此操作手册没有任何输入参数。

Edge 4.1.1
NCPPendingPod 此操作手册可对卡在挂起状态的 Pod 进行调试。

此操作手册可将处于挂起状态的 Pod 的命名空间和名称作为输入参数。

ESXi 4.1.2

运行时的调试步骤

要在运行时进行调试,请执行以下步骤:

步骤 1:获取预定义操作手册的列表。

运行以下 API 以获取预定义操作手册的列表。

GET https://<nsx-mgr>/policy/api/v1/infra/sha/pre-defined-runbooks

此 API 会返回预定义操作手册的列表以及以下信息:

  • 配置详细信息。
  • 支持操作手册的节点类型。
  • 操作手册的常规详细信息,例如 ID、名称和路径。
  • 调用操作手册时所需的参数详细信息。

示例响应:

{
    "results": [
        {
            "version": {
                "major": 1,
                "minor": 0
            },
            "default_config": {
                "enabled": true,
                "timeout": 300,
                "threshold_number": 5,
                "throttle_cycle": 10
            },
            "supported_node_types": [
                "nsx-esx"
            ],
            "parameters": [
                {
                    "name": "advanced",
                    "optional": true,
                    "parameter_type": "BOOLEAN",
                    "default_value": "False"
                },
                {
                    "name": "cycle",
                    "optional": false,
                    "parameter_type": "INTEGER",
                    "max": "20",
                    "min": "1"
                },
                {
                    "name": "interval",
                    "optional": true,
                    "parameter_type": "INTEGER",
                    "max": "300",
                    "min": "1"
                }
            ],
            "resource_type": "OdsPredefinedRunbook",
            "id": "00000000-0000-4164-6643-6f6c6c656374",
            "display_name": "AdfCollect",
            "path": "/infra/sha/pre-defined-runbooks/00000000-0000-4164-6643-6f6c6c656374",
            "relative_path": "00000000-0000-4164-6643-6f6c6c656374",
            "parent_path": "/infra",
            "remote_path": "",
            "unique_id": "069a4c7b-532a-4926-a402-6a7986a306b2",
            "realization_id": "069a4c7b-532a-4926-a402-6a7986a306b2",
            "owner_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "origin_site_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "marked_for_delete": false,
            "overridden": false,
            "_create_time": 1669600880454,
            "_create_user": "system",
            "_last_modified_time": 1669600880454,
            "_last_modified_user": "system",
            "_system_owned": false,
            "_revision": 0
        },
        {
            "version": {
                "major": 1,
                "minor": 0
            },
            "default_config": {
                "enabled": true,
                "timeout": 60,
                "threshold_number": 5,
                "throttle_cycle": 3
            },
            "supported_node_types": [
                "nsx-esx"
            ],
            "resource_type": "OdsPredefinedRunbook",
            "id": "0000436f-6e74-726f-6c6c-6572436f6e6e",
            "display_name": "ControllerConn",
            "path": "/infra/sha/pre-defined-runbooks/0000436f-6e74-726f-6c6c-6572436f6e6e",
            "relative_path": "0000436f-6e74-726f-6c6c-6572436f6e6e",
            "parent_path": "/infra",
            "remote_path": "",
            "unique_id": "3914cbe4-41b4-45f1-9dad-2bd96a2de0d8",
            "realization_id": "3914cbe4-41b4-45f1-9dad-2bd96a2de0d8",
            "owner_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "origin_site_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "marked_for_delete": false,
            "overridden": false,
            "_create_time": 1669600880493,
            "_create_user": "system",
            "_last_modified_time": 1669600880493,
            "_last_modified_user": "system",
            "_system_owned": false,
            "_revision": 0
        },
        {
            "version": {
                "major": 1,
                "minor": 0
            },
            "default_config": {
                "enabled": true,
                "timeout": 120,
                "threshold_number": 5,
                "throttle_cycle": 5
            },
            "supported_node_types": [
                "nsx-esx"
            ],
            "parameters": [
                {
                    "name": "src",
                    "optional": false,
                    "parameter_type": "COMPOUND"
                },
                {
                    "name": "dst",
                    "optional": false,
                    "parameter_type": "COMPOUND"
                }
            ],
            "resource_type": "OdsPredefinedRunbook",
            "id": "0000004f-7665-726c-6179-54756e6e656c",
            "display_name": "OverlayTunnel",
            "path": "/infra/sha/pre-defined-runbooks/0000004f-7665-726c-6179-54756e6e656c",
            "relative_path": "0000004f-7665-726c-6179-54756e6e656c",
            "parent_path": "/infra",
            "remote_path": "",
            "unique_id": "3597af28-e670-456e-8347-4d1a53a5cb90",
            "realization_id": "3597af28-e670-456e-8347-4d1a53a5cb90",
            "owner_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "origin_site_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "marked_for_delete": false,
            "overridden": false,
            "_create_time": 1669600880518,
            "_create_user": "system",
            "_last_modified_time": 1669600880518,
            "_last_modified_user": "system",
            "_system_owned": false,
            "_revision": 0
        },
        {
            "version": {
                "major": 1,
                "minor": 0
            },
            "default_config": {
                "enabled": true,
                "timeout": 120,
                "threshold_number": 5,
                "throttle_cycle": 5
            },
            "supported_node_types": [
                "nsx-esx"
            ],
            "parameters": [
                {
                    "name": "lsp",
                    "optional": false,
                    "parameter_type": "STRING"
                }
            ],
            "resource_type": "OdsPredefinedRunbook",
            "id": "00000000-0000-0000-506e-696350657266",
            "display_name": "PnicPerf",
            "path": "/infra/sha/pre-defined-runbooks/00000000-0000-0000-506e-696350657266",
            "relative_path": "00000000-0000-0000-506e-696350657266",
            "parent_path": "/infra",
            "remote_path": "",
            "unique_id": "53f29b77-dcf5-4561-85ec-8f35280e3f3a",
            "realization_id": "53f29b77-dcf5-4561-85ec-8f35280e3f3a",
            "owner_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "origin_site_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "marked_for_delete": false,
            "overridden": false,
            "_create_time": 1669600880553,
            "_create_user": "system",
            "_last_modified_time": 1669600880553,
            "_last_modified_user": "system",
            "_system_owned": false,
            "_revision": 0
        },
        {
            "version": {
                "major": 1,
                "minor": 0
            },
            "default_config": {
                "enabled": true,
                "timeout": 60,
                "threshold_number": 5,
                "throttle_cycle": 3
            },
            "supported_node_types": [
                "nsx-esx"
            ],
            "parameters": [
                {
                    "name": "vif",
                    "optional": false,
                    "parameter_type": "STRING"
                }
            ],
            "resource_type": "OdsPredefinedRunbook",
            "id": "00000000-0000-0050-6f72-74426c6f636b",
            "display_name": "PortBlock",
            "path": "/infra/sha/pre-defined-runbooks/00000000-0000-0050-6f72-74426c6f636b",
            "relative_path": "00000000-0000-0050-6f72-74426c6f636b",
            "parent_path": "/infra",
            "remote_path": "",
            "unique_id": "6f411a92-30c0-4838-9758-c00220cb5fab",
            "realization_id": "6f411a92-30c0-4838-9758-c00220cb5fab",
            "owner_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "origin_site_id": "f2a2a9e1-2578-435d-877d-47e01eb04954",
            "marked_for_delete": false,
            "overridden": false,
            "_create_time": 1669600880572,
            "_create_user": "system",
            "_last_modified_time": 1669600880572,
            "_last_modified_user": "system",
            "_system_owned": false,
            "_revision": 0
        }
    ],
    "result_count": 5,
    "sort_by": "display_name",
    "sort_ascending": true
}
在上述响应中,返回了以下预定义的操作手册。
  • AdfCollect
  • ControllerConn
  • OverlayTunnel
  • PnicPerf
  • PortBlock

    如果操作手册在调用时需要参数,则会在 parameters 键中指定参数详细信息。例如,覆盖网络隧道操作手册需要两个参数,即 sourcedestination,它们是要诊断的隧道的本地和远程 VTEP IP。

步骤 2:调用操作手册。

运行以下 API 以调用操作手册。

POST https://<nsx-mgr>/policy/api/v1/infra/sha/runbook-invocations/<invoke-name>

示例请求:调用覆盖网络隧道操作手册。

POST https://<nsx-mgr>/policy/api/v1/infra/sha/runbook-invocations/OverlayTunnel
{
    "runbook_path": "/infra/sha/pre-defined-runbooks/0000004f-7665-726c-6179-54756e6e656c",
    "target_node": "6c7a9374-459d-46b2-9ea6-c63b37c7cc38",
    "arguments": [
        {
            "key": "src",
            "value": "192.168.0.11"
        },
        {
            "key": "dst",
            "value": "192.168.0.10"
        }
    ]
}
target_node 可以是主机节点、Edge 节点或 Unified Appliance 节点。

可通过以下 API 获取主机或 Edge 的 ID。

https://{{MANAGER_IP}}/api/v1/transport-nodes

可通过集群 API 获取设备 ID 列表。有效 ID 是具有管理员角色的设备的外部 ID。

https://{{MANAGER_IP}}/api/v1/cluster/nodes
步骤 3:检查调用的操作手册的报告。

运行以下 API 以获取调用的操作手册的报告。

GET https://<nsx-mgr>/policy/api/v1/infra/sha/runbook-invocations/<invoke-name>/report

示例请求:

GET https://<nsx-mgr>/policy/api/v1/infra/sha/runbook-invocations/OverlayTunnel/report

示例响应:

{
    "invocation_id": "70527fed-1e5e-4fed-a880-28cde04a66b1",
    "target_node": "6c7a9374-459d-46b2-9ea6-c63b37c7cc38",
    "timestamp": 1662469099,
    "sys_info": {
        "host_name": "sc2-10-185-4-158.eng.vmware.com",
        "os_name": "VMkernel",
        "os_version": "7.0.3"
    },
    "result_message": "Tunnel 192.168.0.11 -> 192.168.0.10 is in up state",
    "recommendation_message": "No changes required as the tunnel is in up state.",
    "step_details": [
        {
            "step_id": 1,
            "action_summary": "Check the status of tunnel for the given source/destination VTEPs.",
            "action_result": "Tunnel 192.168.0.11 -> 192.168.0.10 is in state up"
        }
    ],
    "status": {
        "request_status": "SUCCESS",
        "operation_state": "FINISHED"
    }
}

响应会返回一些元数据信息,例如时间戳以及主机名和操作系统等系统详细信息。报告还会返回调试结果、修复建议(如果有)、为调试而执行的步骤,以及每个步骤的操作摘要和操作结果。如果调试因任何原因而中断,则 operation_state 字段将保留一个值以定义中断原因。如果操作手册调用不成功,报告将提供错误详细信息,而不会显示调试相关字段。

步骤 4:下载工件。
  1. 运行以下 API 以收集工件。

    POST https://{{mgr-ip}}/policy/api/v1/infra/sha/runbook-invocations/{{invocation-name}}

    示例请求:
    POST https://{{mgr-ip}}/policy/api/v1/infra/sha/runbook-invocations/{{invocation-name}}
    {
        "runbook_path": "/infra/sha/pre-defined-runbooks/00000000-0000-4164-6643-6f6c6c656374",
        "target_node": "{{target-node}}",
        "arguments": [
            {
                "key": "advanced",
                "value": "{{advanced-mode}}"
            },
            {
                "key": "cycle",
                "value": "{{cycle-count}}"
            },
            {
                "key": "interval",
                "value": "{{interval-in-sec}}"
            }
        ]
    }

    如果在调用时将 advanced 参数设置为 false,则操作手册将收集拓扑信息、网络统计信息、NSX DP 统计信息和上行链路信息。如果将 advanced 参数设置为 true,则操作手册将额外运行高级性能工具,例如 vmkstats(仅在物理机上可用)。

    cycle 参数定义在调用中执行 ADF 收集器的次数。

    interval 参数定义连续 ADF 收集器执行之间的等待时间间隔。只有在将 cycle 参数设置为大于 1 时,该参数才会生效。

    示例响应:

    {
        "invocation_id": "80a0037a-52e1-48d7-b28e-c3bfb8475e8c",
        "target_node": "b794f78f-7eb0-433f-8f11-63e6b3121c28",
        "timestamp": 1668674073,
        "sys_info": {
            "host_name": "sc2-rdops-vm06-dhcp-204-101.eng.vmware.com",
            "os_name": "VMkernel",
            "os_version": "7.0.3"
        },
        "result_message": "ADF data collection runbook completes.",
        "recommendation_message": "No action needs to be taken.",
        "step_details": [
            {
                "step_id": 1,
                "action_summary": "Run ADF collector.",
                "action_result": "ADF data collection is successfully performed in the following time point(s) along with the following artifact(s): [(2022-11-17 08:35:30, a44f0446-0ac3-4e7f-8513-fb1248985d9e.tar)]",
                "artifacts": [
                    "a44f0446-0ac3-4e7f-8513-fb1248985d9e"
                ]
            }
        ],
        "status": {
            "request_status": "SUCCESS",
            "operation_state": "FINISHED"
        }
    }
  2. 运行以下 API 以下载工件。

    GET https://<nsx-mgr>/policy/api/v1/infra/sha/runbook-invocations/<invoke-name>/artifact

如果操作手册生成了工件,该 API 将返回捆绑文件,否则将返回一条错误消息。将二进制响应保存到 tar.gz 文件。此文件包含操作手册调用报告(采用 JSON 格式)以及执行的 ADF 收集的 tar 文件。

更改操作手册配置

首先创建一个传输节点 (TN) 组,然后将一个操作手册配置文件绑定到该组。如果更改操作手册的配置,则会在操作手册配置文件绑定到的所有节点上进行相应更改。您可以配置是否启用操作手册、调试超时以及可以使用限制周期机制调用操作手册的频率。限制周期机制将指定在特定时间内可以执行操作手册的次数。

请注意,一个操作手册只能有一个配置文件,但根据节点所属的 TN 组,一个节点可以有多个操作手册配置文件。在这种情况下,将在节点上应用具有最高优先级的配置文件。

要更改操作手册配置,请执行以下步骤:

步骤 1:创建 ESXi 的 TN 组。

运行以下 API 以创建 TN 组。

PATCH https://<nsx-mgr>/policy/api/v1/infra/domains/default/groups/<group-name>

示例请求:

PATCH https://<nsx-mgr>/policy/api/v1/infra/domains/default/groups/<group-name>
{
    "expression": [
        {
            "paths": [
                "/infra/sites/default/enforcement-points/default/host-transport-nodes/TN1"
            ],
            "resource_type": "PathExpression"
        }
    ],
    "extended_expression": [],
    "reference": false,
    "group_type": [],
    "resource_type": "Group"
}
步骤 2:更改操作手册配置文件的配置,并将 TN 组与配置文件绑定。

运行以下 API 以更改配置。

PATCH https://<nsx-mgr>/policy/api/v1/infra/sha/runbook-profiles/<profile-name>

示例请求:

PATCH https://<nsx-mgr>/policy/api/v1/infra/sha/runbook-profiles/<profile-name>
{
    "runbook_path": "/infra/sha/pre-defined-runbooks/0000004f-7665-726c-6179-54756e6e656c",
    "applied_to_group_path": "/infra/domains/default/groups/tngroup2",
    "config": {
        "enabled": true,
        "timeout": 120,
        "threshold_number": 2,
        "throttle_cycle": 6
    }
}

在此示例中,throttle_cycle 为 6 分钟,threshold_number 为 2,这意味着在 6 分钟内,操作手册的调用次数不能超过两次。

有关 ODS API 的完整信息,请参见《NSX Intelligence 和 NSX Application Platform API 指南》