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

【Cilium / eBPF】可观测与运维口径:cilium status、metrics 语义与 bpftool 边界

文章导航

分类入口
kubernetesnetwork
标签入口
#cilium#ebpf#observability#prometheus#hubble#bpftool#metrics#v1.20.0

目录

「节点健康」与「东西向某条流被拒」的观测入口不同。前者可能卡在 agent 未就绪、kvstore 断连、或 policymap 压力告警;后者可能是 identity 未同步、Service 后端为空、或加密握手失败。若先盯 Grafana 里一条 cilium_endpoint_state 的绿点,往往会错过 Hubble flow 里已经写明的 DROPPED (Policy denied)

本文是系列第 12 篇,目标是:先选观测层,再读字段语义与失败模式;不虚构 Prometheus scrape 样本,不把文档示例输出当本机实测。flow 字段细则见第 8 篇;把症状落到排障轴见第 13 篇

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

篇目 核心内容
第 11 篇 · ClusterMesh 多集群身份与发现边界
第 12 篇 · 可观测 status / metrics / bpftool 口径
第 13 篇 · 排障坐标系 丢包、deny、identity 漂移、Service 黑洞

版本锚定:Cilium v1.20.0docs.cilium.io/en/v1.20/;源码 tag v1.20.0)。指标名以官方 Observability / Metrics 文档为准;Tentacle 式第三方升版须显式标注。无真实 Cilium 集群则不粘贴伪造 cilium status / Hubble flow 输出。


一、先选观测层,再动命令

Cilium 比「装了 CNI」多三层可观测面:agent 控制面状态、BPF 数据面状态、以及 Hubble 流事件。读信号时固定这个栈:

Cluster 层:   cilium status(CLI)/ Operator 条件 / ClusterMesh 连接摘要
Agent 层:     cilium-dbg status --verbose;controllers;IPAM;Proxy
Datapath 层:  BPF map 压力、CT GC、policy implementation delay
Flow 层:      Hubble observe / Relay;verdict 与 drop reason
Metrics 层:   cilium_*(agent/operator);hubble_*;可选 envoy_cilium_*
内核旁路:     bpftool(通用)vs cilium-dbg bpf *(Cilium 语义封装)
刷新语义 适合回答 不适合单独回答
cilium status 聚合健康摘要,秒级 「集群/节点 Cilium 是否大体 OK」 某条 TCP 为何被拒
cilium-dbg status --verbose 单节点深挖 IPAM、controller 失败、Proxy 跨节点 identity 漂移根因
Hubble flow 近实时事件环 某 Pod 的 verdict / drop reason 长期容量趋势
Agent Prometheus 常见 15–30s scrape map 压力、CT、endpoint 状态趋势 亚秒级单流归因
Hubble metrics 流聚合计数 L3/L4/L7 流量与 drop 比率 控制器 reconcile 细节
bpftool 即时内核视图 map 是否存在、程序是否挂载 Cilium 策略语义解释

纪律:同一事故窗口里,先用 status 定「控制面是否病了」,再用 Hubble 定「这条流在哪一跳被判」,最后用 metrics/map 定「是否系统性压力」。两层同时绿、业务仍挂,才下钻加密与 Service 黑洞(第 9、6、13 篇)。

flowchart TD
  symptom["Symptom: timeout / deny / blackhole"]
  symptom --> pick["Pick observation layer"]
  pick --> st["cilium status / cilium-dbg"]
  pick --> hb["Hubble observe / Relay"]
  pick --> prom["cilium_* / hubble_* metrics"]
  pick --> bpf["cilium-dbg bpf / bpftool"]

二、cilium status:摘要,不是根因库

Cilium CLI 的 cilium status(以及节点内 cilium-dbg status)回答的是:agent、Hubble、kvstore/CRD、kube-proxy 替代、加密等子系统是否自报健康。官方排障文档把它当作入口摘要;深挖时要求 --verbose,以展开 IPAM、controller 列表与 Proxy 状态。

常用入口(命令语义;输出须在真实集群执行):

cilium status
cilium status --wait
kubectl -n kube-system exec -it ds/cilium -- cilium-dbg status --verbose
kubectl -n kube-system exec -it ds/cilium -- hubble status
摘要块(语义) OK 含义 常见误读
Cilium / Agent DaemonSet Pod 可达且自检通过 「OK = 策略已按你想的放行」
Hubble 本机 Hubble server 健康;可含 flow 环占用 flow 环 100% 满 ≠ 业务丢包,只说明事件缓冲饱和
kube-proxy replacement KPR 配置与期望一致 不等于 ClusterIP 后端非空
Encryption WireGuard/IPsec 子系统已启用且自检 不等于跨节点隧道对所有路径生效(见第 9 篇路径表)
ClusterMesh 远端集群连接摘要 远端 identity 未同步时摘要仍可能短暂 OK

工程判断:把 cilium status 当「能否进下一层」的闸门,不当「业务连通性证明」。业务超时而 status 全绿,是第 13 篇坐标系的常态入口,不是矛盾。

