
Cilium 本地端点 eBPF 端点表巡检指南cilium-dbg bpf endpoint list 命令深度解析【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium导读cilium-dbg bpf endpoint list是 Cilium 数据面排障的核心命令之一用于直接读取内核中维护本地端点local endpoint的 eBPF Hash Map名为cilium_lxc以「IP 地址 → 端点元信息」的形式展示每个本地容器的实时数据面状态。本文以该命令的命令行参考文档为主体结合cilium-dbg/cmd命令实现与pkg/maps/lxcmap的 Map 封装源码完整讲解命令语法、输出格式、底层数据结构与各字段含义并给出与delete、endpoint get等命令配合使用的排障思路。读完本文你将能够熟练使用该命令定位本地端点在数据面的注册情况、核对端点 ID 与安全身份SecID、排查端点信息缺失或异常问题。命令速览从命令行参考说起cilium-dbg bpf endpoint list的命令行参考定义位于 Documentation/cmdref/cilium-dbg_bpf_endpoint_list.md其核心用途一句话即可概括List local endpoint entries列出本地端点条目。完整命令语法如下cilium-dbg bpf endpoint list [flags]该命令支持的主要选项选项说明-h, --help显示list子命令的帮助信息-o, --output string指定输出格式支持json、yaml、jsonpath{}三种取值作为cilium-dbg bpf endpoint命令树的一部分它还会继承来自父命令cilium-dbg的通用选项继承选项说明--config string配置文件路径默认是$HOME/.cilium.yaml-D, --debug启用调试消息-H, --host string服务端 API 的 URI--log-driver strings日志输出端点示例syslog--log-opt map日志驱动选项示例formatjson在命令树中该命令隶属于 cilium-dbg bpf endpointLocal endpoint map与之同级的还有 cilium-dbg bpf endpoint deleteDelete local endpoint entries。换句话说list负责读delete负责删两者共享同一张 eBPF 端点表。实现剖析一条命令背后的完整调用链命令行参考文档本身只给出语法与选项要真正用好它需要理解其实现。该命令的源码位于 cilium-dbg/cmd/bpf_endpoint_list.go其执行流程可以拆解为四步1. 权限校验common.RequireRootPrivilege(cilium bpf endpoint list)由于命令需要直接访问内核中的 eBPF Map挂载于 BPF 文件系统必须以 root 权限或具备 BPF 访问能力的特权进程运行否则会在这一步直接退出。2. 打开端点 eBPF Mapm, err : lxcmap.OpenMap(log) if err ! nil { os.Exit(1) }OpenMap位于 pkg/maps/lxcmap/lxcmap.go其注释明确指出cilium_lxcMap 必须预先由 Cilium Agent 初始化cilium-dbg只是以只读方式打开已存在的 Map// OpenMap opens the pre-initialized LXC map for access. // This should only be used from components which arent capable of using hive - mainly the cilium-dbg. // It needs to initialized beforehand via the Cilium Agent. func OpenMap(logger *slog.Logger) (Map, error) { m, err : bpf.OpenMap(bpf.MapPath(logger, mapName), EndpointKey{}, EndpointInfo{}) ... }这意味着一个重要的前提如果当前节点上 Cilium Agent 尚未运行或该 Map 未被初始化命令会打开失败并退出退出码 1。这也解释了为什么在刚安装 Cilium 但 Agent 尚未就绪时执行该命令会报错。3. 全量转储Dumpif err : m.Dump(bpfEndpointList); err ! nil { os.Exit(1) }Dump将 Map 中所有条目转储为一个map[string][]string结构key 为 IP 地址字符串value 为端点信息的字符串表示列表其底层调用bpf.Map.Dump逐个遍历哈希表条目。此外lxcmap还提供了返回强类型结构的DumpToMap()lxcmap.go内部使用DumpWithCallback得到map[netip.Addr]EndpointInfo供其他组件做程序化读取。4. 按输出选项渲染if command.OutputOption() { if err : command.PrintOutput(bpfEndpointList); err ! nil { os.Exit(1) } return } TablePrinter(ipAddressTitle, localEndpointInfoTitle, bpfEndpointList)这是命令的行为分水岭指定了-o/--output进入机器可读输出分支按json、yaml或jsonpath渲染map[string][]string结构未指定使用TablePrintercilium-dbg/cmd/helpers.go渲染终端表格表头固定为IP ADDRESS与LOCAL ENDPOINT INFO两列内部通过tabwriter对齐值字符串中若包含换行会逐行缩进输出。默认表格中每条记录第一列是 IP 地址第二列是由EndpointInfo.String()生成的格式化字符串形如id1 sec_id1 flags0x0000 ifindex0 mac... nodemac... parent_ifindex0 rt_info:0底层原理cilium_lxc 端点表的键值结构命令读取的cilium_lxc是一个eBPF Hash Maplxcmap.go声明时指定了最大条目数// MaxEntries represents the maximum number of endpoints in the map MaxEntries 65535即单节点上该 Map 最多容纳 65535 个本地端点条目。包级说明见 pkg/maps/lxcmap/doc.go该 Map 由哈希表实现包含所有本地端点的条目以EndpointKey为键、EndpointInfo为值。KeyEndpointKeyIP 地址EndpointKey内嵌bpf.EndpointKey本质是(IP 地址, 掩码)对地址族IPv4/IPv6由newEndpointKey自动检测lxcmap.go// newEndpointKey returns an EndpointKey based on the provided IP address. The // address family is automatically detected func newEndpointKey(addr netip.Addr) *EndpointKey { return EndpointKey{EndpointKey: bpf.NewEndpointKey(addr, 0)} }因此一张 Map 中会同时存在 IPv4 与 IPv6 两类键。写入时WriteEndpointlxcmap.go会把同一个端点同时写入其 IPv6 地址与 IPv4 地址两个键所以一个端点通常在列表中占据两行一个 IPv6 键 一个 IPv4 键。此外节点自身会作为特殊 host 条目写入 MapaddHostEntry/SyncHostEntrylxcmap.go其Flags置位EndpointFlagHost列表输出中该条目的String()会直接显示为(localhost)。ValueEndpointInfo端点元信息EndpointInfo是 Map 的值结构源码注释强调其必须与 BPF 侧 C 结构体struct endpoint_info定义于bpf/lib/eps.h保持内存布局一致lxcmap.go字段类型对齐名含义IfIndexuint32ifindex端点网络接口索引Unuseduint16unused保留未用LxcIDuint16lxc_id本地端点 IDFlagsuint32flags标志位见下方枚举RTInfouint32rt_info路由信息编码为 32 位MACmac.MACmac端点容器 vethMAC 地址NodeMACmac.MACnode_mac节点侧 MAC 地址SecIDuint32sec_id安全身份 IDSecurity Identity主机字节序ParentIfIndexuint32parent_ifindex父接口索引Padpad2uint32pad填充对齐Flags字段的可取值lxcmap.go定义了端点的数据面属性标志常量值含义EndpointFlagHost1该条目代表 host主机本身EndpointFlagAtHostNS2端点位于主机网络命名空间EndpointFlagSkipMasqueradeV44对远端流量跳过 IPv4 伪装masqueradeEndpointFlagSkipMasqueradeV68对远端流量跳过 IPv6 伪装这些标志在 Agent 写入端点时由 getBPFValue 根据端点的IsAtHostNS()、SkipMasqueradeV4()、SkipMasqueradeV6()等属性置位。输出字符串字段映射EndpointInfo.String()lxcmap.go决定默认表格中LOCAL ENDPOINT INFO列的展示内容return fmt.Sprintf(id%-5d sec_id%-5d flags0x%04X ifindex%-3d mac%s nodemac%s parent_ifindex%-3d rt_info:%d, v.LxcID, v.SecID, v.Flags, v.IfIndex, v.MAC, v.NodeMAC, v.ParentIfIndex, v.RTInfo)对应关系为id→LxcID即本地端点 ID对应cilium-dbg endpoint list中显示的 Endpoint IDsec_id→SecID安全身份 ID可与cilium-dbg identity list的结果对照判断策略身份是否符合预期flags→Flags十六进制展示如0x0001表示 host 条目ifindex→IfIndex容器侧接口索引mac/nodemac→ 端点 MAC 与节点 MACparent_ifindex→ 父接口索引rt_info:→ 路由信息。实战用法与输出示例场景一默认表格输出直接在节点上Agent 正常运行、具备 root 权限执行cilium-dbg bpf endpoint list输出为两列表格IP ADDRESS/LOCAL ENDPOINT INFO例如IP ADDRESS LOCAL ENDPOINT INFO 10.0.0.1 id123 sec_id5678 flags0x0000 ifindex21 macaa:bb:cc:dd:ee:ff nodemac11:22:33:44:55:66 parent_ifindex0 rt_info:0 fe80::... id123 sec_id5678 flags0x0000 ifindex21 macaa:bb:cc:dd:ee:ff nodemac11:22:33:44:55:66 parent_ifindex0 rt_info:0 10.0.0.254 (localhost)注以上为示意数据真实输出以当前节点实际端点和 MAC 为准。观察要点同一端点 ID 常出现两行——IPv4 键与 IPv6 键host 条目显示(localhost)。场景二JSON / YAML 机器可读输出需要把结果交给脚本、监控系统或做字段级解析时cilium-dbg bpf endpoint list -o json cilium-dbg bpf endpoint list -o yaml输出结构为map[string][]stringIP 地址 → 端点信息字符串数组例如 JSON 形态大致为{ 10.0.0.1: [ id123 sec_id5678 flags0x0000 ifindex21 macaa:bb:cc:dd:ee:ff nodemac11:22:33:44:55:66 parent_ifindex0 rt_info:0 ] }注意机器可读输出中的值仍是String()生成的字符串而非结构化对象若需字段级处理可再配合jsonpath提取 IP 键集合例如cilium-dbg bpf endpoint list -o jsonpath{.}或使用jsonpath{range .*}{}{\n}{end}遍历所有条目值。场景三与 delete 命令配合的排障流程cilium-dbg bpf endpoint list与 cilium-dbg bpf endpoint delete 是读-删组合。delete实现cilium-dbg/cmd/bpf_endpoint_delete.go要求精确提供一个 IP 参数cilium-dbg bpf endpoint delete IP典型排障路径用cilium-dbg bpf endpoint list观察 Map 中是否存在某容器的端点条目若端点数据面状态异常可先用cilium-dbg endpoint list/cilium-dbg endpoint get ID对照控制面视图确认存在脏条目例如端点已删除但 Map 残留时使用cilium-dbg bpf endpoint delete IP手动清理对应 IP 键。需要特别强调的是该命令读取的是数据面eBPF Map的直接视图与控制面KVStore / CRD 中的端点状态并不完全等价。两者不一致时正是排查端点同步问题如身份漂移、接口索引错乱、MAC 未更新的切入点。使用前提与注意事项Agent 必须已初始化 Mapcilium_lxc由 Cilium Agent 创建并维护cilium-dbg仅以只读方式打开见 lxcmap.go 注释。Agent 未运行或 BPF 文件系统不可用时命令会失败。需要 root / 特权命令内部强制RequireRootPrivilege普通用户执行会直接退出。只能查看本地端点Map 只包含本节点上的端点条目跨节点端点不在此 Map 中相关视图请使用cilium-dbg bpf ipcache list或cilium-dbg fqdn cache list等其他 BPF 命令。哈希表上限Map 最大条目数为 65535MaxEntries极端规模节点上可通过条目数快速评估是否接近容量水位。同一端点的多键现象端点同时注册 IPv4 与 IPv6 两个键计数端点时应按id去重而非简单按行数统计。小结cilium-dbg bpf endpoint list是 Cilium 本地数据面端点注册表cilium_lxceBPF Hash Map最直接的查看入口。通过本文可以掌握命令的完整语法与输出选项默认表格 / JSON / YAML / JSONPath、底层键值结构EndpointKeyEndpointInfo及每个字段LxcID、SecID、Flags、IfIndex、MAC、ParentIfIndex等的数据面语义以及与delete命令组合的排障方法。结合 cilium-dbg/cmd/bpf_endpoint_list.go 与 pkg/maps/lxcmap/lxcmap.go 两份源码即可在需要时随时回溯命令行为背后的完整实现链路。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考