土法炼钢 · 系统与基础设施

【Cilium / eBPF】Hubble 信号:flow 字段语义与「指标全绿仍丢包」

文章导航

分类入口
kubernetesnetwork
标签入口
#cilium#hubble#ebpf#flow#metrics#observability#drop#verdict#v1.20.0

目录

值班看到 Grafana 里 Cilium / Hubble 面板全绿,同时业务喊丢包——这两种信号并不矛盾。Hubble 的 flow 是带 verdict 的事件流;metrics 是按标签聚合的计数。二者采样、过滤、导出路径不同,和「网卡丢包 / 应用超时 / 未被观测的路径」也不同层。本篇钉字段语义与错位模式,不写 Hubble UI 操作手册。

本文是「Cilium / eBPF 数据面内核」系列第 8 篇(共 16 篇)。→ 系列目录

篇目 核心内容
第 7 篇 · 策略编译 policy map 与 deny 窗口
第 8 篇 · Hubble 信号 flow 字段;metrics vs flows
第 9 篇 · 透明加密 加密路径税
第 12 篇 · 可观测口径 status / metrics 运维

版本锚定:Cilium v1.20.0;Hubble 随该发行嵌入。字段以 Hubble flow API / CLI 文档与 docs.cilium.io/en/v1.20/observability/ 为准。无集群不粘贴伪造 hubble observe 输出。


一、信号分层:先分清「谁在说话」

信号源 粒度 典型问题
Hubble flow 连接/流事件(可含 L7) 这次从谁到谁、verdict、drop reason
Hubble metrics Prometheus 计数/直方图 丢包率趋势、按 reason 聚合
Cilium agent metrics 控制面与数据面健康 map 压力、agent 错误、BPF 操作
节点 / 网卡 / 应用指标 主机与业务 soft drop、超时、饱和

Hubble 消费 Cilium 数据面导出的可观测事件(monitor / event 管线),经节点 Hubble、可选 Hubble Relay 聚合到集群视图。flow 擅长归因;metrics 擅长告警与容量。用 metrics 回答「哪条 CNP 拒了这个五元组」会不够;用 flow 洪水回答「过去 24h 丢包趋势」会贵。

flowchart TB
  dp["Datapath verdict\npolicy / CT / LB / drop"] --> ev["Monitor / Hubble events"]
  ev --> flow["Flow stream\nCLI / Relay / UI"]
  ev --> hm["Hubble metrics\naggregation"]
  agent["Agent / map / API"] --> cm["Cilium metrics"]
  flow --> page["On-call attribution"]
  hm --> dash["Dashboards / alerts"]
  cm --> dash

二、Flow 关键字段语义(排障坐标系)

下列字段是归因时最常误读的集合(名称以 Hubble flow schema / CLI 列为准;展示名可能略有差异):

字段簇 含义 误读
source / destination 端点的身份视图:namespace、pod、workload、IP、security identity 只盯 IP,忽略 Identity 已变
verdict FORWARDED / DROPPED / AUDIT / REDIRECTED 把 REDIRECTED 当成业务成功
drop_reason / drop_reason_desc 内核/数据面丢包原因枚举 所有 DROPPED 都当成 NetworkPolicy
traffic_direction ingress / egress(相对 endpoint) 与「南北向」口语混用
Type / Subtype L3/L4、L7、SOCK 等事件类型 用 L3 流解释 HTTP 403
l7(若启用) HTTP/DNS/Kafka 等解析字段 未开 L7 可见性却抱怨没有路径
Summary / IsReply 摘要与是否回程 把 reply 再当新连接策略判定
Trace / ObservationPoint 观测点(哪段 hook 看到) 以为「看见」等于「最终投递成功」

Identity 列的价值:flow 直接给出数字 Identity 与标签翻译,避免「先反查 IP 再猜策略」。这与第 2、7 篇一致:策略键是 Identity,观测也应先对齐 Identity。

Verdict 分层


三、Metrics 与 Flows:口径差在哪

3.1 Hubble metrics 示例口径(v1.20 文档)

官方 Observability Metrics 章列出可启用的 Hubble metrics(Helm hubble.metrics.enabled),例如:

指标簇 代表名 回答的问题
drop drop_count_total(reason, direction) 按原因聚合的丢包数
flow flows_processed_total(protocol/type/subtype/verdict 等,视版本标签) 处理了多少 flow 事件
tcp / icmp / dns / http(V2) 各协议专用 握手失败、DNS、HTTP 状态分布
flows-to-world reserved:world 的流 出集群流量与默认 deny 是否咬合

