../prometheus
本指南介绍了 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。
有关 OpenShift Container Platform 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Container Platform 发行说明中的“已弃用和已删除的功能”部分。 有关不受支持的社区维护版本的 Operator SDK 的信息,请参阅 Operator SDK (Operator Framework)。 |
Prometheus 是一款开源系统监控和警报工具包。Prometheus Operator 创建、配置和管理在基于 Kubernetes 的集群(例如 OpenShift Container Platform)上运行的 Prometheus 集群。
Operator SDK 中默认情况下存在辅助函数,可在任何生成的基于 Go 的 Operator 中自动设置指标,以便在部署了 Prometheus Operator 的集群上使用。
作为 Operator 作者,您可以使用 `controller-runtime/pkg/metrics` 库中的全局 Prometheus 注册表来发布自定义指标。
使用 Operator SDK 生成的基于 Go 的 Operator
Prometheus Operator(默认情况下部署在 OpenShift Container Platform 集群上)
在您的 Operator SDK 项目中,取消注释 `config/default/kustomization.yaml` 文件中的以下行
../prometheus
创建一个自定义控制器类,以从 Operator 发布其他指标。以下示例将 `widgets` 和 `widgetFailures` 收集器声明为全局变量,然后在控制器的包中的 `init()` 函数中注册它们
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` 控制器类中协调循环的任何部分记录到这些收集器,这决定了指标的业务逻辑
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>
创建角色和角色绑定定义,以允许 Operator 的服务监控器被 OpenShift Container Platform 集群的 Prometheus 实例抓取。
必须分配角色,以便服务帐户具有抓取命名空间指标的权限
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
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`。
作为创建基于 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 项目创建自定义指标
---
# 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。例如,要使用“作为部署运行”方法
构建 Operator 镜像并将其推送到注册表
$ 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 规范
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