Hubble 环与 Metrics 开关

官方文档注明:Hubble 默认随 agent(--enable-hubble);cilium-dbg status 里可看到 Current/Max FlowsMetrics: Disabled/Enabled。flow 环写满时旧事件被覆盖——观测丢失,不等于数据面丢包。Hubble Prometheus 指标需单独打开(Helm:hubble.metrics.enabled 等);agent 指标另走 prometheus.enabled。两套 scrape 目标、两套端口,混成一个「Cilium 绿」会掩盖「Hubble metrics 根本没开」。


三、Agent / Operator metrics:读语义,不读虚构样本

Cilium 与 Hubble 均可导出 Prometheus 指标。官方 Observability → Metrics(对齐 v1.20 叙述)规定:

下列家族按排障语义分组。表中不出现伪造数值;生产以本集群 /metrics 实际暴露名为准。

3.1 控制面与策略落地

Metric(示意族) 语义 读法
cilium_endpoint_state endpoint 状态分布 大量非 ready 先查 agent/IPAM,再查策略
cilium_identity / identity 相关计数 已分配安全身份规模 标签风暴时与 policymap 压力同看
cilium_policy_implementation_delay 策略变更到数据面落地耗时 延迟升高解释「改完 CNP 仍短暂旧行为」
controller 失败类计数 reconcile 循环错误 status verbose 里同名 controller 对照

3.2 数据面压力与 CT

