news 2026/9/13 4:53:11

掌握 cilium-dbg fqdn cache:Cilium FQDN 代理缓存的查看与清理实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
掌握 cilium-dbg fqdn cache:Cilium FQDN 代理缓存的查看与清理实战指南

掌握 cilium-dbg fqdn cache:Cilium FQDN 代理缓存的查看与清理实战指南

【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium

cilium-dbg fqdn cache是 Cilium 数据路径排障中高频使用的命令组,用于管理 FQDN(完全限定域名)代理缓存——即 Cilium 在 DNS 层观测到的"域名 ↔ IP"映射数据。本文以仓库中 cilium-dbg fqdn cache 命令参考 为主体,结合 fqdn.go 命令实现、DNSLookup API 模型 与 pkg/fqdn 缓存核心实现,系统讲解该命令的完整参数、输出含义、底层原理与真实排障用法。读完本文,你将能够熟练地按端点、域名模式、数据来源过滤查看 FQDN 缓存,安全地强制清理过期条目,并理解缓存条目从产生到过期的完整生命周期。

为什么需要管理 FQDN 代理缓存

Cilium 的toFQDNs策略允许基于 DNS 域名而非 IP 编写网络策略。为了让策略引擎拿到"某个域名当前解析到哪些 IP",Cilium 内置了 DNS 代理(FQDN proxy):当端点的 DNS 查询经过代理时,代理会记录查询结果并写入一个带 TTL 与过期时间的缓存,供策略选择器(selector)使用,最终为这些 IP 分配基于 FQDN 的安全身份(identity)。

这个缓存就是cilium-dbg fqdn cache命令管理的对象。它回答了排障中最常见的问题:某个域名解析到的 IP 是否已被 Cilium 观测并纳入策略计算?与之配套的还有 cilium-dbg fqdn names(查看策略内部持有的 DNS 名称/正则状态)和 cilium-dbg fqdn(命令组入口)。

命令层级总览

cilium-dbg fqdn Manage fqdn proxy # 命令组入口 ├── cilium-dbg fqdn cache │ ├── cilium-dbg fqdn cache list # 列出缓存内容 │ └── cilium-dbg fqdn cache clean # 清理缓存 └── cilium-dbg fqdn names # 查看 DNS 名称 / 正则内部状态

命令树定义见 cilium-dbg/cmd/fqdn.go:fqdnCmd挂载cachenames子命令,cache又挂载listclean。顶层fqdn cache不带子命令时仅打印帮助信息。

查看 FQDN 代理缓存:cilium-dbg fqdn cache list

基本用法:

cilium-dbg fqdn cache list [flags]

不带任何参数时,命令通过 REST API 拉取全量FQDN 缓存,并输出如下格式的表格:

Endpoint Source FQDN TTL ExpirationTime IPs

参数详解

参数简写类型说明
--endpoint-estring只列出指定 endpoint ID 的缓存条目
--matchpattern-pstring只列出 FQDN 与匹配模式(matchpattern)相符的条目
--source-sstring只列出特定来源的条目,取值lookupconnection
--output-ostring输出格式:jsonyamljsonpath='{}'
--help-h显示帮助

从 init() 中的标志注册 可以看到这些标志与 CLI 变量的绑定关系。其中--outputcommand.AddOutputOption统一注册,因此输出格式能力与其他 cilium-dbg 命令保持一致。

输出列与 DNSLookup 模型一一对应

表格的每一行对应一个DNSLookup对象,其字段定义在 api/v1/models/dns_lookup.go(swagger 生成模型):

表头模型字段含义
Endpointendpoint-id发起这次 DNS 查询的端点 ID;为 0 表示由 agent 自身发起
Sourcesource该 FQDN↔IP 关联产生的原因:DNS 查询(lookup)或由 DNS 查询建立、仍在持续的连接(connection)
FQDNfqdnDNS 名称
TTLttlDNS 响应中的 TTL 值
ExpirationTimeexpiration-time该条数据在缓存中绝对过期时间(RFC3339 时间)
IPsips本次查询返回的 IP 地址列表,多个 IP 以逗号分隔
(表格未展示)lookup-time数据被接收的绝对时间

Source字段的两种取值在模型注释中有明确定义:"Either a DNS lookup or an ongoing connection to an IP that was created by a DNS lookup",即lookup(DNS 查询产生)与connection(由查询结果建立的存活连接产生),这也正是-s/--source参数的取值集合。

过滤与格式化实例

