5.14. 使用 Prometheus 配置内置监控


本指南描述了 Operator SDK 使用 Prometheus Operator 提供的内置监控支持,以及使用基于 Go 和 Ansible 的 Operator 作者的详细信息。

重要

红帽支持的 Operator SDK CLI 工具版本,包括 Operator 项目的相关构建和测试工具已被弃用,计划在以后的 OpenShift Container Platform 发行版本中删除。红帽将在当前发行生命周期中提供对这个功能的程序错误修复和支持,但此功能将不再获得改进,并将在以后的 OpenShift Container Platform 版本中删除。

对于创建新 Operator 项目,不建议使用红帽支持的 Operator SDK 版本。现有 Operator 项目的 Operator 作者可以使用 OpenShift Container Platform 4.17 发布的 Operator SDK CLI 工具版本来维护其项目,并创建针对较新版本的 OpenShift Container Platform 的 Operator 发行版本。

以下与 Operator 项目相关的基础镜像 没有被弃用。这些基础镜像的运行时功能和配置 API 仍然会有程序错误修复和并提供对相关 CVE 的解决方案。

  • 基于 Ansible 的 Operator 项目的基础镜像
  • 基于 Helm 的 Operator 项目的基础镜像

有关 OpenShift Container Platform 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Container Platform 发行注记中已弃用和删除的功能部分。

有关 Operator SDK 不支持的、社区维护版本的信息,请参阅 Operator SDK (Operator Framework)

5.14.1. Prometheus Operator 支持

Prometheus 是一个开源系统监视和警报工具包。Prometheus Operator 会创建、配置和管理在基于 Kubernetes 的集群(如 OpenShift Container Platform)中运行的 Prometheus 集群。

默认情况下,Operator SDK 中包括帮助函数,用于在任何生成的 Go-based Operator 中自动设置指标,以便在部署了 Prometheus Operator 的集群上使用。

5.14.2. 为基于 Go 的 Operator 公开自定义指标

作为 Operator 作者,您可以使用 controller-runtime/pkg/metrics 库中的全局 Prometheus registry 发布自定义指标。

先决条件

  • 使用 Operator SDK 生成基于 Go 的 Operator
  • Prometheus Operator,默认部署在 OpenShift Container Platform 集群中

流程

  1. 在 Operator SDK 项目中,取消注释 config/default/kustomization.yaml 文件中的以下行:

    ../prometheus
  2. 创建自定义控制器类,以便从 Operator 发布其他指标。以下示例将 widgetswidgetFailures 收集器声明为全局变量,然后将它们注册到控制器的软件包中的 init() 函数:

    例 5.34. controllers/memcached_controller_test_metrics.go 文件

    package controllers
    
    import (
    	"github.com/prometheus/client_golang/prometheus"
    	"sigs.k8s.io/controller-runtime/pkg/metrics"
    )
    
    
    var (
        widgets = prometheus.NewCounter(
            prometheus.CounterOpts{
                Name: "widgets_total",
                Help: "Number of widgets processed",
            },
        )
        widgetFailures = prometheus.NewCounter(
            prometheus.CounterOpts{
                Name: "widget_failures_total",
                Help: "Number of failed widgets",
            },
        )
    )
    
    func init() {
        // Register custom metrics with the global prometheus registry
        metrics.Registry.MustRegister(widgets, widgetFailures)
    }
  3. 记录这些收集器来自 main 控制器类中协调循环的任何部分,这决定了指标的业务逻辑:

    例 5.35. controllers/memcached_controller.go 文件

    func (r *MemcachedReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    	...
    	...
    	// Add metrics
    	widgets.Inc()
    	widgetFailures.Inc()
    
    	return ctrl.Result{}, nil
    }
  4. 构建和推送 Operator:

    $ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
  5. 部署 Operator:

    $ make deploy IMG=<registry>/<user>/<image_name>:<tag>
  6. 创建角色和角色绑定定义,以允许 OpenShift Container Platform 集群的 Prometheus 实例提取 Operator 的服务监控。

    必须分配角色,以便服务帐户具有提取命名空间指标的权限:

    例 5.36. config/prometheus/role.yaml 角色

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: prometheus-k8s-role
      namespace: memcached-operator-system
    rules:
      - apiGroups:
          - ""
        resources:
          - endpoints
          - pods
          - services
          - nodes
          - secrets
        verbs:
          - get
          - list
          - watch

    例 5.37. config/prometheus/rolebinding.yaml 角色绑定

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: prometheus-k8s-rolebinding
      namespace: memcached-operator-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: prometheus-k8s-role
    subjects:
      - kind: ServiceAccount
        name: prometheus-k8s
        namespace: openshift-monitoring
  7. 为部署的 Operator 应用角色和绑定:

    $ oc apply -f config/prometheus/role.yaml
    $ oc apply -f config/prometheus/rolebinding.yaml
  8. 为您要提取的命名空间设置标签,为该命名空间启用 OpenShift 集群监控:

    $ oc label namespace <operator_namespace> openshift.io/cluster-monitoring="true"

