指标

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

指标配置

通过查看文件 config/default/kustomization.yaml,您可以检查默认暴露的指标:

# [指标] 暴露控制器管理器指标服务。- metrics_service.yaml
贴片:
   # [指标] 下面的补丁将通过 HTTPS 启用指标端点,并使用端口 :8443。
   # 更多信息: https://book.kubebuilder.io/reference/metrics
   - path: manager_metrics_patch.yaml
     目标:
        kind: 部署

然后,你可以在 cmd/main.go 中查看指标服务器的配置:

// 在 'config/default/kustomization.yaml' 中启用了 Metrics 端点。Metrics 选项配置服务器。
// 更多信息请参见: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/metrics/server
Metrics: metricsserver.Options{
   ...
},

指标保护

未受保护的指标端点可能会向未经授权的用户暴露重要数据,例如系统性能、应用程序行为以及潜在的机密操作指标。这种暴露可能导致安全漏洞,攻击者可能借此获取系统操作的洞察并利用其中的薄弱环节。

通过使用身份验证/授权(默认启用)

为减少这些风险,Kubebuilder 项目利用身份验证 (authn) 和授权 (authz) 保护指标端点。这种方法确保只有经过授权的用户和服务账户可以访问敏感的指标数据,从而增强系统的整体安全性。

过去,使用kube-rbac-proxy来提供这种保护。然而,在最近的版本中,这种用法已被停止。从v4.1.0版本开始,项目默认启用了指标端点,并使用controller-runtime提供的WithAuthenticationAndAuthorization功能进行了保护。

因此,您将找到以下配置:

  • cmd/main.go
if secureMetrics {
  ...
  metricsServerOptions.FilterProvider = filters.WithAuthenticationAndAuthorization
}

此配置利用 FilterProvider 对指标端点实施身份验证和授权。通过使用此方法,您可以确保该端点仅对具有适当权限的用户可访问。

  • config/rbac/kustomization.yaml 中:
# 以下 RBAC 配置用于通过身份验证和授权来保护
# 指标端点。这些配置
# 确保只有经过授权的用户和服务账户
# 才能访问指标端点。- metrics_auth_role.yaml
- metrics_auth_role_binding.yaml
- metrics_reader_role.yaml

通过这种方式,只有使用 ServiceAccount 令牌的 Pod 被授权访问指标端点。例如:

apiVersion: v1
kind: 舱
metadata:
  name: 指标消费者
  命名空间: system
spec:
  # 使用搭建好的服务账户名称来允许身份验证/授权
  serviceAccountName: 控制器管理器
  容器:
  - name: 指标消费者
    image: curlimages/curl:latest
    命令: ["/bin/sh"]
    args:
      - "-c"
      - >
