deepflow icon indicating copy to clipboard operation
deepflow copied to clipboard

[BUG] agent standalone模式下ebpf采集不生效

Open qyzhaoxun opened this issue 1 year ago • 1 comments

Search before asking

  • [X] I had searched in the issues and found no similar feature requirement.

DeepFlow Component

Agent

What you expected to happen

standalone模式下agent ebpf采集器也能正常工作,将flow_log写入l7_flow_log

How to reproduce

在k8s环境下直接部署deepflow-agent daemonset,deepflow-agent容器启动后,在/var/log/deepflow-agent/目录正常生成l4_flow_log和l7_flow_log,不过l7_flow_log signal_source只有Packet,没有ebpf image

部署yaml信息: deepflow-agent.yaml.txt

DeepFlow version

9935-cfb3560378f755d37bb9b9c1e41305483b0eff4e Name: deepflow-agent community edition Branch: v6.5.3 CommitId: cfb3560378f755d37bb9b9c1e41305483b0eff4e RevCount: 9935 Compiler: rustc 1.75.0 (82e1608df 2023-12-21) CompileTime: 2024-03-27 02:15:14

DeepFlow agent list

No response

Kubernetes CNI

deepflow-agent是以hostnetwork方式运行在tke集群上

Operation-System/Kernel version

"Ubuntu 22.04 LTS" 5.15.0-94-generic

Anything else

deepflow-agent 日志

deepflow-agent.log

Are you willing to submit a PR?

  • [ ] Yes I am willing to submit a PR!

Code of Conduct

qyzhaoxun avatar Mar 31 '24 15:03 qyzhaoxun

@qyzhaoxun 本地看了下,有ebpf的数据。 image 你确认下,ebpf需要 kernel 版本大于 4.14+ 才支持。也看下有没有'ebpf collector init' 日志 image 把deepflow-agent.log 日志文件也发下

lzf575 avatar Apr 01 '24 03:04 lzf575

kernel版本上面提供了,agent的日志以及部署方式都提供了的,可以看下

qyzhaoxun avatar Apr 01 '24 13:04 qyzhaoxun

@yinjiping 看看 issue 正文中的 deepflow log 文件。里面有一些奇怪的 ebpf detach

sharang avatar Apr 01 '24 13:04 sharang

@qyzhaoxun 您好,我看日志没发现什么异常。 可执行下面命令(来看看数据统计)进行确认:

  • 进入POD
kubectl exec deepflow-agent-sgm5p -n deepflow -it -- bash
  • 查询统计
root@deepflow-agent-sgm5p:/# deepflow-ebpfctl tracer show
Tracer             socket-trace
Bpf buffer         socket-trace-bpf-linux-common
Workers            1
Perf-Pages-Count   128
Events Lost        0
Probes Count       6
State              TRACER_RUNNING
Adapt              1
data_limit_max     1024

-------------------- Queue ---------------------------
worker 0 for queue, de 68 en 68 lost 0 alloc failed 0 burst 7325125 queue size 0 cap 65535

SUM dequeue 68 enqueue 68 lost 0 alloc failed 0 burst count 7325125

-------------------- Protocol ------------------------
- Unknown   (0) 1822436
- HTTP1     (20) 2122072
- HTTP2     (21) 1213292
- Dubbo     (40) 2
- MySQL     (60) 125647271
- PgSQL     (61) 3690
- Redis     (80) 42822
- MongoDB   (81) 1840
- MQTT      (101) 981
- AMQP      (102) 6004204
- DNS       (120) 2503711
- TLS       (121) 422145

多次执行上面的命令,如果上面各个协议的数据统计大于0并且多次执行观察是递增的,说明eBPF获取数据正常。

可主动产生些事件让eBPF捕获, 例如在节点上执行:curl www.baidu.com (观察HTTP1统计变化)

yinjiping avatar Apr 01 '24 15:04 yinjiping

感谢,这块使用v6.4可以看到ebpf正常工作,并且能将http/dns协议采集到并且成功落盘,但是https和http2协议采集不到,怀疑是不是类似问题

deepflow-agent配置文件 image 配置文件下能看到针对kube-proxy-bin确实hook了相关uprobe函数 image 但是l7_flow_log下一直没有看到对应https的日志 image 另外使用deepflow-ebpfctl tracer show没有看到TLS/HTTP2有增加 image

qyzhaoxun avatar Apr 09 '24 14:04 qyzhaoxun

@yuanchaoa 来继续看看,并确认 standalone 和普通模式差异点在哪些环节,确认是否还有其他问题。

sharang avatar Apr 09 '24 14:04 sharang

@qyzhaoxun 您好,确认下下面这些类型符号是否存在:

go:itab.*net.TCPConn,net.Conn
go:itab.*crypto/tls.Conn,net.Conn
go:itab.*golang.org/x/net/http2/h2c.rwConn,net.Conn
go:itab.*golang.org/x/net/http2/h2c.bufConn,net.Conn
go:itab.*github.com/armon/go-proxyproto.Conn,net.Conn
go:itab.*google.golang.org/grpc/internal/credentials.syscallConn,net.Conn

eBPF会利用上面这些类型符号地址,进行conn的判断来获取必要的数据。(怀疑上面符号的名字在kube-proxy-bin中存在差异)

nm /proc/518263/root/usr/local/bin/kube-proxy-bin | grep "Conn,net.Conn"

yinjiping avatar Apr 10 '24 02:04 yinjiping

image

nm: /proc/615963/root/usr/local/bin/kube-proxy-bin: no symbols 这样是表明支持不了吗?

qyzhaoxun avatar Apr 10 '24 03:04 qyzhaoxun

@qyzhaoxun 是的,没有符号表,就没有办法了这是个前提条件, 如果 Golang version >= 1.13 and < 1.18,可尝试配置: golang-symbol: 试试,但是遗憾的是kube-proxy-bin的版本显示是1.20

yinjiping avatar Apr 10 '24 04:04 yinjiping

不过上面日志不是显示的INFO Uprobe了一些函数吗?这个是实际上没有uprobe成功啊

qyzhaoxun avatar Apr 10 '24 05:04 qyzhaoxun

不过上面日志不是显示的INFO Uprobe了一些函数吗?这个是实际上没有uprobe成功啊

这个日志打印的不合理,图中的 nil 实际上是一个失败的行为,我们会改为 Warning 并给出明确的失败说明

image

sharang avatar Apr 10 '24 06:04 sharang

不过上面日志不是显示的INFO Uprobe了一些函数吗?这个是实际上没有uprobe成功啊

这个是不是有配置配置项golang-symbol: ?,它尝试一把解析,但是最终还是没有把go:itab.*net.TCPConn,net.Conn解析出来。

yinjiping avatar Apr 10 '24 06:04 yinjiping