按端点过滤(需要指定-e,此时走GetFqdnCacheID接口):

cilium-dbg fqdn cache list --endpoint 725 cilium-dbg fqdn cache list -e 725 -s lookup

按域名模式过滤:

cilium-dbg fqdn cache list --matchpattern '*.github.com'

按来源过滤:

cilium-dbg fqdn cache list --source lookup cilium-dbg fqdn cache list --source connection

输出 JSON / YAML 供脚本或 jq 消费:

cilium-dbg fqdn cache list -o json cilium-dbg fqdn cache list -o jsonpath='{.items[0].fqdn}'

在 fqdn.go 的 listFQDNCache 实现 中,当指定--output时走command.PrintOutput(lookups)直接序列化[]*models.DNSLookup;否则用tabwriter打印对齐表格。注意一个细节:-e-s-p可以组合使用,且-e缺失时请求的是全量接口GetFqdnCache,命中 404(NotFound)时被静默处理,不会中断命令。

排障真实输出示例

策略排障文档 给出了 DNS 请求之后的典型输出:

# cilium-dbg fqdn cache list Endpoint Source FQDN TTL ExpirationTime IPs 725 lookup api.github.com. 3600 2023-02-10T18:16:05.842Z 140.82.121.6 725 lookup support.github.com. 3600 2023-02-10T18:16:09.371Z 185.199.111.133,185.199.109.133,185.199.110.133,185.199.108.133

随后可通过cilium-dbg ip list | grep <IP>验证这些 IP 是否已获得对应的 FQDN 身份标签:

# cilium-dbg ip list | grep -A 1 140.82.121.6 140.82.121.6/32 fqdn:api.github.com reserved:world

这条"缓存 → 身份"的验证链路,是定位toFQDNs策略"流量没被放行"类问题的最常用手段。

清理 FQDN 代理缓存:cilium-dbg fqdn cache clean

基本用法:

cilium-dbg fqdn cache clean [flags]

参数详解

参数简写类型说明
--force-fbool跳过删除确认
--matchpattern-pstring只删除 FQDN 与匹配模式相符的缓存条目

默认的安全交互流程

不加-f时,命令先预览即将删除的条目,再要求确认,避免误删:

# cilium-dbg fqdn cache clean Following cache entries are going to be deleted: Endpoint Source FQDN TTL ExpirationTime IPs 725 lookup api.github.com. 3600 2023-02-10T18:16:05.842Z 140.82.121.6 # (confirm) FQDN proxy cache cleared

从 cleanFQDNCache 实现 可以看到:未指定--force时先调用listFQDNCache()打印预览,再调用confirmCleanup()等待用户确认;确认通过后构造DeleteFqdnCache请求,带-p时通过SetMatchpattern设置匹配模式,成功后输出FQDN proxy cache cleared

跳过确认并定向清理:

cilium-dbg fqdn cache clean --force cilium-dbg fqdn cache clean -f -p '*.expired.example.com'

底层语义:强制过期而非删除

从缓存实现看,清理并不是简单地从字典里抹掉条目。pkg/fqdn/cache.go 中ForceExpire(expireLookupsBefore time.Time, nameMatch *regexp.Regexp)将匹配的条目按"过期时间早于给定时刻"强制置为过期并返回受影响域名集合;同时配套的DNSZombieMappings.ForceExpire(cache.go)会清理对应的 zombie(僵尸)映射。这意味着被清理的域名如果再次被查询或仍有存活连接,会依据新的 DNS 响应重新入缓存,符合 DNS 语义。匹配模式在缓存层以正则表达式形式参与过滤。

源码级原理剖析

CLI 层:REST 调用路径

cilium-dbg/cmd/fqdn.go 是纯客户端实现,三个核心动作对应三个 API:

动作CLI 函数REST API
列出全部/按源/按模式listFQDNCache()GET /policy/fqdn-cacheGetFqdnCache
列出指定端点listFQDNCache()GET /policy/fqdn-cache/{id}GetFqdnCacheID
清理缓存cleanFQDNCache()DELETE /policy/fqdn-cacheDeleteFqdnCache

API 客户端由api/v1/client/policy包提供,与 文档自动生成机制 保持一致:cmdref文档由命令本身生成,因此文档中的参数与真实 CLI 永远同步。

缓存核心:DNSCache 的生命周期

