ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

Cilium Operator 指标查询实战:掌握 cilium-operator-generic metrics 命令的完整用法与底层原理

Cilium Operator 指标查询实战:掌握 cilium-operator-generic metrics 命令的完整用法与底层原理 Cilium Operator 指标查询实战掌握 cilium-operator-generic metrics 命令的完整用法与底层原理【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium导读cilium-operator-generic metrics是 Cilium Operator通用发行版内置的指标查询命令用于直接访问运行中的 Operator 实例获取其当前暴露的 Prometheus 指标快照。本文以 Documentation/cmdref/cilium-operator-generic_metrics.md 为主干结合仓库内命令实现operator/cmd/metrics.go、operator/cmd/metrics_list.go与 API 服务端源码完整讲解该命令的子命令结构、全部参数、多种输出格式并深入到 Operator API Server、OpenAPI 端点与指标收集Dump的源码级实现帮助你既能在生产环境中熟练排障也能理解指标数据从 Operator 内部到终端屏幕的完整链路。命令概览为什么需要 CLI 查询 Operator 指标在 Kubernetes 集群中Cilium Operator 负责集群级控制面职责如 IP 地址管理IPAM、身份标识IdentityGC、端点 GC、ClusterMesh 同步等。运维人员通常通过 Prometheus 抓取:9963端口的指标来做监控告警但当需要快速验证某个控制面组件是否正常、某个指标当前的具体数值、或排查 Operator API 连通性时直接调用内置 CLI 是最快捷的方式。metrics命令正是为此设计它通过 Operator 自身的 HTTP API默认监听localhost:9234获取当前指标集合并在终端以表格或结构化格式呈现无需额外部署任何抓取组件。该命令包含两个子命令cilium-operator-generic metrics list—— 列出 Operator 的全部或经正则过滤后的指标cilium-operator-generic metrics dump由源码中operatorFeatures.NewDumpCmd()注册见下文源码分析—— 指标转储命令。同时在 Operator 的主命令见 Documentation/cmdref/cilium-operator-generic.md下还提供status、troubleshoot、hive等运维命令与metrics共同构成 Operator 的日常排障工具箱。metrics list列出 Operator 指标命令语法与参数cilium-operator-generic metrics list [flags]参数简写类型默认值说明--help-h--显示 list 子命令的帮助信息--match-pattern-pstring空仅显示名称匹配该正则表达式的指标Show only metrics whose names match matchpattern--output-ostring空输出格式支持json、yaml或jsonpath{}--server-address-sstringlocalhost:9234Operator API Server 的地址Address of the operator API server默认情况下不带任何参数执行cilium-operator-generic metrics list会连接localhost:9234上的 Operator API获取全部指标并以对齐的表格输出。默认表格输出命令的默认输出由 Go 标准库text/tabwriter生成见 operator/cmd/metrics_list.go共三列Metric Labels ValueMetric指标名称即 Prometheus 注册表中的指标名Labels该指标样本携带的标签集合格式为keyvalue多个标签以空格分隔Value指标的浮点数值。从源码实现看标签列的组装逻辑为遍历metric.Labelsmap将每个键值对格式化为keyvalue后用空格拼接若无标签则该列为空label : if len(metric.Labels) 0 { labelArray : []string{} for key, value : range metric.Labels { labelArray append(labelArray, fmt.Sprintf(%s%s, key, value)) } label strings.Join(labelArray, ) } fmt.Fprintf(w, %s\t%s\t%f\n, metric.Name, label, metric.Value)使用 match-pattern 过滤指标当 Operator 暴露的指标数量较多时可以使用-p/--match-pattern传入正则表达式只展示名称匹配的指标。其实现位于 operator/cmd/metrics_list.go客户端取回全部指标后通过regexp.Compile(matchPattern)编译用户输入再对每个metric.Name执行re.MatchString进行过滤re, err : regexp.Compile(matchPattern) if err ! nil { logging.Fatal(logger, fmt.Sprintf(Cannot compile regex: %s, err)) } metrics : make([]*models.Metric, 0, len(res.Payload)) for _, metric : range res.Payload { if re.MatchString(metric.Name) { metrics append(metrics, metric) } }注意若传入非法的正则表达式命令会以Cannot compile regex: ...错误信息直接终止。由于过滤发生在客户端CLI 侧match-pattern为空字符串时空正则匹配所有指标名因此等价于列出全部指标。示例——只查看与 identity GC 相关的指标cilium-operator-generic metrics list -p identity.*gc示例——查看所有cilium_operator_前缀的指标cilium-operator-generic metrics list --match-pattern ^cilium_operator_使用 output 输出结构化数据-o/--output参数由command.AddOutputOption(MetricsListCmd)注入见 pkg/command/output.go支持三种取值json、yaml和jsonpath{}。当指定该参数时命令会跳过表格渲染调用command.PrintOutput(metrics)输出结构化结果见 operator/cmd/metrics_list.go。输出 JSON 示例cilium-operator-generic metrics list -o json输出 YAML 示例cilium-operator-generic metrics list --output yaml结构化输出的数据模型为models.Metric定义于 api/v1/operator/models每个指标对象包含name、labelsmap、value三个字段。结构化输出便于将结果通过jq、yq等工具进一步处理或直接接入脚本自动化。指定 server-address 连接远程/自定义端口-s/--server-address的默认值localhost:9234与 Operator 自身的 API 监听配置保持一致。从 operator/api/cell.go 可以看到该默认值在源码中的定义// OperatorAPIServeAddrDefault is the default ip:port value on which to serve // api requests from the operator. OperatorAPIServeAddrDefault localhost:9234在 Operator 主命令中可通过--operator-api-serve-addr参数见 Documentation/cmdref/cilium-operator-generic.md修改 API 监听地址例如--operator-api-serve-addr0.0.0.0:9234或自定义端口。相应地CLI 侧需要使用-s指向同一地址才能连通。常见用法# 连接本地默认地址 cilium-operator-generic metrics list -s localhost:9234 # 连接自定义端口 cilium-operator-generic metrics list --server-address 10.0.0.5:9234metrics dump指标转储子命令除了listmetrics命令还注册了第二个子命令。在 operator/cmd/metrics.go 的初始化函数中可以看到完整的注册逻辑func init() { MetricsCmd.AddCommand(MetricsListCmd) MetricsCmd.AddCommand(operatorFeatures.NewDumpCmd()) }其中operatorFeatures.NewDumpCmd()来自 pkg/metrics/features/operator 包用于转储 Operator 的功能特性feature状态指标。这意味着cilium-operator-generic metrics家族实际上包含指标列表与特性状态转储两个维度前者关注数值型监控指标后者关注开关型能力状态二者互补。底层原理从 CLI 到 Operator API 的调用链路客户端生成的 OpenAPI 客户端metrics list并非直接读取本地文件或内存而是通过 HTTP 调用 Operator 的 API 服务。客户端由 OpenAPI 工具生成位于 api/v1/operator/client核心调用代码operator/cmd/metrics_list.goc : client.NewHTTPClientWithConfig( strfmt.Default, client.DefaultTransportConfig().WithHost(operatorAddr)) res, err : c.Metrics.GetMetrics(metricsApi.NewGetMetricsParams()) if err ! nil { logging.Fatal(logger, fmt.Sprintf(Cannot get metrics list: %s, err)) }即以--server-address指定的地址创建 HTTP 客户端调用GET /v1/metrics/端点取回指标数组若请求失败Operator 未运行、端口不通、地址错误等命令输出Cannot get metrics list: ...并终止。服务端Operator API Server服务端由 hive cell 组织监听地址由--operator-api-serve-addr配置默认localhost:9234。服务启动逻辑见 operator/api/server.go它加载 OpenAPI 规范、注册各 REST 处理器并启动 HTTP 服务其中指标处理器被绑定到MetricsGetMetricsHandlerrestAPI.MetricsGetMetricsHandler s.metricsHandler值得注意的两点实现细节若--operator-api-serve-addr为空字符串服务会同时在127.0.0.1:0与[::1]:0两个 IPv4/IPv6 回环地址上监听随机端口见 operator/api/server.go以保证纯 IPv4 或纯 IPv6 环境均可用监听 socket 设置了SO_REUSEADDR与SO_REUSEPORToperator/api/server.go使 Operator 重启后能更快重新绑定端口。指标响应处理器与 DumpMetricsGET /v1/metrics/的响应处理器定义于 operator/api/metrics.gofunc (h *metricsHandler) Handle(params metrics.GetMetricsParams) middleware.Responder { m, err : opMetrics.DumpMetrics(h.registry) if err ! nil { return metrics.NewGetMetricsFailed() } return metrics.NewGetMetricsOK().WithPayload(m) }处理器从 hive 注入的 Prometheus Registry 中收集当前全部指标样本成功则返回200 OK及指标数组失败则返回500。对应的 API 规范定义在 api/v1/operator/openapi.yaml/v1/metrics/下的get操作响应为Metric对象数组。DumpMetrics指标类型的序列化规则指标收集的核心函数DumpMetrics位于 operator/metrics/legacy.go。它调用reg.Gather()获取 Prometheus 格式的指标族metric family然后按类型分别处理指标类型序列化行为COUNTER输出计数器当前值GAUGE输出当前 gauge 值UNTYPED输出无类型值HISTOGRAM计算并输出 p50、p90、p99 三个分位数通过附加quantile标签值为0.5、0.9、0.99区分SUMMARY按摘要预定义的每个 quantile 输出一条记录quantile标签取fmt.Sprintf(%g, q.GetQuantile())的格式函数头部注释明确描述了这一规则operator/metrics/legacy.goFor histogram metrics, three entries are emitted with a quantile label set to 0.5, 0.9, and 0.99 respectively, each holding the computed quantile value. For summary metrics, one entry per predefined quantile is emitted with the corresponding quantile label.因此当你通过metrics list看到同一指标名下出现多条带quantile0.5、quantile0.9、quantile0.99标签的记录时说明该指标底层是 Histogram 类型。分位数计算依赖metrics.HistogramQuantiles见 pkg/metrics 包。相关配置项让 Operator 的指标体系可观测理解metrics命令后与之配套的 Operator 启动参数可以帮你构建完整的指标观测体系。以下参数均定义于 Documentation/cmdref/cilium-operator-generic.md配置项默认值作用--operator-api-serve-addrlocalhost:9234Operator API Server 监听地址metrics list -s必须与之匹配--enable-metrics-启用 Prometheus 指标暴露抓取端--operator-prometheus-serve-addr:9963Prometheus 指标抓取端口供 Prometheus/自建监控抓取--operator-prometheus-enable-tls-为 Prometheus 指标服务启用 TLS--operator-prometheus-tls-cert-file-TLS 证书文件PEM 编码--operator-prometheus-tls-key-file-TLS 私钥文件PEM 编码--operator-prometheus-tls-client-ca-files-mTLS 客户端 CA 证书一旦配置即启用 mTLS--metrics-sampling-interval5m0s内部指标采样间隔--controller-group-metrics-指定为哪些控制器组启用指标支持all/none--double-write-metric-reporter-interval1m0sDouble Write 指标上报器的刷新间隔两者分工明确--operator-prometheus-serve-addr面向 Prometheus 抓取标准 Prometheus 文本格式--operator-api-serve-addr面向metrics等 CLI 命令的 HTTP 查询OpenAPI JSON 格式。排障时若metrics list报连接失败可优先检查--operator-api-serve-addr是否被修改、Operator 是否存活配合cilium-operator-generic status验证。常见排障流程示例以下操作串展示了metrics命令在真实排障场景中的用法1. 确认 Operator API 连通性并列出全部指标cilium-operator-generic metrics list2. 聚焦某一类指标如 BGP 控制面cilium-operator-generic metrics list --match-pattern bgp3. 输出 JSON 交给脚本处理cilium-operator-generic metrics list -o json | jq .[] | select(.name | contains(identity))4. 排查 IPAM 相关指标并同时查看标签cilium-operator-generic metrics list -p ipam -o yaml关联命令与延伸阅读metrics命令是 Documentation/cmdref/cilium-operator-generic.md 主命令下 SEE ALSO 列表中的一员与之并列的运维命令还包括cilium-operator-generic status—— 显示 Operator 运行状态cilium-operator-generic troubleshoot—— 运行控制面连通性排查工具含 ClusterMesh、KVStore 子命令cilium-operator-generic hive—— 检查 hive 依赖注入图与配置。其中troubleshoot侧重连通性KVStore、ClusterMeshmetrics侧重指标数值二者结合可覆盖 Operator 排障的主要场景。若要进一步扩展可参考 cilium-dbg metrics 等命令它们同样提供了 Cilium Agent 侧的指标查询能力形成 Agent 与 Operator 两侧完整的指标观测闭环。总结cilium-operator-generic metrics是 Cilium Operator 内置的轻量级指标查询入口metrics list支持正则过滤-p、结构化输出-o与自定义 API 地址-s背后是由 Operator API Server默认localhost:9234提供GET /v1/metrics/端点、由DumpMetrics统一处理 Counter/Gauge/Histogram/Summary 各类型序列化的完整链路。掌握这一命令及其源码实现你就能在集群控制面出现异常时快速定位 Operator 侧的真实指标状态与 Prometheus 监控数据相互印证显著缩短排障路径。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

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