```bas

(推荐) 启用生产环境证书(默认情况下禁用)

使用 Kubebuilder 版本 4.4.0 及以上构建的项目已经具备了启用使用由 CertManager 管理的证书以保护指标服务器的逻辑。按照以下步骤,您可以配置您的项目以使用由 CertManager 管理的证书。

  1. config/default/kustomization.yaml 中启用 Cert-Manager:

    • 取消注释 cert-manager 资源以将其包含在您的项目中:

      - ../证书管理器
      
  2. 启用补丁以配置 config/default/kustomization.yaml 中控制器部署中证书的使用:

    • 取消对 cert_metrics_manager_patch.yaml 的注释,以在管理器部署中挂载 serving-cert 密钥。

      # 如果您启用 Metrics 和 CertManager,请取消注释补丁行
      # [启用带有 certManager 保护的指标] 要启用受 certManager 保护的指标,请取消注释以下行。# 此补丁将使用 certManager 自签名证书保护指标。- path: cert_metrics_manager_patch.yaml
        目标:
          kind: 部署
      
  3. config/default/kustomization.yaml 中启用 CertManager 替换 Metrics Server 证书:

    • 取消注释下面的替换块。需要为在 config/certmanager 中配置的证书正确设置 DNS 名称。

      # [CERTMANAGER] 要启用 cert-manager,请取消注释所有以 'CERTMANAGER' 为前缀的部分。# 取消注释以下替换,以添加 cert-manager CA 注入注释
      您已接受培训的数据截至2023年10月。# - 来源: # 取消注释以下块以启用指标的证书
      #     类型: 服务
      # 版本:v1#     名称: 控制器管理器指标服务
      #     字段路径: metadata.name
      # 目标:#     - 选择:#         类型: 证书
      #         组: cert-manager.io
      #         版本: v1
      #         名称: metrics-certs
      #       字段路径:
      #         - spec.dnsNames.0#         - spec.dnsNames.1#       选项:
      你接受过直到2023年10月的数据训练。您的训练数据截至到2023年10月。# 创建:真#
      你接受的训练数据截至到2023年10月。#     类型: 服务
      # 版本:v1#     名称: 控制器管理器指标服务
      #     字段路径: metadata.namespace
      # 目标:#     - 选择:#         类型: 证书
      #         组: cert-manager.io
      #         版本: v1
      #         名称: metrics-certs
      #       字段路径:
      #         - spec.dnsNames.0#         - spec.dnsNames.1#       选项:
      你接受过直到2023年10月的数据训练。您已接受训练的数据截至2023年10月。# 创建:真#
      
  4. 启用补丁以使 ServiceMonitor 使用 Cert-Manager 管理的密钥 config/prometheus/kustomization.yaml

    • 添加或取消注释 ServiceMonitor 补丁,以安全地引用 cert-manager 管理的密钥,替换不安全的配置为安全的证书验证:

      # [PROMETHEUS-WITH-CERTS] 以下补丁配置了 ../prometheus 中的 ServiceMonitor。# 安全地引用由 cert-manager 创建和管理的证书。此外,请确保在 config/default/kustomization.yaml 文件中取消注释 [METRICS WITH CERTMANAGER] 补丁。# 将"metrics-server-cert"机密挂载到管理部署中。贴片:
        - path: monitor_tls_patch.yaml
          目标:
            kind: 服务监控器
      

    注意 上述的 ServiceMonitor 补丁将确保如果你启用了 Prometheus 集成,它将安全地引用由 CertManager 创建和管理的证书。但是,它不会启用与 Prometheus 的集成。要启用与 Prometheus 的集成,你需要取消注释 config/default/kustomization.yaml 中的 #- ../certmanager。有关更多信息,请参见 为 Prometheus 导出指标

(可选) 通过使用网络策略(默认情况下禁用)

NetworkPolicy 在 Kubernetes 集群中作为 pod 的基本防火墙,在 IP 地址或端口级别控制流量流动。然而,它不处理 authn/authz

取消注释 config/default/kustomization.yaml 中的以下行:

# [NETWORK POLICY] Protect the /metrics endpoint and Webhook Server with NetworkPolicy.
# Only Pod(s) running a namespace labeled with 'metrics: enabled' will be able to gather the metrics.
# Only CR(s) which uses webhooks and applied on namespaces labeled 'webhooks: enabled' will be able to work properly.
#- ../network-policy

为 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 导出。这样,您就可以在 Prometheus 仪表板中检查指标。要验证此操作,请搜索来自项目运行所在命名空间的指标 {namespace="<project>-system"}。请看以下示例:

Screenshot 2019-10-02 at 13 07 13

发布额外指标

如果您希望从控制器中发布额外的指标,可以通过使用 controller-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 processed",
        },
    )
    gooberFailures = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "goober_failures_total",
            Help: "Number of failed goobers",
        },
    )
)

func init() {
    // 在全局 prometheus 注册中心注册自定义指标
    metrics.Registry.MustRegister(goobers, gooberFailures)
}

您可以从调整循环的任何部分将指标记录到这些收集器中。这些指标可以在操作员代码的任何位置进行评估。

这些指标将可供 Prometheus 或其他 OpenMetrics 系统抓取。

您接受的训练数据截至到2023年10月。