Cilium Hubble 可观测性与运维排障
Cilium Hubble 可观测性与运维排障
Hubble 是什么
Hubble 是 Cilium 内嵌的可观测层,从 eBPF 的流事件 map 直接拿 L3/L4/L7 流日志,不经过 sidecar、不采样,提供:
- 流日志(flow):每一条 Pod 间通信(谁→谁、端口、协议、TLS、 verdict=FORWARDED/DROPPED、RTT、HTTP 方法/path)
- 服务拓扑:实时服务依赖图(hubble-ui)
- 指标: Prometheus 格式的 network/endpoint/policy 指标
eBPF (cil_from_container) ──flow events──▶ Hubble (in agent)
└─▶ hubble-relay ──gRPC──▶ hubble-ui / hubble observe / Prometheus
启用 Hubble
# values.yaml
hubble:
enabled: true
relay:
enabled: true
ui:
enabled: true
metrics:
enabled:
- dns:query;ignoreAAAA
- drop
- tcp
- flow
- http
cilium hubble enable --ui # CLI 快捷开启
cilium hubble port-forward & # 本地端口转发到 UI
# 浏览器打开 http://localhost:12000 看服务拓扑
常用观测命令
# 实时流日志(所有命名空间)
hubble observe
# 看被 DROP 的流(验证 NetworkPolicy 默认拒绝是否生效)
hubble observe --verdict DROPPED
# 看某个 Pod 的 HTTP 流量
hubble observe --pod default/nginx-xxx --protocol http
# 看 DNS 查询
hubble observe --protocol dns
# 看 L7 HTTP 详情(method/path/status)
hubble observe -o json | jq '.http'
Hubble 输出字段速查
| 字段 | 含义 |
|---|---|
source / destination | Pod 名 / identity / IP |
verdict | FORWARDED / DROPPED |
drop_reason | 被丢原因(policy denied / no route / NAT 失败) |
IP / TCP / UDP | 四层信息 |
http / kafka | L7 解析结果 |
RTT | 往返时延(网络质量) |
Summary | 一行摘要(如 HTTP/1.1 GET 200) |
cilium-cli 命令全集(运维必会)
cilium status # 整体健康(含 KPR/Hubbble/各组件)
cilium status --wait # 等就绪(CI 用)
cilium connectivity test # 内置连通性测试(同/跨节点 + Service + DNS)
cilium endpoint list # 所有 Endpoint 及其 policy/health 状态
cilium endpoint get <id> # 单个 Endpoint 详情
cilium endpoint policy get <id> # 该 Endpoint 生效的策略
cilium service list # 看 eBPF 里的 Service→backend 映射
cilium bpf lb list # eBPF LB map(KPR 核心,验证后端)
cilium bpf ct list # eBPF 连接跟踪
cilium bpf nat list # SNAT/DNAT 记录
cilium config view # 当前运行配置
cilium bugtool # 一键收集排障 bundle(给社区/厂商)
升级流程(关键)
Cilium 升级需要滚动且注意 eBPF 程序兼容:
# 1. 备份(operator 会保护 IPAM,但稳妥起见)
cilium status
# 2. 用 cilium-cli 做 preflight 检查(内核 / CRD / 依赖)
cilium preflight check
# 3. 升级 Helm release
helm upgrade cilium cilium/cilium \
--version <new> -n kube-system -f values.yaml
# 4. 观察每个节点的 agent 重启 + eBPF 重载
cilium status --wait
# 5. 跑连通性测试确认没回归
cilium connectivity test
升级本质是:新 agent 启动 → 卸载旧 eBPF 程序 → 加载新程序 → 重建 map。短暂窗口内策略/转发可能”双版本共存”,所以用 preflight 先验证。
常见故障表
| 故障 | 现象 | 根因 | 排查命令 |
|---|---|---|---|
| Cilium 未就绪 | cilium status 报 NotReady | 内核 < 5.10 不支持 eBPF | uname -r |
| Pod 网络不通 | 新建 Pod 无网络 | cilium-cni 没加载 / IPAM 耗尽 | cilium endpoint list、kubectl logs cilium-agent |
| 双份转发 / 偶发 RST | 连接被随机重置 | kube-proxy 没禁,与 KPR 冲突 | `ps aux |
| Hubble 无数据 | UI 空白 / observe 无输出 | relay 没起或端口不通 | cilium hubble enable、kubectl get svc -n kube-system hubble-relay |
| Service 负载不均 | 某 backend 很闲 | Maglev 表小 / lbAlgorithm=random | `cilium config view |
| NodePort 不通 | 节点端口连不上 | externalTrafficPolicy=Local 且该节点无 backend | cilium service list 看 backend 分布 |
| 大包丢 / TLS 超时 | 跨节点大请求失败 | MTU 不一致(VXLAN 1450) | ping -s 1400 -M do 两节点测 |
| 策略误伤 | 正常流量被 DROP | CNP/CCNP 写错 | hubble observe --verdict DROPPED + cilium endpoint policy get |
| 升级后网络抖动 | 短暂不通 | eBPF 重载窗口 | cilium preflight check 预检、滚动升级 |
与 eBPF 排障的联动
Hubble 看”流层”现象,../linux/ebpf/eBPF 排障实战 看”内核层”根因,配合用:
Hubble 看到 DROPPED + drop_reason=policy denied
→ 去 CNP/CCNP 找哪条规则(cilium endpoint policy get)
→ 若是更底层(如 BPF 程序没加载),用 bpftool prog list 看 eBPF 是否挂上
关联知识
- Cilium 知识总览 — 入口
- Cilium 架构与数据面组件 — Hubble 数据来源(eBPF flow map)
- Cilium Service 与 KPR 深入 —
cilium bpf lb list验证 KPR - ../linux/ebpf/eBPF 排障实战 — 内核层排障
- ../k8s/特性详解/OpenTelemetry Collector 深度运维 — 网络指标接入可观测栈
学习时间
| 阶段 | 时间 | 备注 |
|---|---|---|
| Hubble/运维 | 2026-07-16 | 完成:Hubble 架构、observe 命令、cilium-cli 全集、升级流程、故障表 |