注意:flows_processed_total 计的是「被 Hubble 处理的 flow 事件」,不是网卡 pps,也不是应用成功请求数。 开启哪些 metrics、带哪些 labelsContext,直接改变基数与基数爆炸风险。

3.2 何时 metrics 绿、业务仍红

场景 为何 metrics「看起来没事」 实际丢在哪
未启用 drop metric 面板只有 agent 存活与 CPU policy deny 只在 flow 里
采样 / 过滤掉了某 namespace 全局 drop 很低 业务 ns 大量 DROPPED
丢在加密/路由/云 LB,未进 Cilium drop 计数 Hubble drop 平稳 节点 tx_dropped、云安全组
丢在应用:连接已 FORWARDED forward 指标上升 应用 5xx / 队列满
L7 拒绝记在 HTTP 指标或 Envoy L3/L4 drop 不变 HTTP 403/429
客户端超时短于重传 几乎无 DROPPED 用户以为丢包
map 满导致「偶发不通」 瞬时 drop 被平均掉 控制面指标才有尖刺(第 12 篇)
观测缺口:hostNetwork / 未托管接口 Hubble 无事件 流量根本不经期望 hook

这就是系列关键问题 4 的答案骨架:全绿的 metrics 只说明「你选的聚合序列没报警」,不证明「数据面每一跳都成功」。


四、从告警到 flow 的推荐顺序

  1. 定平面:集群内东西向、NodePort 南北向、还是跨集群(ClusterMesh)?
  2. 看 Cilium 健康:agent ready、KPR/加密/策略是否在预期模式(cilium status 语义)。
  3. 看聚合 drop reason:若已启用 Hubble drop,先按 reason 排序;Policy deniedStale/No mapping 一类原因指向不同篇。
  4. 拉 flow:按 namespace、verdict、identity 过滤,对齐第 7 篇的策略窗口假设。
  5. 若 flow 为 FORWARDED:下钻节点网卡、对端应用、Service 后端、加密(第 9 篇)。

命令语义(需 Relay 或本地 Hubble):

# 语义:观察某命名空间丢弃流(不要把示例输出写进正文当实测)
hubble observe --namespace <ns> --verdict DROPPED
# 语义:按 identity / pod 过滤(字段以本机 hubble help 为准)
# hubble observe --from-pod <ns>/<pod> --to-pod <ns>/<pod>

加密流量的可见性受「是否在加密前后观测」影响;官方 Hubble CLI 有 encrypted traffic 过滤相关说明——排障时要声明观测点相对 WireGuard/IPsec 的位置,否则会把密文隧道误当成业务五元组。


五、与策略、Service、加密的字段对齐

数据面层 flow 上优先看 常见 reason / verdict
Identity / ipcache src/dst identity 是否符合预期 错 identity → 误判策略
Policy map DROPPED + Policy denied 第 7 篇窗口
Service / LB 是否打到预期 backend 身份 黑洞时常先有连接失败而非 deny
CT 回程 IsReply、状态 不对称路径
L7 proxy REDIRECTED + l7 字段 Envoy 拒绝
Encryption 加密相关 drop / 无流 第 9 篇密钥与 strict mode

不要用「Hubble 没有 DROP」反证「没有 NetworkPolicy 问题」——也可能是流量没走到强制点,或 verdict 在 L7。


六、谱系、争论与开放问题

谱系:网络可观测从 tcpdump / NetFlow / IPFIX,到主机 agent 采样,再到 可编程数据面内生事件(随 eBPF 监控点导出)。Hubble 把 Cilium 的 verdict 翻译成可查询 flow 与可聚合 metrics。它不是通用 APM;分布式追踪仍要应用侧上下文。

争论

  1. 全量 flow vs 采样:全量利于事后追责,税高;采样利于常驻,可能丢掉稀有 deny。生产上「默认采样 + 故障时临时全量」是工程折中,不是理论最优。
  2. 高基数标签labelsContext 塞满 pod IP 时,Prometheus 元数据本身可打垮观测栈——观测税变成新的故障面。
  3. 「可观测性即安全」营销 vs 排障坐标:flow 能解释 Cilium 路径上的决策,不能替代对应用与云网络的观测。

开放问题

  1. Hubble 采样与真实丢包归因如何对齐到同一 SLO 仪表盘?(研究台账 08–09)
  2. 跨 ClusterMesh 的 flow 时钟与 identity 翻译:Relay 联邦后,事件顺序与集群名冲突如何避免误归因?(第 11、12 篇方向)

