kubebuilder 中文文档由云原生社区主导翻译。任何问题可以在这儿提issue。issue模版可以参考这个

指标

默认情况下,controller-runtime 会构建一个全局 prometheus 注册,并且会为每个控制器发布一系列性能指标。

指标保护

如果使用了 kubebuilder kube-auth-proxy 默认会保护这些指标。Kubebuilder v2.2.0+ 会创建一个集群角色,它在 config/rbac/auth_proxy_client_clusterrole.yaml 文件中配置。

你需要给你所有的 Prometheus 服务授权,以便它可以拿到这些被保护的指标。为实现授权,你可以创建一个 clusterRoleBindingclusterRole 绑定到一个你的 Prometheus 服务使用的账户上。

可以运行下面的 kubectl 命令来创建它。如果你使用 kubebuilder,在config/default/kustomization.yaml 文件中 namePrefix 字段是 <project-prefix>

kubectl create clusterrolebinding metrics --clusterrole=<project-prefix>-metrics-reader --serviceaccount=<namespace>:<service-account-name>

给 Prometheus 导出指标

按照下面的步骤来用 Prometheus Operator 导出指标:

  1. 安装 Prometheus 和 Prometheus Operator。如果没有自己的监控系统,在生产环境上我们推荐使用 kube-prometheus。如果你只是做实验,那么可以只安装 Prometheus 和 Prometheus Operator。
  2. config/default/kustomization.yaml 配置文件中取消 - ../prometheus 这一行的注释。它会创建可以导出指标的 ServiceMonitor 资源。
# [PROMETHEUS] 用于启用 prometheus 监控, 取消所有带 'PROMETHEUS' 部分的注释。
- ../prometheus

注意,当你在集群中安装你的项目时,它会创建一个 ServiceMonitor 来导出指标。为了检查 ServiceMonitor,可以运行 kubectl get ServiceMonitor -n <project>-system。看下面的例子:

$ kubectl get ServiceMonitor -n monitor-system
NAME                                         AGE
monitor-controller-manager-metrics-monitor   2m8s

同样,要注意默认情况下是通过 8443 端口导出指标的。这种情况下,你可以在自己的 dashboard 中检查 Prometheus metrics。要检查这些指标,在项目运行的 {namespace="<project>-system"} 命名空间下搜索导出的指标。看下面的例子:

Screenshot 2019-10-02 at 13 07 13

发布额外的指标:

如果你想从你的控制器发布额外的指标,可以通过在 conoller-runtime/pkg/metrics 中使用全局注册的方式来轻松做到。

实现发布额外指标的一种方式是把收集器声明为全局变量,并且使用 init() 来注册。

例如:

import (
    "github.com/prometheus/client_golang/prometheus"
    "sigs.k8s.io/controller-runtime/pkg/metrics"
)

var (
    goobers = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "goobers_total",
            Help: "Number of goobers proccessed",
        },
    )
    gooberFailures = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "goober_failures_total",
            Help: "Number of failed goobers",
        },
    )
)

func init() {
    // Register custom metrics with the global prometheus registry
    metrics.Registry.MustRegister(goobers, gooberFailures)
}

然后就可以从你的接收循环部分中记录这些指标到收集器中了,并且这些指标就可以被 prometheus 或者其它开放指标系统来抓取了。