ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Cilium `cilium-dbg map get` 命令详解:查看 BPF Map 用户态缓存内容

Cilium `cilium-dbg map get` 命令详解:查看 BPF Map 用户态缓存内容 Ciliumcilium-dbg map get命令详解查看 BPF Map 用户态缓存内容【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/ciliumcilium-dbg map get是 Cilium 调试工具集中用于查看指定 BPF Map 用户态缓存内容的核心命令。在排查数据路径问题如 IP 缓存、NAT 转换、策略表项异常时它可以直接从 Cilium Agent 的 API 读取内存中的 Map 快照而不必深入 BPF 内核对象。读完本文你将掌握该命令的完整用法、输出格式的语义、与相邻命令map list、map events、bpf系列的配合方式以及命令背后的源码实现原理。本文对应的命令参考文档为 Documentation/cmdref/cilium-dbg_map_get.md该文件由cilium-dbg cmdref自动生成本文在其实用骨架基础上结合仓库源码进行纵深解析。命令概览面向用户态缓存的 Map 查看器cilium-dbg map get的命令定位是Display cached content of given BPF map即显示指定 BPF Map 的缓存内容。注意这里的两个关键词cached content缓存内容该命令读取的是 Cilium Agent 在用户态维护的 Map 镜像cache而不是直接读取内核中的 BPF Map 对象given BPF map指定的 BPF Map命令必须传入一个 Map 名称作为参数指定要查看哪一个 Map。这一点与cilium-dbg bpf系列命令见 cilium-dbg/cmd/bpf.go定位为 Direct access to local BPF maps形成分工bpf系列提供对本地 BPF Map 的直接访问而map系列则面向用户态缓存的存取。从命令树上看map get归属于map父命令cilium-dbg/cmd/map.go其定位为Access userspace cached content of BPF maps父命令下目前挂载了三个子命令子命令作用cilium-dbg map list列出所有已打开的 BPF Mapcilium-dbg map get name显示指定 BPF Map 的缓存内容cilium-dbg map events name显示指定 BPF Map 的事件流实时变化基本用法与参数说明命令的标准语法为cilium-dbg map get name [flags]其中name是要查询的 BPF Map 名称为必填参数。官方示例cilium map get cilium_ipcache说明命令参考文档中的示例使用cilium map get写法这是旧版 CLI 名称cilium的遗留当前仓库中该二进制已更名为cilium-dbg见 cilium-dbg/cmd/root.go 中Use: cilium-dbg两者行为一致。命令级选项Options选项说明-h, --help显示get子命令的帮助信息-o, --output string指定输出格式支持json、yaml、jsonpath{}其中-o/--output是最实用的参数默认输出为人类可读的表格而通过-o json或-o yaml可以拿到结构化数据便于脚本解析和二次处理。例如cilium-dbg map get cilium_ipcache -o json cilium-dbg map get cilium_ipcache -o yaml cilium-dbg map get cilium_ipcache -o jsonpath{.cache[0].key}继承自父命令的全局选项以下选项对所有cilium-dbg子命令生效同样适用于map get选项说明--config string配置文件路径默认$HOME/.cilium.yaml-D, --debug启用调试消息-H, --host string连接服务端 API 的 URI默认指向本地 Cilium Agent 的 Unix Socket--log-driver strings日志端点例如syslog--log-opt map日志驱动选项例如formatjson-H/--host在远程调试场景中尤为重要当需要从集群外部节点查看某个 Agent 节点上的 Map 缓存时可以通过该参数指定目标节点 Agent 的 API 地址。输出格式详解理解表格各列含义不带-o参数时命令以对齐表格形式输出缓存条目。表格列头为Key Value State Error从 cilium-dbg/cmd/map_get.go 的实现可以看出每个缓存条目对应BPFMapEntry模型的四个字段KeyMap 条目键ValueMap 条目值State期望执行的动作Desired Action取值为ok、insert或deleteError执行期望动作时最近一次看到的错误信息无错误则为空。State列的枚举定义可以在 api/v1/models/b_p_f_map_entry.go 中确认State 值含义ok该条目当前与内核 Map 同步正常insert该条目待插入内核 Map缓存与内核存在差异delete该条目待从内核 Map 删除缓存与内核存在差异因此当State列出现大量insert/delete而Error列出现报错时说明 Cilium 的用户态缓存与内核 BPF Map 之间存在同步延迟或同步失败这是定位策略/路由不生效类问题的重要线索。两种特殊输出情形printMapEntries函数还处理了两种特殊情形Cache is disabled目标 Map 未启用用户态缓存此时BPFMap.Cache字段为nilCache is empty缓存已启用但当前为空len(Cache) 0例如 Map 刚创建、尚未写入任何条目。这两种提示并非报错而是说明该 Map 没有可展示的缓存条目。是否启用缓存可以在cilium-dbg map list的输出中预先确认。源码级解析命令背后发生了什么map get的实现非常简洁完整逻辑集中在 cilium-dbg/cmd/map_get.go 的mapGetCmd中Run: func(cmd *cobra.Command, args []string) { if len(args) 0 || args[0] { Fatalf(map name must be specified) } params : daemonAPI.NewGetMapNameParams().WithName(args[0]).WithTimeout(api.ClientTimeout) resp, err : client.Daemon.GetMapName(params) if err ! nil { Fatalf(%s, err) } m : resp.Payload if m nil { return } if command.OutputOption() { if err : command.PrintOutput(m); err ! nil { os.Exit(1) } return } printMapEntries(m) },其执行链路可概括为四步参数校验args[0]为空时直接报错退出即map name must be specified构造 API 请求通过daemonAPI.NewGetMapNameParams().WithName(args[0])生成请求参数并设置api.ClientTimeout超时调用服务端接口client.Daemon.GetMapName(params)请求 Cilium Agent 的 REST API/map/{name}端点resp.Payload即*models.BPFMap渲染输出若指定了-o输出选项则走结构化输出JSON/YAML/JSONPath否则调用printMapEntries打印表格。响应数据模型接口返回的BPFMap模型定义在 api/v1/models/b_p_f_map.go// BPFMap BPF map definition and content // swagger:model BPFMap type BPFMap struct { // Contents of cache Cache []*BPFMapEntry json:cache // Path to BPF map Path string json:path,omitempty }可见一次响应同时携带了 Map 在内核中的挂载路径Path与缓存条目Cache。单条缓存记录BPFMapEntry的字段为key、value、desired-action、last-error这正是表格四列的数据来源。实战工作流结合相邻命令进行排查第一步用map list确认哪些 Map 启用了缓存先通过 cilium-dbg/cmd/map_list.go 实现的map list查看所有已打开的 BPF Mapcilium-dbg map list输出列头为Name Num entries Num errors Cache enabledNameMap 名称取路径的 basenameNum entries缓存条目数缓存未启用时显示unknownNum errors存在last-error的条目数Cache enabled是否启用了用户态缓存。如需一次查看所有 Map 的完整缓存内容可追加--verbose标志cilium-dbg map list --verbose它会对每个 Map 逐一调用printMapEntries输出与map get相同的四列表格。该标志在 cilium-dbg/cmd/map_list.go 中注册mapListCmd.Flags().BoolVar(verbose, verbose, false, Print cache contents of all maps)。第二步对目标 Map 执行map get确认cilium_ipcache缓存启用后查看其具体内容cilium-dbg map get cilium_ipcache cilium-dbg map get cilium_ipcache -o jsonIP 缓存cilium_ipcache是 Cilium 数据路径中最常排查的 Map 之一它维护 IP 地址到安全身份identity的映射直接影响策略与转发的正确性。若某条路由或策略表现异常先检查其缓存条目是否存在、State是否为ok。第三步用map events观察实时变化若想观察 Map 缓存条目的动态增删例如在触发新连接后确认条目是否及时插入可使用cilium-dbg map events name实现见 cilium-dbg/cmd/map_event_list.go它持续输出 Map 的事件流配合map get的静态快照可以判断缓存同步是否正常工作。第四步按需转向bpf系列直接访问内核 Map如果怀疑用户态缓存与内核实际状态不一致需要直接查看内核 BPF Map 时可改用cilium-dbg bpf系列命令如cilium-dbg bpf ipcache list、cilium-dbg bpf ct list。其定位为 Direct access to local BPF mapscilium-dbg/cmd/bpf.go与map系列用户态缓存的视角互补两者对比使用即可确认缓存与内核是否漂移。常见问题与注意事项提示map name must be specifiedname是必填参数直接运行cilium-dbg map get不带参数会立即报错退出。提示Cache is disabled目标 Map 未启用用户态缓存属于正常现象应改用cilium-dbg bpf系列命令查看。提示连接失败map get依赖与本地 Cilium Agent 的通信请确认 Agent 正常运行远程场景需用-H指定正确的 API URI。二进制名称差异命令参考文档中示例为cilium map get ...旧名cilium当前仓库的二进制名称为cilium-dbgcilium-dbg/cmd/root.go执行时请以实际环境中的二进制名为准。小结cilium-dbg map get是 Cilium 排障工具箱中查看指定 BPF Map 用户态缓存的关键命令。掌握它的前提是理解用户态缓存与内核 BPF Map之间的差异前者通过 Agent REST API 提供易读的结构化快照含ok/insert/delete三种期望状态与错误信息后者则需借助bpf系列命令直连内核。将map list、map get、map events与bpf系列组合使用即可完成从缓存是否存在到缓存与内核是否一致的完整排查链路。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进