在 Kubernetes 中,自定义资源(CRD)是一种扩展 API 的机制,可以使用 Kubernetes APIServer 来存储和管理自定义对象。本文我们将描述如何在不编写自定义资源注册表和自己构建 KSM 的情况下,根据自定义资源的状态来添加指标。
配置
需要下面描述的 YAML 配置文件来定义你的自定义资源和要转换为指标的字段。
有两个参数需要用到:
在内联的 yaml 中
指定的配置文件路径
如果提供了两个标志,则内联配置将优先。当同一资源存在多个条目时,kube-state-metrics 将退出并报错,这包括引用不同 API 版本的配置。
除了指定 标志之外,还应该将复数形式的自定义资源种类添加到 标志中的暴露资源列表中。如果不指定 ,那么 kube-state-metrics 将考虑在 中配置的所有已知自定义资源和所有可用的默认 kubernetes 对象。
也可以将 kube-state-metrics 配置为仅在自定义资源模式下运行,除了指定 标志之外,还可以将 设置为 true。使用此配置,kube-state-metrics 只会考虑在 中配置的已知自定义资源。
注意:、 和 这几个公共标签是保留的,将被 字段中的值覆盖。
示例
下面我们将将使用以下自定义资源来进行说明:
单值
配置如下:
使用上面的配置会产生如下所示指标:
多指标
然后会产生如下所示的指标:
指标类型
该配置支持 OpenMetrics 规范 中的三种指标。指标类型由 字段及其在类型特定结构中的特定配置指定。
Gauge
Gauge 是表示的是当前的测量值,如当前使用的内存字节数或队列中的项目数,对于 gauge 来说,绝对值是大家感兴趣的东西。例如:
使用上面的配置可以产生如下所示的指标:
不过需要注意下类型转换。Gauge 生成 float64 类型的值,但自定义资源可以是各种类型,kube-state-metrics 对很多类型执行隐式类型转换,支持的类型包括:
(u)int32/64、int、float32 和 byte 转换为 float64
如果 NilIsZero 为真,nil 一般会被映射为 0.0,否则会产生一个错误
bool 类型 true 映射到 1.0,false 映射到 0.0
对于字符串,以下逻辑适用:
"true" 和 "yes" 被映射为 1.0,"false" 和 "no"被映射为 0.0(全部不区分大小写)
RFC3339 时间被解析为浮点时间戳
最后使用 https://pkg.go.dev/strconv#ParseFloat 将字符串解析为浮点数,它应该支持所有常见的数字格式,如果失败,则会产生错误
Kubernetes 控制器上的状态条件示例:
这适用于根据 kubernetes api (https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Condition) 公开状态条件的 kubernetes 控制器 CR:
可以产生如下所示的指标:
StateSet
StateSet 表示一系列相关的布尔值,也称为 bitset。如果需要对 ENUM 进行编码,则可以通过 StateSet 来完成。例如:
StateSet 类型的指标将为每个资源的列表中定义的每个值生成一个指标,如果该值与列表中的值匹配,则该值将为 1。会生成如下所示的指标:
Info
Info 指标用于暴露文本信息,这些信息在进程生命周期内不应更改,常见示例是应用程序的版本、修订控制提交和编译器的版本。 Info 类型的指标的值始终为 1,例如:
会产生如下所示的指标:
命名
默认指标名称带有前缀以避免与其他指标冲突。默认情况下,使用 的指标前缀与自定义资源的 连接,你可以使用 字段覆盖此行为。
会产生如下所示的指标:
要完全省略命名空间空间和/或子系统,请将它们设置为空字符串:
会产生如下的指标:
日志
如果已注册指标路径但未在自定义资源上找到,则会记录错误日志。对于某些资源,这可能会产生大量无用的日志数据,可以使用资源或指标上的 设置指标或资源的错误日志详细程度:
路径语法
Path 路径被指定为字符串列表,每个字符串都是一个 path 片段,根据自定义资源的数据动态解析。如果缺少 path 的任何部分,则结果为零。例如:
领取专属 10元无门槛券
私享最新 技术干货