DeepFlow Agent注册失败、协议解析、资源识别与配置方式如何排查?
摘要:目录 1. 前言 2. 部署问题排查 3. 通用排查案例 4. 其余常见问题 1. 前言 1.1 适用范围 本文档适用于 DeepFlow Agent v6.6 及以上版本。 1.2 运行权限及内核要求 确保环境满足运行权限及内核要求。 1
目录
1. 前言
2. 部署问题排查
3. 通用排查案例
4. 其余常见问题
1. 前言
1.1 适用范围
本文档适用于 DeepFlow Agent v6.6 及以上版本。
1.2 运行权限及内核要求
确保环境满足运行权限及内核要求。
1.3 排查前检查
检查项
要求
版本
Agent/Server 为 LTS 版本,且 Agent ≤ Server 版本
部署方式
主机进程部署 或 K8s Pod 部署
工具
已安装与 Server 同版本的 deepflow-ctl
等待时间
Agent 部署后等待 5 分钟以上再排查(初始化需要时间)
网段
Agent IP 在 Server 的 local_ip_ranges 网段内
2. 部署问题排查
2.1 主机进程部署
主机进程部署通过 deepflow-agent 二进制直接运行在主机上,默认使用 38086 端口。
Agent 注册失败排查
按以下顺序检查:
检查 Domain 与 Agent Group Config 配置
检查 Server 网段配置
检查主机名是否重名
检查是否通过 LB 连接 Server
2.1.1 检查 Domain 与 Agent Group Config 配置
主机进程部署需要完成两个步骤:
创建 Host Domain(类型为 agent_sync)
创建 Agent Group Config(采集器组配置)
这两个步骤缺一不可。agent_sync 类型 Domain 只能创建一个,多了会导致注册异常。
排查步骤:
检查 Host Domain 是否已创建:
# 确认列表中存在类型为 agent_sync 的 Domain
deepflow-ctl domain list
检查 Agent Group Config 是否已创建:
deepflow-ctl agent-group-config list
解决方案:
如果缺少 Host Domain:
unset DOMAIN_NAME
DOMAIN_NAME="legacy-host" # 自定义 domain 名称
cat << EOF | deepflow-ctl domain create -f -
name: $DOMAIN_NAME
type: agent_sync
EOF
Domain 用于让 deepflow-agent 以自同步方式将服务器网络信息发送至 deepflow-server,类似于监控 K8s 集群时创建 K8s Domain。
如果缺少 Agent Group Config,通过 deepflow-ctl 创建:
inputs:
resources:
workload_resource_sync_enabled: true
采集器组配置用于在无法通过云平台 API 同步资源的场景下,同步物理服务器或虚拟机的资源信息。
注意事项:
Domain 只需创建一个,创建多个会导致 Agent 注册异常
两步操作缺一不可
2.1.2 检查 Server 网段配置
DeepFlow Server 通过 local_ip_ranges 配置识别局域网网段。如果 Agent 的 IP 不在该配置范围内,会导致:
Agent 无法正常注册
某些 IP 在 metrics 中被聚合为 0.0.0.0(广域网 IP)
排查步骤:
获取 Agent 的 IP 地址
检查 Server 配置中的 local_ip_ranges:
# kubectl edit cm -n deepflow deepflow
# 默认配置:
local_ip_ranges:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- 169.254.0.0/15
- 224.0.0.0-240.255.255.255
确认 Agent IP 是否在配置的网段范围内。
解决方案:
更新 Server 配置,将 Agent 所在网段添加到 local_ip_ranges:
更新 Server 配置文档
关于 0.0.0.0 广域网 IP
在 DeepFlow 中,0.0.0.0 代表广域网 IP。当 IP 不在 local_ip_ranges 中时:
数据类型
IP 展示
说明
Metrics
0.0.0.0
聚合为广域网 IP
Request Log
真实 IP
保留原始 IP
判断方法:在 Request Log 面板中通过 is_internet tag 判断,值为 true 时是广域网。
如果需要在 Metrics 中也展示真实 IP,将对应网段添加到 Server 的 local_ip_ranges 配置中。
网卡内/外网类型判断规则
网卡配置
子网类型判断
单个网卡仅有单个 IP,且未包含在 local_ip_ranges 中
自动识别为外网
单个网卡有多个 IP,任意 1 个 IP(含 IPv4、IPv6)未包含在 local_ip_ranges 中
自动识别为外网
如果发现网卡的子网类型识别错误,检查该网卡的所有 IP 是否都在 local_ip_ranges 配置范围内。
2.1.3 检查主机名是否重名
多台主机使用相同的主机名会导致注册失败。
排查步骤:
确认环境中是否存在重名主机。
解决方案:
方式一(推荐):修改 DeepFlow Agent 配置
编辑 Agent 注册配置(默认路径 /etc/deepflow-agent/deepflow-agent.yaml):
# Agent 注册时使用自定义名称上报
# https://github.com/deepflowio/deepflow/blob/main/agent/config/deepflow-agent.yaml#L35
override-os-hostname: "unique-hostname-001"
重启 Agent 后生效。
方式二:修改系统主机名
hostnamectl set-hostname unique-hostname-001
不推荐直接修改主机名,可能影响其他依赖主机名的应用。通过配置覆盖更灵活。
2.1.4 检查是否通过 LB 连接 Server
如果 Agent 通过负载均衡器(LB)连接 Server,可能导致注册失败。详见:
3.1 通过 LB 连接 Server 导致的注册失败
2.2 K8s Pod 部署
K8s 部署通过 Helm Chart 安装 deepflow-agent 到集群中,默认以 DaemonSet 形式运行在每个节点上。
Agent 注册失败排查
2.2.1 检查 Pod 运行时间与初始化状态
DeepFlow 部署包含多个组件(Server、Agent、Database 等),首次部署需要较长的初始化时间:
数据库初始化
Server 初始化
Agent 连接 Server 完成注册
排查步骤:
确认所有 Pod 状态正常:
kubectl get pods -n deepflow
所有 Pod 应处于 Running 状态。
等待 5-6 分钟后检查 Agent 注册状态:
deepflow-ctl agent list
在 K8s 部署中,Agent Pod 的 ConfigMap 中 Server 地址配置为 Server Service Name。由于 Server 和 Agent 在同一集群内,网络连通性一般不会有问题。注册未完成通常是因为初始化未完成,等待即可。
如果等待 5 分钟后仍未注册成功,尝试重启 Agent Pod:
kubectl delete pods -n deepflow -l app=deepflow-agent
注意事项:
确保 Agent 能够匹配到网卡的 interface_regex 配置,否则无法采集数据
网卡匹配正则配置参考
2.2.2 检查是否通过 LB 连接 Server
如果 Agent 通过负载均衡器(LB)连接 Server,可能导致注册失败。详见:
3.1 通过 LB 连接 Server 导致的注册失败
数据同步问题排查
2.2.3 检查 K8s 集群资源同步
DeepFlow 对 K8s 资源的展示有特定规则,某些场景下资源会被过滤掉。
1. 当前资源没有请求/响应流量
DeepFlow 认为没有流量的资源没有展示意义。如果某个 Pod 从未接收或发送过请求,该资源可能不会在数据中展示。
排查方法:
检查该资源是否有业务流量
尝试发送测试请求到该资源
2. 没有上层/下层资源关联
DeepFlow 依赖资源的上下层关系进行展示,孤立资源可能被过滤:
资源类型
不展示的情况
Namespace
该 Namespace 下没有任何 Pod
Service
Service 没有关联任何 Pod
Pod
Pod 没有上层资源(如 Deployment、DaemonSet、StatefulSet),仅为单独的 Pod
DeepFlow 认为没有完整上下层关系的资源没有展示意义。
排查方法:
检查资源是否有关联的上下层资源
确认 Pod 是否通过控制器(Deployment/DS/STS)创建
3. 资源不是 K8s 原生资源
如果资源是通过自定义 Operator 创建的(非 K8s 原生 Kind),DeepFlow 可能无法正确识别其上层资源关系。
示例:kube-prometheus 项目中的 Prometheus Pod,其上层 Kind 为 Prometheus(自定义 CRD),而非 K8s 原生的 Deployment/StatefulSet。
排查方法:
检查资源的 ownerReferences 字段,确认是否为 K8s 原生资源
如果是自定义 CRD,目前 DeepFlow 无法识别
K8s 资源不展示的常见原因
原因
说明
解决方案
没有流量
资源从未有请求/响应
发送测试流量
没有上下层关系
孤立资源(单独的 Pod、未关联 Pod 的 Service 等)
确保资源有完整的层级关系
非原生资源
通过自定义 Operator 创建
目前可能无法完美支持
3. 通用排查案例
3.1 通过 LB 连接 Server 导致的注册失败
默认 server 会下发自己的节点 IP 给 agent 作为控制/数据面通信 IP。
当 Agent 无法直接连接 Server,必须通过 LB 时,需要配置以下四个参数:
参数
说明
文档链接
proxy_controller_ip
用于设置 agent 与 server 通信的控制面通信 IP
配置文档
proxy_controller_port
对应的端口号
配置文档
ingester_ip
用于设置 agent 与 server 通信的数据面通信 IP
配置文档
ingester_port
对应的端口号
配置文档
配置示例:
在 agent-group-config 中添加:
global:
communication:
proxy_controller_ip: "10.0.0.100" # LB IP
proxy_controller_port: 30035
ingester_ip: "10.0.0.100"
ingester_port: 30033
3.2 缺少协议数据
DeepFlow 支持多种应用层协议解析,但 v6.5 版本后,为了降低资源开销,Agent 默认仅解析以下协议:
HTTP
HTTP2/gRPC
MySQL
Redis
Kafka
DNS
TLS
其他协议需要手动启用,例如:PostgreSQL、MongoDB、RabbitMQ 等。
开源版不支持 Oracle 协议。
完整协议支持列表
解决方案:
如果需要解析其他协议,通过 deepflow-ctl 添加:
在配置中添加需要启用的协议:
processors:
request_log:
application_protocol_inference:
enabled_protocols:
- HTTP
- HTTP2
- MySQL
- Redis
- Kafka
- DNS
- TLS
- PostgreSQL # 手动添加
3.3 eBPF 加载失败
典型错误日志:
[eBPF] WARN func load_obj__progs() [user/load.c:546] bcc_prog_load() failed. name: df_T_exit_write, Invalid argument errno: 22
[eBPF] WARN func ebpf_obj_load() [user/load.c:854] eBPF load programs failed. (errno 22)
[eBPF] INFO release object ("socket-trace-bpf-linux-common") ...
[eBPF] INFO release object done
[eBPF] WARN func tracer_bpf_load() [user/tracer.c:525] bpf load "socket-trace-bpf-linux-common" failed, error:Invalid argument (22).
[src/trident.rs:2339] ebpf collector error: EbpfRunningError
eBPF 加载失败是因为 DeepFlow 对当前使用的系统或内核版本不适配。
解决方案:
情况一:使用通用操作系统
如果你使用的是通用操作系统(Ubuntu、CentOS、Debian、Fedora 等),按以下步骤收集信息并反馈给社区:
查看内核版本:
uname -a
hostnamectl
运行内核结构偏移量检查工具:
使用 show-kernel-struct-offset 项目:
# 下载并编译工具
git clone https://github.com/deepflowio/show-kernel-struct-offset.git
cd show-kernel-struct-offset
make
将结果发送到 DeepFlow 社区:
在 GitHub Issues 中提交
或发送到 DeepFlow 开源社区群
社区会根据提供的信息适配对应的内核版本。
情况二:使用自定义系统或内核
如果你使用的是自定义操作系统或内核,需要自行适配:
参考 PR 示例:自定义内核适配示例
前提条件检查:
在排查 eBPF 问题时,先确认环境满足要求:
运行权限及内核要求
3.4 配置识别异常
可能的原因:
配置下发延迟或失败
Agent 未正确识别 Server 下发的配置
配置格式错误导致解析失败
Agent 版本不支持该配置项
排查步骤:
1. 查看组件版本
# 查看 Agent commit 版本
deepflow-agent -v
# 查看 Server commit 版本
deepflow-server -v
2. 查看 Agent Group Config 配置
# 确认 Server 端配置是否更新
deepflow-ctl agent-group-config list $AGENT_GROUP_CONFIG_NAME -o yaml
3. 查看 Agent 使用的 Server 真正下发的配置
deepflow-ctl trisolaris.agent-check config \
--cip $AGENT_IP \
--cmac $AGENT_MAC \
--cid $DOMAIN_ID \
--gid $AGENT_GROUP_ID
联系方式:
GitHub Issues: https://github.com/deepflowio/deepflow/issues
DeepFlow 开源社区群
常见问题
Q1: DeepFlow Agent 支持哪些操作系统?
DeepFlow Agent 支持主流的 Linux 发行版,包括:
Ubuntu 18.04+(推荐 20.04+)
CentOS 7+ / RHEL 7+
Debian 10+
Fedora 30+
内核要求:Linux 内核版本 ≥ 4.14,推荐 5.x 以上以获得更好的 eBPF 支持。
Q2: Agent 注册失败如何快速定位问题?
按以下顺序排查:
等待 5 分钟以上(初始化需要时间)
检查 Domain 和 Agent Group Config 是否创建(主机部署)
检查 Agent IP 是否在 Server 的 local_ip_ranges 内
检查主机名是否重复
检查是否通过 LB 连接 Server
Q3: 为什么某些 IP 在 Metrics 中显示为 0.0.0.0?
当 IP 不在 Server 的 local_ip_ranges 配置中时,DeepFlow 会将其识别为广域网 IP,在 Metrics 中聚合为 0.0.0.0。将对应网段添加到 local_ip_ranges 配置中即可解决。
在 Request Log 中可以通过 is_internet=true tag 确认该 IP 是否被识别为广域网。
Q4: eBPF 加载失败怎么办?
eBPF 加载失败通常是因为内核版本不适配。请:
确认内核版本 ≥ 4.14(推荐 5.x+)
使用 show-kernel-struct-offset 工具收集信息
将结果提交到 GitHub Issues 或 DeepFlow 社区群
Q5: 如何启用 PostgreSQL/MongoDB 等非默认协议的解析?
通过 agent-group-config 配置文件添加:
processors:
request_log:
application_protocol_inference:
enabled_protocols:
- PostgreSQL
- MongoDB
保存后 Agent 会自动拉取新配置,无需重启。
Q6: K8s 集群中某些资源看不到是什么原因?
常见原因:
没有流量:资源从未有请求/响应
孤立资源:Pod 没有上层控制器(Deployment/DS/STS)
非原生资源:通过自定义 CRD 创建,DeepFlow 无法识别
Q7: Agent 和 Server 版本有什么要求?
Agent 版本必须 ≤ Server 版本。建议使用 LTS 版本,非 LTS 版本请升级后再排查问题。
相关资源
DeepFlow 官方文档
DeepFlow GitHub
运行权限及内核要求
协议支持列表
GitHub Issues
文档版本:v1.1
最后更新:2026-03-18
适用版本:DeepFlow Agent v6.5+