验证

  • 查询并查看 OpenShift Container Platform Web 控制台中的指标。您可以使用自定义控制器类中设置的名称,如 widgets_totalwidget_failures_total

5.14.3. 为基于 Ansible 的 Operator 公开自定义指标

作为创建基于 Ansible 的 Operator 的 Operator 作者,您可以使用 Operator SDK 的 osdk_metrics 模块来公开自定义 Operator 和 Operand 指标、发出事件和支持日志记录。

先决条件

  • 使用 Operator SDK 生成的基于 Ansible 的 Operator
  • Prometheus Operator,默认部署在 OpenShift Container Platform 集群中

流程

  1. 生成基于 Ansible 的 Operator。这个示例使用 testmetrics.com 域:

    $ operator-sdk init \
        --plugins=ansible \
        --domain=testmetrics.com
  2. 创建 metrics API。这个示例使用名为 Testmetricskind

    $ operator-sdk create api \
        --group metrics \
        --version v1 \
        --kind Testmetrics \
        --generate-role
  3. 编辑 roles/testmetrics/tasks/main.yml 文件,并使用 osdk_metrics 模块为 Operator 项目创建自定义指标:

    例 5.38. roles/testmetrics/tasks/main.yml 文件示例

    ---
    # tasks file for Memcached
    - name: start k8sstatus
      k8s:
        definition:
          kind: Deployment
          apiVersion: apps/v1
          metadata:
            name: '{{ ansible_operator_meta.name }}-memcached'
            namespace: '{{ ansible_operator_meta.namespace }}'
          spec:
            replicas: "{{size}}"
            selector:
              matchLabels:
                app: memcached
            template:
              metadata:
                labels:
                  app: memcached
              spec:
                containers:
                - name: memcached
                  command:
                  - memcached
                  - -m=64
                  - -o
                  - modern
                  - -v
                  image: "docker.io/memcached:1.4.36-alpine"
                  ports:
                    - containerPort: 11211
    
    - osdk_metric:
        name: my_thing_counter
        description: This metric counts things
        counter: {}
    
    - osdk_metric:
        name: my_counter_metric
        description: Add 3.14 to the counter
        counter:
          increment: yes
    
    - osdk_metric:
        name: my_gauge_metric
        description: Create my gauge and set it to 2.
        gauge:
          set: 2
    
    - osdk_metric:
        name: my_histogram_metric
        description: Observe my histogram
        histogram:
          observe: 2
    
    - osdk_metric:
        name: my_summary_metric
        description: Observe my summary
        summary:
          observe: 2

验证

  1. 在集群上运行 Operator。例如,使用 "run 作为部署" 方法:

    1. 构建 Operator 镜像并将其推送到 registry:

      $ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
    2. 在集群上安装 Operator:

      $ make install
    3. 部署 Operator:

      $ make deploy IMG=<registry>/<user>/<image_name>:<tag>
  2. 创建 Testmetrics 自定义资源(CR):

    1. 定义 CR spec:

      例 5.39. config/samples/metrics_v1_testmetrics.yaml 文件示例

      apiVersion: metrics.testmetrics.com/v1
      kind: Testmetrics
      metadata:
        name: testmetrics-sample
      spec:
        size: 1
    2. 创建对象:

      $ oc create -f config/samples/metrics_v1_testmetrics.yaml
  3. 获取 pod 详情:

    $ oc get pods

    输出示例

    NAME                                    READY   STATUS    RESTARTS   AGE
    ansiblemetrics-controller-manager-<id>  2/2     Running   0          149m
    testmetrics-sample-memcached-<id>       1/1     Running   0          147m

  4. 获取端点详情:

    $ oc get ep

    输出示例

    NAME                                                ENDPOINTS          AGE
    ansiblemetrics-controller-manager-metrics-service   10.129.2.70:8443   150m

  5. 请求自定义指标令牌:

    $ token=`oc create token prometheus-k8s -n openshift-monitoring`
  6. 检查指标值:

    1. 检查 my_counter_metric 值:

      $ oc exec ansiblemetrics-controller-manager-<id> -- curl -k -H "Authoriza
      tion: Bearer $token" 'https://10.129.2.70:8443/metrics' | grep  my_counter

      输出示例

      HELP my_counter_metric Add 3.14 to the counter
      TYPE my_counter_metric counter
      my_counter_metric 2

    2. 检查 my_gauge_metric 值:

      $ oc exec ansiblemetrics-controller-manager-<id> -- curl -k -H "Authoriza
      tion: Bearer $token" 'https://10.129.2.70:8443/metrics' | grep  gauge

      输出示例

      HELP my_gauge_metric Create my gauge and set it to 2.

    3. 检查 my_histogram_metricmy_summary_metric 值:

      $ oc exec ansiblemetrics-controller-manager-<id> -- curl -k -H "Authoriza
      tion: Bearer $token" 'https://10.129.2.70:8443/metrics' | grep  Observe

      输出示例

      HELP my_histogram_metric Observe my histogram
      HELP my_summary_metric Observe my summary

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.