4、Hubble CLI入门:hubble observe命令基础、过滤条件、输出格式、实时流与历史回放
Hubble CLI 是 Hubble 组件提供的命令行工具,用于从 Cilium 的 eBPF 数据路径中实时或历史地查询网络流量。核心命令 hubble observe 是日常运维中查看容器网络通信、诊断连通性、分析策略命中情况的主要入口。本章将系统讲解该命令的基础用法、过滤机制、输出控制以及两种工作模式。
4.1 命令基础与连接模式
hubble observe 默认通过 Unix Socket 连接到本地节点的 Hubble 服务。在 Kubernetes 环境中,通常需要先通过 hubble port-forward 或直接指定 --server 参数连接到 Hubble Relay。
连接方式对比:
- 本地节点(默认): 直接查看当前节点的流量,无需额外参数。
- Hubble Relay(集群级): 使用
hubble observe --server localhost:4245或通过hubble port-forward建立的隧道,可查看整个集群的流量。
# 查看当前节点所有流量(默认输出)
hubble observe
# 通过 Hubble Relay 查看集群流量
hubble observe --server localhost:4245
# 查看帮助信息
hubble observe --help
4.2 过滤条件:精准定位目标流量
Hubble 支持丰富的过滤表达式,允许运维人员从海量数据中快速定位特定 Pod、Service、协议或策略相关的流量。过滤条件通过 --filter 或简写 -f 指定,支持多次叠加使用。
| 过滤类型 | 示例 | 说明 |
|---|---|---|
| Pod 名称 | --pod frontend-xxx |
匹配源或目的 Pod 名称(支持前缀匹配) |
| 命名空间 | --namespace production |
仅显示指定命名空间的流量 |
| IP 地址 | --ip 10.0.0.5 |
匹配源或目的 IP |
| L4 端口 | --port 8080 |
匹配源或目的端口 |
| 传输协议 | --protocol TCP |
过滤 TCP/UDP/ICMP 等协议 |
| HTTP 方法 | --http-method GET |
仅显示特定 HTTP 方法的请求(需启用 L7 可见性) |
| HTTP 路径 | --http-path /api/v1/* |
按 URL 路径模式匹配 |
| 策略判定 | --verdict DROPPED |
显示被网络策略丢弃的流量 |
| 标签 | --label k8s:app=nginx |
按 Kubernetes 标签过滤 |
组合过滤技巧: 多个过滤条件之间是 AND 关系。例如
hubble observe --namespace production --port 443 --verdict FORWARDED 仅显示 production 命名空间中端口 443 上被允许的流量。
# 查看被网络策略丢弃的流量
hubble observe --verdict DROPPED
# 查看 frontend 命名空间到 backend 服务的 HTTP 请求
hubble observe --from-namespace frontend --to-namespace backend --protocol HTTP
# 查看特定 Pod 的 TCP 流量
hubble observe --pod nginx-7fb7c96b6b-j4k2p --protocol TCP
4.3 输出格式:控制显示内容与样式
Hubble 提供多种输出格式,满足不同场景需求:终端查看、日志归档、JSON 解析等。
| 格式参数 | 说明 | 典型用途 |
|---|---|---|
--output json |
输出 JSON 格式,包含所有字段 | 程序化处理、日志存储 |
--output jsonpb |
Protocol Buffers JSON 格式 | 与 Hubble API 数据结构一致 |
--output dict |
键值对格式,每行一个字段 | 快速查看关键字段 |
--output compact |
紧凑单行格式 | 高密度终端输出 |
| 默认(表格) | 表格形式,显示时间、源、目的、协议、策略判定等 | 日常人工查看 |
# JSON 格式输出,便于 jq 处理
hubble observe --output json | jq '.ip.source'
# 紧凑格式,适合在窄终端中滚动查看
hubble observe --output compact
# 自定义字段输出(通过 Hubble CLI 的 --print 参数)
hubble observe --print flow --print node-name
4.4 实时流与历史回放
Hubble 支持两种工作模式:实时流模式持续监听新产生的流量事件;历史回放模式则从 Hubble 的环形缓冲区中检索已记录的数据包。
4.5 实战示例:准入策略评审中的流量取证
在容器网络运维中,准入策略评审需要验证新策略是否生效、是否有意外阻断或放行。以下示例展示如何使用 Hubble CLI 进行策略生效前后的流量对比。
场景: 评审一条禁止 frontend 命名空间访问 backend 命名空间 3306 端口的网络策略。
# 步骤1:策略生效前,查看正常流量
hubble observe --from-namespace frontend --to-namespace backend --port 3306 --last 50
# 步骤2:应用网络策略后,查看被丢弃的流量
hubble observe --from-namespace frontend --to-namespace backend --port 3306 --verdict DROPPED
# 步骤3:确认策略是否完全阻断(无 FORWARDED 流量)
hubble observe --from-namespace frontend --to-namespace backend --port 3306 --verdict FORWARDED --last 10
# 步骤4:导出 JSON 格式用于审计记录
hubble observe --from-namespace frontend --to-namespace backend --port 3306 --since 10m --output json > policy-audit.json
注意事项:
- 历史回放依赖 Hubble 环形缓冲区的大小配置(默认 1GB),超出容量的事件会被覆盖。
- 实时流模式在集群规模较大时可能产生大量输出,建议配合精确过滤条件使用。
- L7 过滤(HTTP 方法、路径)需要 Pod 上启用 L7 可见性注解,否则不会显示。
4.6 常用命令速查表
| 命令 | 用途 |
|---|---|
hubble observe --follow |
持续实时监控流量(类似 tcpdump) |
hubble observe --last 200 |
查看最近 200 条流量记录 |
hubble observe --since 30m |
查看过去 30 分钟的历史流量 |
hubble observe --verdict DROPPED --output json |
导出被丢弃流量的 JSON 日志 |
hubble observe --http-path /healthz |
过滤特定 HTTP 健康检查路径 |
hubble observe --label k8s:app=nginx |
按应用标签过滤流量 |
掌握 hubble observe 的过滤与输出能力,是进行容器网络准入策略评审的基础。通过实时流快速定位问题,通过历史回放完成合规审计,Hubble CLI 为运维人员提供了从观察到取证的完整工具链。