×

本指南介绍了 Operator SDK 提供的内置监控支持(使用 Prometheus Operator),并详细介绍了基于 Go 和基于 Ansible 的 Operator 作者的使用方法。

Operator SDK CLI 工具的 Red Hat 支持版本(包括与 Operator 项目相关的脚手架和测试工具)已弃用,计划在未来版本的 OpenShift Container Platform 中删除。Red Hat 将在此版本的生命周期内为此功能提供错误修复和支持,但此功能将不再接收增强功能,并将从未来的 OpenShift Container Platform 版本中删除。

不建议使用 Red Hat 支持的 Operator SDK 版本创建新的 Operator 项目。拥有现有 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)

Prometheus Operator 支持

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

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

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

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

先决条件
  • 使用 Operator SDK 生成的基于 Go 的 Operator

  • Prometheus Operator(默认情况下部署在 OpenShift Container Platform 集群上)

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

    ../prometheus
  2. 创建一个自定义控制器类,以从 Operator 发布其他指标。以下示例将 `widgets` 和 `widgetFailures` 收集器声明为全局变量,然后在控制器的包中的 `init()` 函数中注册它们

    `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` 控制器类中协调循环的任何部分记录到这些收集器,这决定了指标的业务逻辑

    `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. 创建角色和角色绑定定义,以允许 Operator 的服务监控器被 OpenShift Container Platform 集群的 Prometheus 实例抓取。

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

    `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
    `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_total` 和 `widget_failures_total`。

公开基于 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。此示例使用名为 `Testmetrics` 的 `kind`

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

    示例 `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。例如,要使用“作为部署运行”方法

    1. 构建 Operator 镜像并将其推送到注册表

      $ 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 规范

      示例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