七、Relay、基数与「看不见的成功路径」

Hubble Relay 把各节点 Hubble 聚成集群(及 ClusterMesh 场景下的更广)查询面。CLI 指向 Relay 时,过滤条件里的集群名、节点名、时间范围都会影响「你以为看到了全集」。节点 Hubble 崩溃或 Relay 落后时,metrics 刮取若仍打在存活实例上,会出现 局部绿、全局盲区——这与数据面是否丢包无关。

高基数是第二类自伤:为每个 source_ip/destination_pod 打开 labelsContext 后,Prometheus 内存与 scrape 时间上升,告警规则开始「为了活下去」被关掉或降采样。结果是:出事那一周偏偏没有可用的 drop 时间序列。工程纪律是默认用 粗标签(namespace、workload、reason),故障窗口再临时加细过滤的 flow 查询,而不是长期全细粒度 metrics。

「看不见的成功路径」同样误导:同节点 sockmap 短路、或未经期望 TC 点的 hostNetwork 流量,可能不产生你习惯过滤的那类 flow。业务成功且 Hubble 空空,不等于观测坏了,可能是路径根本不经该 observation point。反之,flow 里大量 FORWARDED 只说明 Cilium 放行,应用线程若阻塞在锁上,用户仍报「网络不行」。

与第 6、7、9 篇对齐的快速口诀:

把这三条写成 runbook,比再加一张「全绿」大盘更有用。

7.1 事件丢失与背压

数据面可以以很高速率产生 monitor 事件;Hubble 导出、Ring buffer、Relay 传输任一环节背压时,都会 丢事件 而未必丢数据包。结果是:业务流量与策略判定仍在发生,但 flow 流出现缺口,metrics 少计。把「Hubble 没看见 DROP」写成「没有 DROP」之前,先确认导出路径是否健康(agent 日志、Relay 延迟、是否启用了过激过滤)。

反之,重放或调试时打开过于宽的 observe 过滤,会让笔记本与 API 都被事件淹没,造成「观测工具拖慢排障」——过滤条件应先收窄到 namespace 与 verdict,再按需放大。

7.2 与 Cilium agent metrics 的分工再钉一次

问题 优先看
策略是否在拒 Hubble drop reason / flow
agent 是否在报错、map 是否满 Cilium agent Prometheus
节点是否在丢帧 主机/网卡指标
HTTP 是否 403 Hubble L7 或 Envoy 指标

混用这四行是「全绿仍不通」的最常见认知错误:四套仪表盘各说各话,没有一张告诉你该信谁。

时间对齐也很关键:Grafana 默认「现在」与 Hubble CLI 默认「此刻流」若差几分钟时钟或时区,会出现「指标尖刺对不上 flow」的假矛盾。排障记录应写下观测时间戳、时区、以及用的是节点本地 Hubble 还是 Relay,方便事后复盘。

加密开启后,还可对照第 9 篇:若只在隧道外层看到 UDP/ESP,不要用业务端口去过滤 flow——先确认解密后观测是否可用,再下策略结论。

最后,Hubble UI 适合演示服务依赖图,不适合当唯一告警源:UI 聚合与过滤默认值可能隐藏低频 deny。值班应以 CLI/metrics 为证据链,UI 只作辅助可视化——这也是本系列不写点击教程的原因。有集群时再贴真实 hubble observe 片段;无集群时只保留命令语义,避免用臆造输出训练错误肌肉记忆。这是证据纪律,不是篇幅技巧。


八、本篇边界

不写:Hubble UI 点击路径、Grafana 仪表盘 JSON、伪造 flamegraph。
完整运维口径(哪些官方指标进值班盘)见第 12 篇;把 drop、identity 漂移、Service 黑洞收成决策树见第 13 篇。

一句话收束:flow 回答「这一次为何如此」;metrics 回答「这一类是否变多」;二者全绿仍可能丢在未计量平面——先定观测点,再读 verdict,最后才骂应用。 下一篇转入加密路径税,观测坐标系到此收束。

参考资料

官方文档(A)

源码 / API(A)

站内

上一篇:策略编译 · 系列目录 · 下一篇:透明加密

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。

2026-08-16 · kubernetes / network

Cilium / eBPF 数据面内核:从 Identity 到包路径

补齐站内 Cilium 产品单篇与 eBPF 内核实现之上的数据面内核层:Endpoint/Identity、BPF 挂载与 Map、东西向包路径、kube-proxy 替代、策略编译、Hubble、加密与 Mesh/ClusterMesh 边界,并以排障与选型收束。


By .