
Cilium 安全策略查看命令详解cilium-dbg policy get 用法、输出格式与底层实现【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/ciliumcilium-dbg policy get是 Cilium 数据面代理cilium-dbg中用于查看节点级安全策略Policy的命令通过 Cilium Agent 暴露的 REST API 拉取策略仓库Policy Repository中的全部规则与当前策略修订号。本文基于当前仓库中的命令参考文档 cilium-dbg_policy_get.md 及其底层实现完整讲解该命令的语法、全部参数、输出格式、端到端调用链、数据模型以及它被标记为 deprecated 的原因和可用的替代命令适合需要排查安全策略下发状态、验证策略生效情况的开发者与运维人员阅读。一、命令定位与弃用背景cilium-dbg policy get的子命令get定义于 cilium-dbg/cmd/policy_get.go其命令级描述为Display policy node information (deprecated)它隶属于cilium-dbg policy命令组见 cilium-dbg/cmd/policy.go组描述为 Manage security policies即管理安全策略。需要注意的关键事实该命令在客户端与服务端两侧均已被显式标记为deprecated已弃用客户端方法注释// Deprecated, to be removed in v1.19见 pkg/client/policy.go服务端 API 数据模型注释// Deprecated, will be removed in v1.19见 api/v1/models/policy.go。这意味着在 v1.19 及以后版本中该命令及对应 API将被移除。当前版本仍可正常使用但新脚本与自动化工具应优先考虑后文介绍的替代方案。二、命令语法与全部选项命令的完整语法为cilium-dbg policy get [flags]该命令不接受位置参数全部配置通过 flags 完成。命令自身定义的选项如下选项简写类型说明--help-h布尔显示get子命令的帮助信息--output-ostring输出格式取值json、yaml、jsonpath{}其中-o/--output选项由command.AddOutputOption(policyGetCmd)动态挂载到命令上见 cilium-dbg/cmd/policy_get.go其实现位于 pkg/command/output.go。继承自父命令的全局选项policy get同时继承cilium-dbg根命令的全部全局选项选项说明--config string配置文件路径默认$HOME/.cilium.yaml-D, --debug启用调试信息输出-H, --host stringCilium Agent 服务端 API 的 URI 地址--log-driver strings日志输出端点例如syslog--log-opt map日志驱动选项例如formatjson例如当需要连接非默认位置的 Agent 时cilium-dbg -H unix:///var/run/cilium/cilium.sock policy get三、典型用法与输出格式3.1 默认输出文本模式在不指定-o时命令将策略内容与修订号以纯文本形式打印cilium-dbg policy get对应的实现逻辑见 cilium-dbg/cmd/policy_get.gofmt.Printf(%s\nRevision: %d\n, resp.Policy, resp.Revision)输出由两部分构成策略 JSON 内容即策略仓库中全部规则的 JSON 表示带两空格缩进Revision 修订号策略仓库当前版本号每次策略变更都会递增用于判断策略是否已同步到最新。3.2 结构化输出json / yaml / jsonpath使用-o/--output可将整个models.Policy对象包含policy与revision两个字段以指定格式导出# JSON 输出 cilium-dbg policy get -o json # YAML 输出 cilium-dbg policy get -o yaml # JSONPath 提取例如只取修订号 cilium-dbg policy get -o jsonpath{.revision}当指定了输出选项时命令分支走command.PrintOutput(resp)见 cilium-dbg/cmd/policy_get.go由 pkg/command/output.go 中的PrintOutputWithType按outputType完成格式化。JSONPath 语法与 Kuberneteskubectl -o jsonpath的表达式约定保持一致{}内为取值路径适合在脚本中提取单一字段。3.3 命令组内的相关子命令policy get是cilium-dbg policy命令组的成员之一同组还包括见 cilium-dbg_policy.mdcilium-dbg policy selectors显示 SelectorCache 中缓存的 selector 信息cilium-dbg policy subject-selectors显示主体subjectSelectorCache 缓存信息cilium-dbg policy wait等待所有 endpoint 更新到指定策略修订号。四、端到端调用链与底层实现从 CLI 输入到最终返回策略内容policy get经历了一条清晰的调用链理解它可以帮你准确判断问题出在客户端还是服务端。第 1 步CLI 命令入口policyGetCmd的Run函数在 cilium-dbg/cmd/policy_get.go 中调用client.PolicyGet()若出错则Fatalf(Cannot get policy: %s\n, err)直接终止。第 2 步客户端 API 封装client.PolicyGet()定义于 pkg/client/policy.gofunc (c *Client) PolicyGet() (*models.Policy, error) { params : policy.NewGetPolicyParams().WithTimeout(api.ClientTimeout) resp, err : c.Policy.GetPolicy(params) if err ! nil { return nil, Hint(err) } return resp.Payload, nil }它通过api.ClientTimeout设置请求超时向 Agent 的/policyREST 端点发起 GET 请求对应 swagger 生成的GetPolicy客户端方法定义于 api/v1/client/policy 目录。第 3 步Agent 端 HTTP HandlerAgent 端处理函数getPolicyHandler.Handle位于 daemon/restapi/policy.gofunc (h *getPolicyHandler) Handle(params policyrest.GetPolicyParams) middleware.Responder { ruleList, rev : h.Repo.Search() policy : models.Policy{ Revision: int64(rev), Policy: policy.JSONMarshalRules(ruleList), } h.Log.Debug(Policy Get Request, logfields.PolicyRevision, policy.Revision) return policyrest.NewGetPolicyOK().WithPayload(policy) }核心动作是调用策略仓库h.Repo即pkg/policy.Repository的Search()方法一次性取回全部规则与当前修订号。第 4 步策略仓库读取Search()实现在 pkg/policy/repository.gofunc (p *Repository) Search() (types.PolicyEntries, uint64) { p.mutex.RLock() defer p.mutex.RUnlock() return p.searchRLocked(), p.GetRevision() }读取时加读锁RLock保证并发安全且不阻塞策略写入searchRLocked()遍历p.rules返回全部PolicyEntry见同文件第 176-184 行GetRevision()通过原子操作返回修订号见 pkg/policy/repository.go。第 5 步序列化输出规则列表通过JSONMarshalRules序列化为带缩进的 JSON 字符串pkg/policy/repository.gofunc JSONMarshalRules(rules types.PolicyEntries) string { b, err : json.MarshalIndent(rules, , ) if err ! nil { return err.Error() } return string(b) }因此默认文本输出中看到的策略内容就是这条 JSON 字符串这也解释了为什么-o json的输出中policy字段是一个嵌套的字符串而非对象——它本身就是经过序列化的 JSON。五、响应数据模型解析policy get返回的响应体对应 swagger 模型Policy定义于 api/v1/models/policy.gotype Policy struct { // Policy definition as JSON. Policy string json:policy,omitempty // Revision number of the policy. Incremented each time the policy is // changed in the agents repository Revision int64 json:revision,omitempty }字段类型含义policystring策略定义内容为 JSON 字符串revisionint64策略修订号Agent 策略仓库每变更一次即递增revision是排查策略下发问题时的关键指标如果cilium-dbg policy get返回的修订号与cilium-dbg policy wait所等待的目标修订号不一致说明策略尚未在 Agent 侧完全生效或存在下发延迟。六、弃用原因与替代命令该命令被弃用的原因从源码注释可以直接看出它返回的是节点级、全量规则列表的简单转储h.Repo.Search()直接返回全部PolicyEntry粒度粗糙、内容冗长不利于脚本化解析与大规模集群中的定向查询。仓库中已有的替代方案包括cilium-dbg policy selectors与cilium-dbg policy subject-selectors查询 SelectorCache 中缓存的 selector 信息对应 Agent 端getPolicySelectorsHandler与getPolicySubjectSelectorsHandler见 daemon/restapi/policy.go以及客户端封装PolicyCacheGet()、SubjectPolicySelectorsGet()见 pkg/client/policy.go可查看策略选择器在 Agent 内的缓存状态诊断粒度更细。cilium-dbg bpf policy get直接查询数据面 BPF 策略映射见 cilium-dbg/cmd/bpf_policy_get.go用于验证策略是否真正下发到了 eBPF 数据路径是确认数据面生效情况的权威手段。Kubernetes 侧在 K8s 环境中策略的声明式管理应直接使用kubectl get ciliumnetworkpolicy / ciliumclusterwidenetworkpolicy查看 CRD 资源本身。七、实践建议与注意事项优先使用结构化输出在自动化脚本或 CI 中推荐-o json或-o jsonpath{.revision}避免解析人读格式注意弃用时限规划 v1.19 升级时需将依赖cilium-dbg policy get或/policyREST API 的工具迁移到上述替代方案区分数据面与控制面policy get反映的是 Agent 策略仓库控制面状态若要确认 eBPF 数据面实际生效的策略应结合cilium-dbg bpf policy list/bpf policy get使用超时控制客户端请求带api.ClientTimeout超时见 pkg/client/policy.go在大规模策略仓库场景下若响应超时可检查 Agent 端日志中的Policy Get Request调试记录含PolicyRevision字段见 daemon/restapi/policy.go。八、小结cilium-dbg policy get以一条命令覆盖了读取节点全量策略 获取修订号的完整链路CLIcilium-dbg/cmd/policy_get.go→ 客户端封装pkg/client/policy.go→ Agent REST Handlerdaemon/restapi/policy.go→ 策略仓库读锁查询与序列化pkg/policy/repository.go。尽管它已进入弃用倒计时v1.19 移除其修订号 规则转储的交互模型、-o json/yaml/jsonpath的输出约定以及 selector 缓存与 BPF 映射等替代排查路径依然是理解 Cilium 安全策略体系的重要入口。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考