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 集群中
流程
在 Operator SDK 项目中,取消注释
config/default/kustomization.yaml
文件中的以下行:../prometheus
创建自定义控制器类,以便从 Operator 发布其他指标。以下示例将
widgets
和widgetFailures
收集器声明为全局变量,然后将它们注册到控制器的软件包中的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) }
记录这些收集器来自
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 }
构建和推送 Operator:
$ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
部署 Operator:
$ make deploy IMG=<registry>/<user>/<image_name>:<tag>
创建角色和角色绑定定义,以允许 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
为部署的 Operator 应用角色和绑定:
$ oc apply -f config/prometheus/role.yaml
$ oc apply -f config/prometheus/rolebinding.yaml
为您要提取的命名空间设置标签,为该命名空间启用 OpenShift 集群监控:
$ oc label namespace <operator_namespace> openshift.io/cluster-monitoring="true"
验证
-
查询并查看 OpenShift Container Platform Web 控制台中的指标。您可以使用自定义控制器类中设置的名称,如
widgets_total
和widget_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 集群中
流程
生成基于 Ansible 的 Operator。这个示例使用
testmetrics.com
域:$ operator-sdk init \ --plugins=ansible \ --domain=testmetrics.com
创建
metrics
API。这个示例使用名为Testmetrics
的kind
:$ operator-sdk create api \ --group metrics \ --version v1 \ --kind Testmetrics \ --generate-role
编辑
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
验证
在集群上运行 Operator。例如,使用 "run 作为部署" 方法:
构建 Operator 镜像并将其推送到 registry:
$ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
在集群上安装 Operator:
$ make install
部署 Operator:
$ make deploy IMG=<registry>/<user>/<image_name>:<tag>
创建
Testmetrics
自定义资源(CR):定义 CR spec:
例 5.39.
config/samples/metrics_v1_testmetrics.yaml
文件示例apiVersion: metrics.testmetrics.com/v1 kind: Testmetrics metadata: name: testmetrics-sample spec: size: 1
创建对象:
$ oc create -f config/samples/metrics_v1_testmetrics.yaml
获取 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
获取端点详情:
$ oc get ep
输出示例
NAME ENDPOINTS AGE ansiblemetrics-controller-manager-metrics-service 10.129.2.70:8443 150m
请求自定义指标令牌:
$ token=`oc create token prometheus-k8s -n openshift-monitoring`
检查指标值:
检查
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
检查
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.
检查
my_histogram_metric
和my_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