3.4. 为用户工作负载监控配置指标
配置指标集合,以监控集群组件和您自己的工作负载的执行方式。
您可以将最接近的指标发送到远程系统进行长期存储,并将集群 ID 标签添加到指标,以识别来自不同集群的数据。
3.4.1. 配置远程写入存储 复制链接链接已复制到粘贴板!
您可以配置远程写入存储,使 Prometheus 能够将最接近的指标发送到远程系统,以进行长期存储。这样做不会影响 Prometheus 存储指标的方式和时长。
先决条件
-
您可以使用具有
dedicated-admin角色的用户访问集群。 -
user-workload-monitoring-configConfigMap对象存在。在集群创建时默认创建此对象。 -
已安装 OpenShift CLI(
oc)。 您已设置了一个远程写入兼容端点(如 Thanos),并且知道端点 URL。有关与远程写入功能兼容的端点的信息,请参阅 Prometheus 远程端点和存储文档。
重要红帽只提供配置远程写入发送者的信息,而不提供有关配置接收器端点的指导。客户负责设置自己的端点,这些端点与远程写入兼容。端点接收器配置的问题不包括在红帽产品支持中。
您已为远程写入端点在
Secret对象中设置身份验证凭证。您必须在openshift-user-workload-monitoring命名空间中创建 secret。警告要减少安全风险,请使用 HTTPS 和身份验证向端点发送指标。
流程
编辑
openshift-user-workload-monitoring项目中的user-workload-monitoring-config配置映射:$ oc -n openshift-user-workload-monitoring edit configmap user-workload-monitoring-config在
data/config.yaml/prometheus下添加一个remoteWrite:部分,如下例所示:apiVersion: v1 kind: ConfigMap metadata: name: user-workload-monitoring-config namespace: openshift-user-workload-monitoring data: config.yaml: | prometheus: remoteWrite: - url: "https://remote-write-endpoint.example.com"1 <endpoint_authentication_credentials>2 在身份验证凭证后添加 write relabel 配置值:
apiVersion: v1 kind: ConfigMap metadata: name: user-workload-monitoring-config namespace: openshift-user-workload-monitoring data: config.yaml: | prometheus: remoteWrite: - url: "https://remote-write-endpoint.example.com" <endpoint_authentication_credentials> writeRelabelConfigs: - <your_write_relabel_configs>1 - 1
- 为您要发送到远程端点的指标添加配置。
转发一个名为
my_metric的单个指标的示例apiVersion: v1 kind: ConfigMap metadata: name: user-workload-monitoring-config namespace: openshift-user-workload-monitoring data: config.yaml: | prometheus: remoteWrite: - url: "https://remote-write-endpoint.example.com" writeRelabelConfigs: - sourceLabels: [__name__] regex: 'my_metric' action: keep在
my_namespace命名空间中转发名为my_metric_1和my_metric_2的指标示例apiVersion: v1 kind: ConfigMap metadata: name: user-workload-monitoring-config namespace: openshift-user-workload-monitoring data: config.yaml: | prometheus: remoteWrite: - url: "https://remote-write-endpoint.example.com" writeRelabelConfigs: - sourceLabels: [__name__,namespace] regex: '(my_metric_1|my_metric_2);my_namespace' action: keep- 保存文件以使改变生效。新的配置会被自动应用。
3.4.1.1. 支持的远程写入身份验证设置 复制链接链接已复制到粘贴板!
您可以使用不同的方法通过远程写入端点进行身份验证。目前支持的身份验证方法有 AWS 签名版本 4、基本身份验证、授权、OAuth 2.0 和 TLS 客户端。下表提供有关用于远程写入的受支持身份验证方法的详情。
| 身份验证方法 | 配置映射字段 | 描述 |
|---|---|---|
| AWS 签名版本 4 |
| 此方法使用 AWS 签名版本 4 身份验证为请求签名。您不能搭配授权、OAuth 2.0 或基本身份验证同时使用此方法。 |
| 基本身份验证(Basic authentication) |
| 基本身份验证使用配置的用户名和密码在每个远程写入请求上设置授权标头。 |
| 授权 |
|
授权使用配置的令牌在每个远程写入请求上设置 |
| OAuth 2.0 |
|
OAuth 2.0 配置使用客户端凭据授予类型。Prometheus 使用指定的客户端 ID 和客户端 secret 从 |
| TLS 客户端 |
| TLS 客户端配置指定 CA 证书、客户端证书和客户端密钥文件信息,用于使用 TLS 与远程写入端点服务器进行身份验证。示例配置假定您已创建了 CA 证书文件、客户端证书文件和客户端密钥文件。 |
3.4.1.2. 远程写入身份验证设置示例 复制链接链接已复制到粘贴板!
以下示例展示了可用于连接到远程写入端点的不同身份验证设置。每个示例还演示了如何配置包含身份验证凭据和其他相关设置的对应 Secret 对象。每个示例配置用于监控 openshift-user-workload-monitoring 命名空间中的用户定义的项目的身份验证。
3.4.1.2.1. AWS 签名版本 4 验证的 YAML 示例 复制链接链接已复制到粘贴板!
以下显示了 openshift-user-workload-monitoring 命名空间中名为 sigv4-credentials 的 sigv4 secret 的设置。
apiVersion: v1
kind: Secret
metadata:
name: sigv4-credentials
namespace: openshift-user-workload-monitoring
stringData:
accessKey: <AWS_access_key>
secretKey: <AWS_secret_key>
type: Opaque
下面显示了一个 AWS Signature Version 4 远程写入身份验证设置示例,它使用 openshift-user-workload-monitoring 命名空间中名为 sigv4-credentials 的 Secret 对象:
apiVersion: v1
kind: ConfigMap
metadata:
name: user-workload-monitoring-config
namespace: openshift-user-workload-monitoring
data:
config.yaml: |
prometheus:
remoteWrite:
- url: "https://authorization.example.com/api/write"
sigv4:
region: <AWS_region>
accessKey:
name: sigv4-credentials
key: accessKey
secretKey:
name: sigv4-credentials
key: secretKey
profile: <AWS_profile_name>
roleArn: <AWS_role_arn>
3.4.1.2.2. 用于基本身份验证的 YAML 示例 复制链接链接已复制到粘贴板!
以下显示了 openshift-user-workload-monitoring 命名空间中名为 rw-basic-auth 的 Secret 对象的基本身份验证设置示例:
apiVersion: v1
kind: Secret
metadata:
name: rw-basic-auth
namespace: openshift-user-workload-monitoring
stringData:
user: <basic_username>
password: <basic_password>
type: Opaque
以下示例显示了使用 openshift-user-workload-monitoring 命名空间中名为 rw-basic-auth 的 Secret 对象的 basicAuth 远程写入配置。它假设您已为端点设置了身份验证凭据。
apiVersion: v1
kind: ConfigMap
metadata:
name: user-workload-monitoring-config
namespace: openshift-user-workload-monitoring
data:
config.yaml: |
prometheus:
remoteWrite:
- url: "https://basicauth.example.com/api/write"
basicAuth:
username:
name: rw-basic-auth
key: user
password:
name: rw-basic-auth
key: password
3.4.1.2.3. 使用 Secret 对象通过 bearer 令牌进行身份验证的 YAML 示例 复制链接链接已复制到粘贴板!
以下显示了 openshift-user-workload-monitoring 命名空间中名为 rw-bearer-auth 的 Secret 对象的 bearer 令牌设置:
apiVersion: v1
kind: Secret
metadata:
name: rw-bearer-auth
namespace: openshift-user-workload-monitoring
stringData:
token: <authentication_token>
type: Opaque
- 1
- 身份验证令牌。
以下显示了在 openshift-user-workload-monitoring 命名空间中使用名为 rw-bearer-auth 的 Secret 对象的 bearer 令牌配置映射设置示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: user-workload-monitoring-config
namespace: openshift-user-workload-monitoring
data:
config.yaml: |
prometheus:
remoteWrite:
- url: "https://authorization.example.com/api/write"
authorization:
type: Bearer
credentials:
name: rw-bearer-auth
key: token
3.4.1.2.4. 用于 OAuth 2.0 验证的 YAML 示例 复制链接链接已复制到粘贴板!
以下显示了 openshift-user-workload-monitoring 命名空间中名为 oauth2-credentials 的 Secret 对象的 OAuth 2.0 设置示例:
apiVersion: v1
kind: Secret
metadata:
name: oauth2-credentials
namespace: openshift-user-workload-monitoring
stringData:
id: <oauth2_id>
secret: <oauth2_secret>
type: Opaque
下面显示了一个 oauth2 远程写入身份验证示例配置,它使用 openshift-user-workload-monitoring 命名空间中名为 oauth2-credentials 的 Secret 对象:
apiVersion: v1
kind: ConfigMap
metadata:
name: user-workload-monitoring-config
namespace: openshift-user-workload-monitoring
data:
config.yaml: |
prometheus:
remoteWrite:
- url: "https://test.example.com/api/write"
oauth2:
clientId:
secret:
name: oauth2-credentials
key: id
clientSecret:
name: oauth2-credentials
key: secret
tokenUrl: https://example.com/oauth2/token
scopes:
- <scope_1>
- <scope_2>
endpointParams:
param1: <parameter_1>
param2: <parameter_2>
3.4.1.2.5. TLS 客户端身份验证的 YAML 示例 复制链接链接已复制到粘贴板!
以下显示了 openshift-user-workload-monitoring 命名空间中名为 mtls-bundle 的 tls Secret 对象的 TLS 客户端设置示例。
apiVersion: v1
kind: Secret
metadata:
name: mtls-bundle
namespace: openshift-user-workload-monitoring
data:
ca.crt: <ca_cert>
client.crt: <client_cert>
client.key: <client_key>
type: tls
以下示例显示了使用名为 mtls-bundle 的 TLS Secret 对象的 tlsConfig 远程写入身份验证配置。
apiVersion: v1
kind: ConfigMap
metadata:
name: user-workload-monitoring-config
namespace: openshift-user-workload-monitoring
data:
config.yaml: |
prometheus:
remoteWrite:
- url: "https://remote-write-endpoint.example.com"
tlsConfig:
ca:
secret:
name: mtls-bundle
key: ca.crt
cert:
secret:
name: mtls-bundle
key: client.crt
keySecret:
name: mtls-bundle
key: client.key
3.4.1.3. 远程写入队列配置示例 复制链接链接已复制到粘贴板!
您可以使用 queueConfig 对象来远程写入,以调优远程写入队列参数。以下示例显示了 queue 参数,以及它们用于监控 openshift-user-workload-monitoring 命名空间中的用户定义的项目的默认值。
使用默认值进行远程写入参数配置示例
apiVersion: v1
kind: ConfigMap
metadata:
name: user-workload-monitoring-config
namespace: openshift-user-workload-monitoring
data:
config.yaml: |
prometheus:
remoteWrite:
- url: "https://remote-write-endpoint.example.com"
<endpoint_authentication_credentials>
queueConfig:
capacity: 10000
minShards: 1
maxShards: 50
maxSamplesPerSend: 2000
batchSendDeadline: 5s
minBackoff: 30ms
maxBackoff: 5s
retryOnRateLimit: false
sampleAgeLimit: 0s
3.4.1.4. 远程写入指标表 复制链接链接已复制到粘贴板!
下表包含远程写入和远程 write-adjacent 指标,其中包含进一步的描述,以帮助在远程写入配置过程中解决问题。
| 指标 | 描述 |
|---|---|
|
| 显示 Prometheus 存储在任何样本的 write-ahead 日志(WAL)的最新时间戳。 |
|
| 显示远程写入队列成功发送的最新时间戳。 |
|
| 远程写入无法发送的示例数量,必须重新发送到远程存储。如果此指标一直稳定在高速率,则表示网络或远程存储端点的问题。 |
|
| 显示当前为每个远程端点运行多少个分片。 |
|
| 根据当前的写入吞吐量和传入与发送样本的速率显示计算的分片数量。 |
|
| 显示基于当前配置的分片的最大数量。 |
|
| 显示基于当前配置的分片的最小数量。 |
|
| Prometheus 当前正在写入新数据的 WAL 段文件。 |
|
| 每个远程写入实例当前读取的 WAL 段文件。 |
3.4.2. 为指标创建集群 ID 标签 复制链接链接已复制到粘贴板!
您可以通过在 openshift-user-workload-monitoring 命名空间中为 user-workload-monitoring-config 配置映射中添加远程写入存储的 write_relabel 设置来为指标创建集群 ID 标签。
先决条件
-
您可以使用具有
dedicated-admin角色的用户访问集群。 -
user-workload-monitoring-configConfigMap 对象存在。在集群创建时默认创建此对象。 -
已安装 OpenShift CLI(
oc)。 - 您已配置了远程写入存储。
流程
编辑
openshift-user-workload-monitoring项目中的user-workload-monitoring-config配置映射:$ oc -n openshift-user-workload-monitoring edit configmap user-workload-monitoring-config在
data/config.yaml/prometheus/remoteWrite下的writeRelabelConfigs:部分中,添加集群 ID 重新标记配置值:apiVersion: v1 kind: ConfigMap metadata: name: user-workload-monitoring-config namespace: openshift-user-workload-monitoring data: config.yaml: | prometheus: remoteWrite: - url: "https://remote-write-endpoint.example.com" <endpoint_authentication_credentials> writeRelabelConfigs:1 - <relabel_config>2 以下示例演示了如何使用集群 ID 标签
cluster_id转发指标:apiVersion: v1 kind: ConfigMap metadata: name: user-workload-monitoring-config namespace: openshift-user-workload-monitoring data: config.yaml: | prometheus: remoteWrite: - url: "https://remote-write-endpoint.example.com" writeRelabelConfigs: - sourceLabels: - __tmp_openshift_cluster_id__1 targetLabel: cluster_id2 action: replace3 - 保存文件以使改变生效。新的配置会被自动应用。
3.4.3. 为用户定义的项目设置指标集合 复制链接链接已复制到粘贴板!
您可以创建一个 ServiceMonitor 资源,从用户定义的项目中的服务端点提取指标。这假设您的应用程序使用 Prometheus 客户端库向 /metrics 规范名称公开指标。
本节介绍了如何在用户定义的项目中部署示例服务,然后创建一个 ServiceMonitor 资源来定义应该如何监控该服务。
3.4.3.1. 部署示例服务 复制链接链接已复制到粘贴板!
要为用户定义的项目中服务测试监控,您可以部署示例服务。
先决条件
-
您可以使用具有
cluster-admin集群角色或具有命名空间管理权限的用户身份访问集群。
流程
-
为服务配置创建 YAML 文件。在本例中,该文件名为
prometheus-example-app.yaml。 在该文件中添加以下部署和服务配置详情:
apiVersion: v1 kind: Namespace metadata: name: ns1 --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: prometheus-example-app name: prometheus-example-app namespace: ns1 spec: replicas: 1 selector: matchLabels: app: prometheus-example-app template: metadata: labels: app: prometheus-example-app spec: containers: - image: ghcr.io/rhobs/prometheus-example-app:0.4.2 imagePullPolicy: IfNotPresent name: prometheus-example-app --- apiVersion: v1 kind: Service metadata: labels: app: prometheus-example-app name: prometheus-example-app namespace: ns1 spec: ports: - port: 8080 protocol: TCP targetPort: 8080 name: web selector: app: prometheus-example-app type: ClusterIP此配置会在用户定义的
ns1项目中部署名为prometheus-example-app的服务。此服务会公开自定义version指标。将配置应用到集群:
$ oc apply -f prometheus-example-app.yaml部署该服务需要一些时间。
您可以检查该 Pod 是否正在运行:
$ oc -n ns1 get pod输出示例
NAME READY STATUS RESTARTS AGE prometheus-example-app-7857545cb7-sbgwq 1/1 Running 0 81m
3.4.3.2. 指定如何监控服务 复制链接链接已复制到粘贴板!
要使用服务公开的指标,您必须配置 Red Hat OpenShift Service on AWS 来从 /metrics 端点中提取指标。您可以使用一个 ServiceMonitor 自定义资源定义(CRD)应该如何监控服务,或使用一个 PodMonitor CRD 指定应该如何监控 pod。前者需要 Service 对象,而后者则不需要,允许 Prometheus 直接从 Pod 公开的指标端点中提取指标。
此流程演示了如何为用户定义的项目中的服务创建 ServiceMonitor 资源。
先决条件
-
您可以使用具有
dedicated-admin角色或monitoring-edit角色的用户访问集群。 在本例中,您已在
ns1项目中部署了prometheus-example-app示例服务。注意prometheus-example-app示例服务不支持 TLS 身份验证。
流程
-
创建名为
example-app-service-monitor.yaml的新 YAML 配置文件。 将
ServiceMonitor资源添加到 YAML 文件中。以下示例创建一个名为prometheus-example-monitor的服务监控器,用于提取ns1命名空间中的prometheus-example-app服务公开的指标:apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: prometheus-example-monitor namespace: ns11 spec: endpoints: - interval: 30s port: web2 scheme: http selector:3 matchLabels: app: prometheus-example-app注意用户定义的命名空间中的
ServiceMonitor资源只能发现同一命名空间中的服务。也就是说,ServiceMonitor资源的namespaceSelector字段总是被忽略。将配置应用到集群:
$ oc apply -f example-app-service-monitor.yaml部署
ServiceMonitor资源需要一些时间。验证
ServiceMonitor资源是否正在运行:$ oc -n <namespace> get servicemonitor输出示例
NAME AGE prometheus-example-monitor 81m
3.4.3.3. 服务端点身份验证设置示例 复制链接链接已复制到粘贴板!
您可以使用 ServiceMonitor 和 PodMonitor 自定义资源定义(CRD) 为用户定义的项目监控配置服务端点身份验证。
以下示例显示了 ServiceMonitor 资源的不同身份验证设置。每个示例演示了如何配置包含身份验证凭据和其他相关设置的对应 Secret 对象。
3.4.3.3.1. 使用 bearer 令牌的 YAML 身份验证示例 复制链接链接已复制到粘贴板!
以下示例显示了 ns1 命名空间中名为 example-bearer-auth 的 Secret 对象的 bearer 令牌设置:
bearer 令牌 secret 示例
apiVersion: v1
kind: Secret
metadata:
name: example-bearer-auth
namespace: ns1
stringData:
token: <authentication_token>
- 1
- 指定身份验证令牌。
以下示例显示了 ServiceMonitor CRD 的 bearer 令牌身份验证设置。这个示例使用名为 example-bearer-auth 的 Secret 对象:
bearer 令牌身份验证设置示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: prometheus-example-monitor
namespace: ns1
spec:
endpoints:
- authorization:
credentials:
key: token
name: example-bearer-auth
port: web
selector:
matchLabels:
app: prometheus-example-app
不要使用 bearerTokenFile 来配置 bearer 令牌。如果使用 bearerTokenFile 配置,ServiceMonitor 资源将被拒绝。
3.4.3.3.2. 用于基本身份验证的 YAML 示例 复制链接链接已复制到粘贴板!
以下示例显示了 ns1 命名空间中名为 example-basic-auth 的 Secret 对象基本身份验证设置:
基本身份验证 secret 示例
apiVersion: v1
kind: Secret
metadata:
name: example-basic-auth
namespace: ns1
stringData:
user: <basic_username>
password: <basic_password>
以下示例显示了 ServiceMonitor CRD 的基本身份验证设置。这个示例使用名为 example-basic-auth 的 Secret 对象:
基本身份验证设置示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: prometheus-example-monitor
namespace: ns1
spec:
endpoints:
- basicAuth:
username:
key: user
name: example-basic-auth
password:
key: password
name: example-basic-auth
port: web
selector:
matchLabels:
app: prometheus-example-app
3.4.3.3.3. 使用 OAuth 2.0 的 YAML 身份验证示例 复制链接链接已复制到粘贴板!
以下示例显示了 ns1 命名空间中名为 example-oauth2 的 Secret 对象的 OAuth 2.0 设置:
OAuth 2.0 secret 示例
apiVersion: v1
kind: Secret
metadata:
name: example-oauth2
namespace: ns1
stringData:
id: <oauth2_id>
secret: <oauth2_secret>
以下示例显示了 ServiceMonitor CRD 的 OAuth 2.0 身份验证设置。这个示例使用名为 example-oauth2 的 Secret 对象:
OAuth 2.0 身份验证设置示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: prometheus-example-monitor
namespace: ns1
spec:
endpoints:
- oauth2:
clientId:
secret:
key: id
name: example-oauth2
clientSecret:
key: secret
name: example-oauth2
tokenUrl: https://example.com/oauth2/token
port: web
selector:
matchLabels:
app: prometheus-example-app