• Русский
  • Использование CLI

    CLI может запускаться как автономный инструмент или как плагин kubectl. Вы можете скопировать его из pod netobserv-controller-manager на локальную машину.

    Используйте CLI для оперативного поиска и устранения неполадок, когда нужно просмотреть пакеты или потоки за ограниченный период времени. Он поддерживает два режима:

    • режим TUI, который отображает захваченный трафик в реальном времени для интерактивного анализа
    • фоновый режим, который запускает задачу захвата и позволяет ей выполняться до достижения настроенного условия остановки или до ручной остановки

    Оба режима поддерживают экспорт результатов захвата для автономного анализа.

    Копирование CLI

    Пример:

    # Get name of the NetObserv Controller Manager pod
    CONTROLLER_POD=$(kubectl get pods -n netobserv-operator -l app=netobserv-operator -o jsonpath="{.items[0].metadata.name}")
    # Copy the CLI from the controller manager pod to your local machine
    kubectl cp netobserv-operator/$CONTROLLER_POD:/kubectl-netobserv /usr/local/bin/kubectl-netobserv
    # Make the CLI executable
    chmod +x /usr/local/bin/kubectl-netobserv
    # Verify that the CLI is working
    kubectl netobserv help

    Установка или копирование yq

    Для работы CLI на локальной машине требуется yq, чтобы изменять YAML-файлы. Если yq не установлен локально, вы можете скопировать бинарный файл из pod netobserv-controller-manager.

    # Copy yq from the controller manager pod to your local machine
    kubectl cp netobserv-operator/$CONTROLLER_POD:/yq /usr/local/bin/yq
    # Make yq executable
    chmod +x /usr/local/bin/yq
    # Verify that yq is working
    yq --version
    NOTE

    CLI использует некоторые образы, входящие в состав NetObserv Operator, но для работы ему не требуется установленный NetObserv Operator. После подготовки CLI вы можете удалить NetObserv Operator, если он вам больше не нужен. CLI продолжит работать.

    Просмотр сообщения справки

    Перед запуском задачи захвата ознакомьтесь с доступными командами:

    # Get help message for the CLI
    kubectl netobserv help
    # Get help message for packet capture command
    kubectl netobserv packets help
    # Get help message for flow capture command
    kubectl netobserv flows help

    Захват пакетов

    Захват пакетов записывает необработанные пакеты, соответствующие указанным фильтрам. Используйте захват пакетов, когда вам нужны полные сведения о пакетах, а не сводные записи потоков.

    NOTE

    Если длина пакета превышает 256 байт, пакет будет усечен в результатах захвата.

    Захваченные пакеты можно экспортировать в файл pcapng для автономного анализа с помощью таких инструментов, как Wireshark.

    Пример в Wireshark:

    Wireshark

    NOTE

    Захваченные пакеты в файле pcapng не отсортированы по временной метке, поэтому для анализа потока пакетов может потребоваться отсортировать их по временной метке в Wireshark.

    Комментарии к пакетам содержат такие метаданные, как IP узла, имя интерфейса и сведения о ресурсах Kubernetes. Пример комментариев к пакетам:

    Source
        Source
        Src IP: 192.0.2.10
        Src Node IP: 192.0.2.10
        Src Node Name: node-a
        Src Name: node-a
        Src Network Name: primary
        Src Owner: node-a
        Src Owner Kind: Node
        Src Kind: Node
        Src MAC: 02:00:00:00:00:10
        Src Port: 36408
    Destination
        Destination
        Dst IP: 198.51.100.77
        Dst Node IP: 192.0.2.20
        Dst Node Name: node-b
        Dst Name: kube-ovn-pinger-js87q
        Dst Namespace: kube-system
        Dst Network Name: ovn-default
        Dst Owner: kube-ovn-pinger
        Dst Owner Kind: DaemonSet
        Dst Kind: Pod
        Dst MAC: 02:00:00:00:00:20
        Dst Port: 8080(http-alt)
    Common
        Common
        Bytes: 145B
        TCP Flags: PSH
        Node Dir: Egress
        L4 Protocol: TCP
        Length: 145
        AgentIP: 192.0.2.10
        InterfaceIndex: 7
        InterfaceName: ovn0
        InterfaceDirection: Egress

    Вы можете фильтровать пакеты в Wireshark на основе этих комментариев. Пример фильтра по IP узла и имени интерфейса:

    frame.comment == "AgentIP: 192.0.2.10" && frame.comment == "InterfaceName: ovn0"

    В overlay-сети Kube-OVN пакеты между pod на разных узлах инкапсулируются с помощью Geneve или VxLAN. Исходный пакет передается как полезная нагрузка пакета Geneve или VxLAN. Чтобы захватить инкапсулированный трафик, используйте --enable_geneve или --enable_vxlan при запуске команды захвата пакетов.

    Пример команды для захвата TCP-пакетов на порту 8080, включая пакеты, инкапсулированные в Geneve:

    kubectl netobserv packets --enable_geneve --protocol=TCP --port=8080

    Запуск захвата пакетов в режиме TUI

    Пример команды для режима TUI:

    kubectl netobserv packets --cidr=198.51.100.77/32 --peer_ip=192.0.2.10 --protocol=TCP --port=8080

    Эта команда захватывает пакеты, соответствующие указанным фильтрам, и отображает их в режиме TUI.

    Пример интерфейса TUI:

    Packet Capture TUI

    Нажмите CTRL+C, чтобы выйти из режима TUI и остановить захват пакетов. По умолчанию CLI предложит сохранить захваченные пакеты в файл pcapng после выхода из режима TUI. Чтобы автоматически сохранить файл pcapng без подтверждения, можно использовать флаг --copy.

    Запуск захвата пакетов в фоновом режиме

    Пример команды для фонового режима:

    kubectl netobserv packets --background --cidr=198.51.100.77/32 --peer_ip=192.0.2.10 --protocol=TCP --port=8080

    Эта команда запускает фоновую задачу захвата пакетов, которая собирает пакеты, соответствующие указанным фильтрам.

    Чтобы скопировать захваченные пакеты в файл pcapng в фоновом режиме, выполните:

    kubectl netobserv copy

    Когда задача захвата остановлена или завершена, можно использовать команду cleanup, чтобы удалить фоновую задачу захвата и освободить ресурсы.

    kubectl netobserv cleanup

    Захват потоков

    Захват потоков записывает не необработанные пакеты, а сводные данные о сетевых потоках. Используйте его, когда вам нужны метаданные трафика и статистика потоков, а не полный полезный payload пакетов.

    Принцип использования захвата потоков похож на захват пакетов, но результаты экспортируются в форматах JSON и SQLite вместо pcapng.

    Пример команды:

    kubectl netobserv flows --cidr=198.51.100.77/32 --peer_ip=192.0.2.10 --protocol=TCP --port=8080

    Пример интерфейса TUI:

    Flow Capture TUI

    Пример экспортированной записи потока в форматированном JSON:

    [
      {
        "AgentIP": "192.0.2.10",
        "Bytes": 611,
        "Dscp": 0,
        "DstAddr": "2001:db8:1::77",
        "DstK8S_HostIP": "192.0.2.20",
        "DstK8S_HostName": "node-b",
        "DstK8S_Name": "kube-ovn-pinger-2w2qp",
        "DstK8S_Namespace": "kube-system",
        "DstK8S_NetworkName": "ovn-default",
        "DstK8S_OwnerName": "kube-ovn-pinger",
        "DstK8S_OwnerType": "DaemonSet",
        "DstK8S_Type": "Pod",
        "DstMac": "02:00:00:00:00:20",
        "DstPort": 8080,
        "Etype": 34525,
        "Flags": 530,
        "FlowDirection": 2,
        "IfDirections": [
          1,
          1
        ],
        "Interfaces": [
          "ovn0",
          "211daf442f8b_h"
        ],
        "Packets": 6,
        "Proto": 6,
        "Sampling": 1,
        "SrcAddr": "2001:db8:1::10",
        "SrcK8S_HostIP": "192.0.2.10",
        "SrcK8S_HostName": "node-a",
        "SrcK8S_Name": "kube-ovn-cni-zgjhs",
        "SrcK8S_Namespace": "kube-system",
        "SrcK8S_NetworkName": "primary",
        "SrcK8S_OwnerName": "kube-ovn-cni",
        "SrcK8S_OwnerType": "DaemonSet",
        "SrcK8S_Type": "Pod",
        "SrcMac": "02:00:00:00:00:10",
        "SrcPort": 59848,
        "TimeFlowEndMs": 1775701945802,
        "TimeFlowStartMs": 1775701945799,
        "TimeReceived": 1775701946
      },
      {
        "AgentIP": "192.0.2.10",
        "Bytes": 509,
        "Dscp": 0,
        "DstAddr": "2001:db8:1::10",
        "DstK8S_HostIP": "192.0.2.10",
        "DstK8S_HostName": "node-a",
        "DstK8S_Name": "kube-ovn-cni-zgjhs",
        "DstK8S_Namespace": "kube-system",
        "DstK8S_NetworkName": "primary",
        "DstK8S_OwnerName": "kube-ovn-cni",
        "DstK8S_OwnerType": "DaemonSet",
        "DstK8S_Type": "Pod",
        "DstMac": "02:00:00:00:00:30",
        "DstPort": 59848,
        "Etype": 34525,
        "Flags": 784,
        "FlowDirection": 2,
        "IfDirections": [
          0,
          0
        ],
        "Interfaces": [
          "211daf442f8b_h",
          "ovn0"
        ],
        "Packets": 4,
        "Proto": 6,
        "Sampling": 1,
        "SrcAddr": "2001:db8:1::77",
        "SrcK8S_HostIP": "192.0.2.20",
        "SrcK8S_HostName": "node-b",
        "SrcK8S_Name": "kube-ovn-pinger-2w2qp",
        "SrcK8S_Namespace": "kube-system",
        "SrcK8S_NetworkName": "ovn-default",
        "SrcK8S_OwnerName": "kube-ovn-pinger",
        "SrcK8S_OwnerType": "DaemonSet",
        "SrcK8S_Type": "Pod",
        "SrcMac": "02:00:00:00:00:40",
        "SrcPort": 8080,
        "TimeFlowEndMs": 1775701945802,
        "TimeFlowStartMs": 1775701945800,
        "TimeReceived": 1775701946
      }
    ]

    Пример экспортированных записей потоков в SQLite:

    $ sqlite3 2026-04-09T022936Z.db \
      "SELECT SrcAddr, SrcPort, DstAddr, DstPort, Proto, Packets, Bytes FROM flow;"
    ╭───────────────────────┬─────────┬───────────────────────┬─────────┬───────┬─────────┬───────╮
            SrcAddr SrcPort        DstAddr DstPort Proto Packets Bytes
    ╞═══════════════════════╪═════════╪═══════════════════════╪═════════╪═══════╪═════════╪═══════╡
     2001:db8:1::10   59848 2001:db8:1::77    8080     6       6   611
     2001:db8:1::77    8080 2001:db8:1::10   59848     6       4   509
    ╰───────────────────────┴─────────┴───────────────────────┴─────────┴───────┴─────────┴───────╯

    Дополнительные ресурсы