Metric(示意族) 语义 读法
cilium_bpf_map_pressure(含 map_name 单节点上指定 map 压力;policy 族文档点名 cilium_policy_v3_* 取节点最大压力 逼近 1 时策略查找可能溢出/降级——见官方 policymap pressure 专节
cilium_datapath_conntrack_gc_* CT GC 次数、存活/删除条目、耗时 GC 风暴与「偶发新建失败」同窗口对齐
cilium_datapath_conntrack_dump_resets_total dump 过程中条目被删导致的重置 解释并发读 map 的竞态噪声,非业务 drop 本尊
drop 相关计数(若启用) 数据面丢包聚合 必须再对 Hubble drop reason;聚合丢因不明

3.3 Hubble 聚合指标

Hubble metrics 把 flow 事件收成计数器(HTTP、DNS、drop、flow 等可选族)。它们回答「比率与趋势」,不回答「这一次 SYN 的五元组」。与第 8 篇分工:

信号 回答 不回答
Hubble observe 单次/短窗 verdict、identity、L7 字段 月度容量规划
hubble_* metrics 按标签聚合的通过/丢弃率 某次策略 selector 写错的句子级原因
Agent cilium_* agent/map/CT 健康 应用 HTTP 500 业务语义

告警建议(语义级,非抄录阈值)


四、bpftoolcilium-dbg bpf:边界必须划清

eBPF 通用工具链(bpftool prog / bpftool map)能看见内核里挂了什么程序、map 有多少元素。Cilium 封装的 cilium-dbg bpf *(以及部分 cilium bpf 兼容入口)在同一批 map 上提供带 Cilium 语义的列表与解码。

工具 擅长 边界
bpftool 确认程序 attach 点、map id、原始 dump 不懂 identity/policy 语义;易误读二进制 value
cilium-dbg bpf lb / policy / ct / metrics 按 Cilium 数据结构解读 Service、策略、CT、数据面 metrics 依赖 agent 与 map 版本一致;跨大版本字段可能变
cilium-dbg map list / map get agent 视角的 map 注册表 不是任意 bpftool map dump 的完整替代

纪律

  1. 先问语义,再 dump 字节。排查「ClusterIP 是否有后端」用 Cilium 的 service/lb 子命令;只有怀疑「程序没挂上」才下到 bpftool prog show / tc filter
  2. 不要在生产用 bpftool map update「手工修」Cilium map。控制面下一轮 reconcile 会覆盖或把状态打穿;这是排障禁区,不是高级技巧。
  3. 版本钉:map 名称与布局随 Cilium 发行变化(例如 policy map 代际)。结论必须写清 v1.20.0;对照旧博客的 map 名时先核对当前 cilium-dbg map list
# 语义层(在 cilium Pod 内;输出不在此伪造)
cilium-dbg bpf lb list
cilium-dbg bpf ct list global
cilium-dbg bpf metrics list
cilium-dbg map list

# 内核旁证(节点上;确认挂载而非解读策略)
bpftool prog show
bpftool map show

站内 eBPF 系列 讲 verifier/JIT/Map 内核实现;本篇只钉:运维默认停在 Cilium 语义层,bpftool 是旁证。


五、把业务症状接到观测层

业务现象 先看哪一层 再看哪一层
偶发连接超时,重试成功 Hubble drop reason / CT GC 指标 identity 是否在窗口内变化(第 2、13 篇)
稳定连通性失败,curl 对 IP 通、对 ClusterIP 不通 cilium-dbg bpf lb / Service 后端 KPR 是否启用、kube-proxy 是否双轨(第 6 篇)
明确「策略拒绝」感 Hubble --verdict DROPPED + policy denied CNP/NP 与 identity 标签(第 7 篇)
跨节点失败、同节点成功 Encryption status + 路径是否应进隧道(第 9 篇) 路由/Native vs Tunnel(第 5 篇)
Grafana 全绿、用户喊慢 Hubble 无 drop;看延迟是否在应用/DNS 不要用 agent OK 否证应用 P99

Events 与应用日志常只写 connection timed out。真正的 Policy deniedService backend not found、加密失败码在 Hubble / monitor / agent 日志里——应用超时是索引,不是根因库


六、观测口径的常见误判

  1. cilium status OK ≠ 策略按意图放行:摘要不展开每条 CNP。
  2. Hubble flow 环 100% ≠ 数据面丢包:是观测缓冲饱和。
  3. agent metrics 绿 ≠ Hubble metrics 在刮:两套开关、两套端口。
  4. bpftool 能看见 map ≠ 读懂 policy value:用 cilium-dbg 解码。
  5. drop 计数升高 ≠ 一定是 NetworkPolicy:还需 reason;可能是 CT 满、非法 SMAC、未启用转发路径等。
  6. L7 Envoy 指标绿 ≠ L3/L4 identity 策略绿:可选 L7 路径与 BPF 策略是不同跳(第 10 篇)。
  7. ClusterMesh 摘要 Connected ≠ 远端 identity 已在本地 policy 可用:应用第 11 篇同步检查。
  8. 把文档示例里的 FORWARDED 行粘进事故报告:只能说明字段长什么样,不能代替本环境证据。

七、接到排障轴

第 13 篇五轴的入口可压缩成:

先看的观测
通用丢包 Hubble drop reason → 再分流到下列轴
Policy deny Hubble Policy denied → identity list / policy selectors
Identity 漂移 标签变更窗口 + policy_implementation_delay + 远端同步
Service 黑洞 bpf lb / endpoints 空 → KPR 与后端就绪
加密失败 cilium-dbg encrypt status / WireGuard 链路 → 路径是否应加密

无真实 Cilium 集群时,只保留上述语义;不要把官方教程截图冒充本环境。排障结论必须能回指到本集群的 status、Hubble 或 metrics;引用官方输出只能说明字段形状。

值班最小仪表盘(语义清单)

  1. 控制面cilium status 失败节点数、controller 错误——回答「谁在管网络时病了」。
  2. 数据面压力:policy map pressure、CT 条目与 GC——回答「是否系统性撑不住」。
  3. 流判定:Hubble drop 比率(按 reason)——回答「疼在策略、服务还是别的」。

缺第 1 类会把数据面抖动当成唯一故事;缺第 2 类会在「偶发拒绝」时只盯单条 CNP;缺第 3 类会在 map 压力告警时对不上用户工单。三类齐备仍可能漏掉「指标全绿的加密路径错配」——那一轴必须以路径表与 encrypt status 开场。

时间对齐

Hubble 事件时间戳、Prometheus scrape、kubelet Event 的 lastTimestamp 常差数秒。先定事故窗口(例如变更前后五分钟),再在窗口内对齐,而不是拿「此刻」的 status 否证「十分钟前」的 DROPPED。


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

谱系

Cilium 可观测面叠合三条线:(1)经典 BPF 从过滤语言走到内核可编程包处理(McCanne & Jacobson, USENIX 1993;XDP:Höiland-Jørgensen et al., CoNEXT 2018);(2)Kubernetes 把策略与身份提升为一等对象后,失败首先表现为 identity/verdict 而非仅 IP 五元组;(3)Prometheus 拉取模型把 agent 自检与流聚合收成时间序列。本篇不发明新指标,只钉哪条线回答哪类问题

争论:SLO 钉在 agent 还是钉在 flow

A 侧:平台以 cilium status / endpoint ready / map pressure 做 SLO——贴近基础设施生命体征。
B 侧:应用团队以 Hubble drop 比率与合成探测成功率做 SLO——贴近租户体验。
双方都对,但违约 runbook 不同:A 先查 agent/kvstore/map;B 先查 CNP/Service/加密路径。把 A 的绿写成 B 的达标,是多租户平台最常见的假关闭。

开放问题

  1. Hubble 采样/环满与「真实丢包」归因对齐:在 ring 高占用时,DROPPED 事件是否系统性欠采样?可检验:固定生成可数的 policy deny,对比 observe 计数与 datapath drop 计数。
  2. map pressure 告警到「哪条 selector」的自动归因:官方已给手工 policy selectors 路径;能否稳定自动指向顶凶 selector 而不误报?入口:第 13 篇与上游 troubleshooting 专节。

参考资料

官方文档(A 级)

站内对照

论文谱系

实验台账

上一篇:ClusterMesh · 系列目录 · 下一篇:排障坐标系

读完这篇,下一步读什么

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

2026-08-16 · kubernetes / network

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

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


By .