文章

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 / destinationPod 名 / identity / IP
verdictFORWARDED / DROPPED
drop_reason被丢原因(policy denied / no route / NAT 失败)
IP / TCP / UDP四层信息
http / kafkaL7 解析结果
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 不支持 eBPFuname -r
Pod 网络不通新建 Pod 无网络cilium-cni 没加载 / IPAM 耗尽cilium endpoint listkubectl logs cilium-agent
双份转发 / 偶发 RST连接被随机重置kube-proxy 没禁,与 KPR 冲突`ps aux
Hubble 无数据UI 空白 / observe 无输出relay 没起或端口不通cilium hubble enablekubectl get svc -n kube-system hubble-relay
Service 负载不均某 backend 很闲Maglev 表小 / lbAlgorithm=random`cilium config view
NodePort 不通节点端口连不上externalTrafficPolicy=Local 且该节点无 backendcilium service list 看 backend 分布
大包丢 / TLS 超时跨节点大请求失败MTU 不一致(VXLAN 1450)ping -s 1400 -M do 两节点测
策略误伤正常流量被 DROPCNP/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 是否挂上

关联知识

学习时间

阶段时间备注
Hubble/运维2026-07-16完成:Hubble 架构、observe 命令、cilium-cli 全集、升级流程、故障表