Linux cilium-hubble 的 flow protocol L7 解码与 HTTP/gRPC 可见性开启

1次阅读

hubble observe 默认看不到 http/grpc 请求详情,因 cilium 默认关闭 l7 协议解码,仅显示 l3/l4 元数据;需启用 –enable-l7-proxy 等配置并验证三条件满足方可生效。

Linux cilium-hubble 的 flow protocol L7 解码与 HTTP/gRPC 可见性开启

为什么 hubble observe 默认看不到 HTTP/gRPC 请求详情

因为 Cilium 默认关闭 L7 协议解码,hubble observe 只显示网络层(L3/L4)元数据,比如源/目的 IP、端口、状态,但不会解析 HTTP 方法、路径、gRPC service/method。这不是 bug,是设计选择:L7 解码有 CPU 开销,且需明确 opt-in。

关键开关在 Cilium DaemonSet 的启动参数和 Hubble Server 配置里,不是靠客户端命令开启的。

  • --enable-l7-proxy 必须设为 true(Cilium agent 启动参数)
  • --l7-proxy-wait-bpf-program 推荐保持默认 true,避免 BPF 程序未就绪时丢流量
  • Hubble Server 必须启用 --enable-k8s-Event-handling(非必须但建议,否则缺失命名空间/Service 关联)

如何确认 L7 解码已实际生效

不能只看 Cilium ConfigMap 里写了 enable-l7-proxy: "true"——它只是配置项,真正起效要满足三个条件同时成立:

  • Cilium agent 进程启动时,ps aux | grep cilium-agent 能看到 --enable-l7-proxy=true
  • cilium status --verbose 输出中包含 L7 proxy: OK
  • hubble get flows --last 10 | jq '.[] | select(.l7 != NULL)' 能返回非空结果(说明已有 L7 流量被解码)

常见失败点:升级 Cilium 后没重启 agent;或用了 Helm 安装但忘了加 --set l7Proxy.enabled=true;或集群启用了 eBPF Host Routing 模式但没配好 redirect 策略。

hubble observe 查看 HTTP/gRPC 流量的正确姿势

直接跑 hubble observe 会混杂大量非 L7 流量,干扰判断。应该用过滤 + 字段投影:

  • 查 HTTP:hubble observe --type l7 --protocol http --output json | jq '.[0].l7.http'
  • 查 gRPC:hubble observe --type l7 --protocol grpc --output json | jq '.[0].l7.grpc'
  • 想看原始请求头?加 --follow 并注意 l7.http.request.headers 是数组,不是对象(格式为 [["user-agent","curl/7.68.0"]]

注意:--protocol 参数值必须小写且严格匹配(http 不是 HTTP),否则过滤失效;--type l7 是硬性前提,漏掉就看不到任何 L7 字段。

gRPC 可见性比 HTTP 更容易断链的原因

HTTP 解码依赖标准端口(80/443)或 ALPN 协商;gRPC 必须走 HTTP/2,且 Cilium 当前(v1.14+)仅支持 TLS 终止后的明文 HTTP/2 流量解码。这意味着:

  • 如果 client → ingress → service 是 TLS 穿透(ingress 不终止 TLS),Cilium 看不到明文 HTTP/2 帧,l7.grpc 字段为空
  • 若用 grpcurl 直连 ClusterIP(无 TLS),且端口不是 80/443/8080/8443,默认不触发 L7 代理,需显式加 --l7-protocol-port-mapping 配置
  • l7.grpc.status_code 只在 response 返回后才填充,request 流量里该字段不存在——别用它过滤 request

最稳妥的做法:让服务监听 443 或 8443,ingress 终止 TLS 后以明文 HTTP/2 转发到 backend,并确保 Cilium 的 --l7-protocol-port-mapping 包含对应端口映射。

text=ZqhQzanResources