pkg/fqdn/cache.go 中的DNSCache是 FQDN 代理缓存的真正载体,关键方法包括:

  • Update(lookupTime, name, ips, ttl, ...):写入一次 DNS 查询结果,内部按 IP→条目(ipEntries)与名称→条目(nameEntries)双向索引维护(cache.go);
  • isExpiredBy(pointInTime):依据expiration = lookupTime + TTL判断过期(cache.go);
  • GC(now, zombies):周期性垃圾回收,处理 TTL 过期条目与 zombie 映射(cache.go);
  • ForceExpire(...):上文所述的强制过期入口(cache.go);
  • Dump()/DumpNames():输出快照,正是fqdn cache list表格与服务端响应序列化的数据来源(cache.go)。

其中DNSZombieMappings是 Cilium 的一个精巧设计:DNS TTL 过期但 TCP 连接仍存活时,IP→名称映射不能立刻删除(否则已建立连接会被策略拒绝),因此先转为 zombie 并在连接结束或 CT GC 后彻底回收。这也解释了Source=connection条目的存在意义。

相关命令:cilium-dbg fqdn names

与缓存管理配套的 cilium-dbg fqdn names 用于展示 Cilium 内部为 DNS 名称/正则表达式持有的状态(GetFqdnNames接口,见 fqdn.go),输出为 JSON,适合对比"策略注册的选择器"与"缓存中实际出现的名称"是否一致。

实战排障场景建议

  1. 域名解析了但流量不放行:先cilium-dbg fqdn cache list -e <endpoint>确认代理是否真的观测到该域名的映射,再cilium-dbg ip list | grep <IP>确认 IP 是否拿到fqdn:身份标签(链路示例见 troubleshooting.rst)。
  2. 怀疑缓存脏数据:用cilium-dbg fqdn cache clean -f强制清理全部缓存,或-p定向清理特定域名,触发重新解析。
  3. 关注身份数量toFQDNs的每个 IP 都会按标签组合分配安全身份。监控identity_label_sources{type="fqdn"}指标可检测 FQDN 身份是否接近耗尽;fqdn_selectors指标反映注册的toFQDNs选择器数量(详见 troubleshooting.rst)。
  4. 注意-p-e的组合list-e决定走单端点接口,其余过滤条件(-s-p)在两种接口下均可用。

使用注意事项

  • 所有子命令都继承父命令的通用标志:--config(配置文件,默认$HOME/.cilium.yaml)、-D/--debug-H/--host(服务端 API URI)、--log-driver--log-opt,远程排障时通过-H指向目标节点 API 即可。
  • Endpoint=0表示 agent 自身的查询,过滤端点时注意区分。
  • 缓存清理作用于整个 agent 的 FQDN 缓存(而非单个策略),clean是运维操作,生产环境建议先用list预览或配合-p收敛范围。
  • 本文所述命令基于当前仓库源码(cilium-dbg二进制);不同 Cilium 版本的行为以对应版本的cilium-dbg fqdn cache --help输出为准。

【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 4:50:25

Lithe-IDEA:专为Spring Boot工程师打造的轻量开源Java IDE

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 4:48:41

机器学习模型评估指标全解析:SD、SE、MSE、RMSE、MAE、R²辨析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 4:48:17

DVL源代码解析与水下定位精度验证实战

简介&#xff1a;本资源是一套面向水下机器人开发者与导航算法工程师的DVL&#xff08;多普勒速度测深仪&#xff09;数据处理与组合导航实现源码&#xff0c;聚焦水下定位核心难点&#xff0c;解决GPS失效环境下基于声学测速的连续高精度位姿估计问题。压缩包共24个文件&#…

作者头像 李华
网站建设 2026/9/13 4:48:10

微电网优化布局:MATLAB与PowerWorld的混合解决方案

1. 项目概述&#xff1a;微电网优化布局的技术挑战与解决方案微电网作为分布式能源接入配电网的关键载体&#xff0c;其布局优化直接影响着系统供电可靠性、电能质量和经济运行水平。传统规划方法往往基于经验规则或简化模型&#xff0c;难以应对现代配电网中可再生能源高比例渗…

作者头像 李华
网站建设 2026/9/13 4:47:50

自建CLI编排AI团队:终端里的多智能体协作实战

1. 为什么我放着现成的AI工具不用&#xff0c;非要自己写一个CLI先说说这件事的起因。过去一年多&#xff0c;我几乎每天都在终端里跟各种AI工具打交道。写代码用AI补全&#xff0c;查问题用AI对话&#xff0c;写提交信息用AI生成&#xff0c;甚至连周报都是AI帮忙润色。但用得…

作者头像 李华