ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

kube-state-metrics 中 MutatingAdmissionPolicyBinding 指标的实现原理、标签语义与启用方式

kube-state-metrics 中 MutatingAdmissionPolicyBinding 指标的实现原理、标签语义与启用方式 kube-state-metrics 中 MutatingAdmissionPolicyBinding 指标的实现原理、标签语义与启用方式【免费下载链接】kube-state-metricsAdd-on agent to generate and expose cluster-level metrics.项目地址: https://gitcode.com/GitHub_Trending/ku/kube-state-metricskube-state-metrics 通过监听 admissionregistration.k8s.io 下的 MutatingAdmissionPolicyBinding 对象暴露两个 EXPERIMENTAL 级别的 Gauge 指标kube_mutatingadmissionpolicybinding_info与kube_mutatingadmissionpolicybinding_created。本文基于仓库中的指标文档、internal/store源码实现与单元测试完整拆解这两个指标的标签语义、生成逻辑以及如何通过--resources参数与 RBAC 配置将它们接入你的 Prometheus 监控体系。MutatingAdmissionPolicyBinding 是什么为什么需要指标MutatingAdmissionPolicyBinding 是 Kubernetes 基于 CEL 表达式准入控制CEL AdmissionCEAD中的对象用于将某个 MutatingAdmissionPolicy 绑定到具体的工作负载资源上实现声明式的请求变更。kube-state-metrics 为这类对象提供状态快照式指标让监控系统能够回答以下问题集群中当前存在哪些策略绑定分别绑定了哪个策略每个绑定引用了哪个参数对象ParamRef参数查找失败时的处理动作是什么每个绑定是什么时候创建的用于计算绑定对象的年龄。指标总览如下内容与 docs/metrics/extend/mutatingadmissionpolicybinding-metrics.md 保持一致指标名类型说明标签/tags状态kube_mutatingadmissionpolicybinding_infoGauge基本信息mutatingadmissionpolicybindingbinding名称、namespacebinding命名空间、policy_name策略名、param_name参数名、param_namespace参数命名空间、param_not_found_action参数未找到动作EXPERIMENTALkube_mutatingadmissionpolicybinding_createdGaugeUnix 创建时间戳mutatingadmissionpolicybindingbinding名称、namespacebinding命名空间EXPERIMENTAL两个指标的 Status 均为 EXPERIMENTAL这对应源码中通过basemetrics.ALPHA声明的稳定性等级。根据 docs/design/metrics-best-practices.mdkube-state-metrics 遵循 Kubernetes 的稳定性框架实验性指标先以 experimental 状态发布后续可能随版本演进调整或转正。kube_mutatingadmissionpolicybinding_info标签从哪里来实现位于 internal/store/mutatingadmissionpolicybinding.go。从源码看该指标固定输出值1真正承载信息的是四个业务标签policy_name取自spec.policyName即该绑定引用的 MutatingAdmissionPolicy 名称param_name/param_namespace取自spec.paramRef指向参数对象的名称与命名空间param_not_found_action取自spec.paramRef.parameterNotFoundAction即参数对象找不到时的处理动作如Deny、Ignore。关键分支逻辑如下policyName直接读取spec.policyName只有当spec.paramRef非空时才会填充paramName、paramNamespace与paramNotFoundAction——也就是说若 Binding 未引用任何参数对象这三个标签值为空字符串但标签本身依然存在。这一点在单元测试的用例 2 中得到了验证一个不带ParamRef的 Binding 输出的就是# HELP kube_mutatingadmissionpolicybinding_info Information about the MutatingAdmissionPolicyBinding. # TYPE kube_mutatingadmissionpolicybinding_info gauge kube_mutatingadmissionpolicybinding_info{namespacens2,param_name,param_namespace,param_not_found_action,policy_namemutatingadmissionpolicy2,mutatingadmissionpolicybindingmutatingadmissionpolicybinding2} 1反之带ParamRef的用例参数动作设为Deny则输出# HELP kube_mutatingadmissionpolicybinding_info Information about the MutatingAdmissionPolicyBinding. # TYPE kube_mutatingadmissionpolicybinding_info gauge kube_mutatingadmissionpolicybinding_info{namespacens1,param_nameparam1,param_namespacens1,param_not_found_actionDeny,policy_namemutatingadmissionpolicy1,mutatingadmissionpolicybindingmutatingadmissionpolicybinding1} 1这两段样例均出自 internal/store/mutatingadmissionpolicybinding_test.go。此外所有指标都会由包装函数 wrapMutatingAdmissionPolicyBindingFunc 统一注入两个默认标签namespace与mutatingadmissionpolicybinding其值分别取自对象的metadata.namespace与metadata.name。默认标签的声明见 internal/store/mutatingadmissionpolicybinding.godescMutatingAdmissionPolicyBindingDefaultLabels []string{namespace, mutatingadmissionpolicybinding}因此一个 Binding 对象最终携带 6 个标签2 个默认标签 4 个业务标签与文档表格一一对应。kube_mutatingadmissionpolicybinding_created创建时间戳第二个指标输出 Binding 的 Unix 创建时间戳秒。其生成逻辑在 internal/store/mutatingadmissionpolicybinding.go只有当CreationTimestamp不为零值时才生成该样本测试样例中startTime 1501569018对应的输出为# HELP kube_mutatingadmissionpolicybinding_created Unix creation timestamp. # TYPE kube_mutatingadmissionpolicybinding_created gauge kube_mutatingadmissionpolicybinding_created{namespacens2,mutatingadmissionpolicybindingmutatingadmissionpolicybinding2} 1.501569018e09注意该指标只带默认的两个标签不含_info的四个业务标签。拿到时间戳后可以用标准 PromQL 计算绑定对象的年龄例如time() - kube_mutatingadmissionpolicybinding_created或告警某 Binding 创建超过 N 天仍未变更之类的场景。源码链路List/Watch、Store 注册与标签合并理解指标如何从 API Server 一路走到/metrics端点需要看三条代码链路1. List/Watch 构造createMutatingAdmissionPolicyBindingListWatch 通过kubeClient.AdmissionregistrationV1().MutatingAdmissionPolicyBindings()的List与Watch接口构建cache.ListerWatcher说明数据源是 admissionregistration.k8s.io/v1 组下的该资源。2. 资源注册表在 internal/store/builder.go 的availableStores映射中资源名mutatingadmissionpolicybindings对应构造函数mutatingadmissionpolicybindings: func(b *Builder) []cache.Store { return b.buildMutatingAdmissionPolicyBindingStores() },buildMutatingAdmissionPolicyBindingStores 调用的是buildClusterScopedStores而不是普通的buildStoresFunc。从 builder.go 的注释可以看到原因该封装通过把命名空间固定为NamespaceAll并临时将b.namespaces替换为单条目列表保证集群级资源或跨命名空间统一 watch 的资源在所有命名空间配置下只建立一个 store避免重复监听。3. 指标族组合与输出mutatingAdmissionPolicyBindingMetricFamilies中的每个指标族都通过generator.NewFamilyGeneratorWithStability创建稳定性等级为basemetrics.ALPHA、非 OptIn。FamilyGenerator结构含OptIn、StabilityLevel字段定义见 pkg/metric_generator/generator.go由于这里没有使用NewOptInFamilyGenerator这两个指标不需要--metric-opt-in-list显式开启只需通过资源开关启用即可。启用方式--resources参数与 RBAC 授权资源开关。mutatingadmissionpolicybindings是默认资源集合的一员定义在 pkg/options/resource.go 的DefaultResources中mutatingadmissionpolicies: struct{}{}, mutatingadmissionpolicybindings: struct{}{}, ...也就是说只要启动参数--resources包含mutatingadmissionpolicybindings不指定该参数时默认全部启用对应的 store 就会被构建。仓库的分片部署示例也印证了这一点examples/daemonsetsharding/deployment.yaml 的容器参数中显式列出- --resourcescertificatesigningrequests,configmaps,...,mutatingadmissionpolicies,mutatingadmissionpolicybindings,mutatingwebhookconfigurations,...完整的命令行参数含义可参考 docs/developer/cli-arguments.md。另外--object-limit实验性可限制每个资源从 API Server 拉取的对象总数internal/store/builder.go 中b.objectLimit会被传入 store 构建过程。RBAC 授权。kube-state-metrics 的服务账号需要对admissionregistration.k8s.io组的mutatingadmissionpolicybindings资源具备list/watch权限。标准部署清单 examples/standard/cluster-role.yaml 已包含该规则- mutatingadmissionpolicybindingsautosharding 与 deploymentsharding 两套示例中的 cluster-role 同样包含此条目。缺少授权时 informer 的 List/Watch 会失败对应指标将不会出现在/metrics输出中。e2e 测试中的样例对象。仓库自带的集成测试对象 tests/manifests/mutatingadmissionpolicybinding.yaml 展示了一个最小可用的 BindingapiVersion: admissionregistration.k8s.io/v1 kind: MutatingAdmissionPolicyBinding metadata: name: example-mutatingadmissionpolicybinding spec: policyName: example-mutatingadmissionpolicy matchResources: namespaceSelector: matchLabels: environment: prod该对象未设置paramRef因此其对应的kube_mutatingadmissionpolicybinding_info样本中param_name、param_namespace、param_not_found_action三个标签将为空值——这与上文ParamRef 非空才填充的源码行为一致。常见查询思路指标就绪后基于标签可以直接组织如下类型的查询标准 Prometheus 用法统计集群中 Binding 总数count(kube_mutatingadmissionpolicybinding_info)按策略聚合查看某策略被哪些 Binding 引用count by (policy_name)(kube_mutatingadmissionpolicybinding_info)找出参数未找到即拒绝的严格绑定kube_mutatingadmissionpolicybinding_info{param_not_found_actionDeny} 1计算 Binding 年龄time() - kube_mutatingadmissionpolicybinding_created。这些标签的组合意味着监控面板可以清晰呈现策略—绑定—参数三层引用关系而配套的策略侧指标kube_mutatingadmissionpolicy_info等见 docs/metrics/extend/mutatingadmissionpolicy-metrics.md可与之配合完整还原 CEL 准入配置的拓扑。小结与适用前提本文覆盖的指标为kube_mutatingadmissionpolicybinding_info与kube_mutatingadmissionpolicybinding_created均为 Gauge 类型、EXPERIMENTAL 状态定义出处见 internal/store/mutatingadmissionpolicybinding.go行为验证见 internal/store/mutatingadmissionpolicybinding_test.go该资源位于默认资源集合pkg/options/resource.go且非 OptIn 指标无需--metric-opt-in-list但需要--resources启用与相应的 RBAClist/watch权限由于底层 API 组 admissionregistration.k8s.io/v1 的该资源在 Kubernetes 中仍属实验特性其字段如parameterNotFoundAction可能随 Kubernetes 版本演进使用这些指标做告警时应关注指标稳定性等级并预留调整空间指标文档总索引见 docs/README.md该指标族由 CHANGELOG.md 记录的 MutatingAdmissionPolicy 与 MutatingAdmissionPolicyBinding 指标特性引入。【免费下载链接】kube-state-metricsAdd-on agent to generate and expose cluster-level metrics.项目地址: https://gitcode.com/GitHub_Trending/ku/kube-state-metrics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表