3.2. 配置
Tempo Operator 使用自定义资源定义(CRD)文件来定义创建和部署分布式追踪平台(Tempo)资源时要使用的架构和配置设置。您可以安装默认配置或修改该文件。
3.2.1. 配置后端存储
有关配置后端存储的详情,请参考 了解持久性存储 以及您选择的存储选项的适当配置主题。
3.2.2. TempoStack 配置参数简介
TempoStack
自定义资源 (CR)定义创建分布式追踪平台 (Tempo) 资源时要使用的架构和设置。您可以根据您的业务需求,修改这些参数以自定义您的实现。
TempoStack
CR 示例
apiVersion: tempo.grafana.com/v1alpha1 1 kind: TempoStack 2 metadata: 3 name: <name> 4 spec: 5 storage: {} 6 resources: {} 7 replicationFactor: 1 8 retention: {} 9 template: distributor: {} 10 ingester: {} 11 compactor: {} 12 querier: {} 13 queryFrontend: {} 14 gateway: {} 15 limits: 16 global: ingestion: {} 17 query: {} 18 observability: 19 grafana: {} metrics: {} tracing: {} search: {} 20 managementState: managed 21
- 1
- 创建对象时要使用的 API 版本。
- 2
- 定义要创建的 Kubernetes 对象的种类。
- 3
- 唯一标识对象的数据,包括
name
字符串,UID
, 和可选的namespace
。OpenShift Container Platform 会自动生成UID
并使用创建对象的项目名称完成namespace
。 - 4
- TempoStack 实例的名称。
- 5
- 包含 TempoStack 实例的所有配置参数。当需要一个适用于所有 Tempo 组件的通用定义时,在
spec
部分中定义它。当定义只与单个组件相关时,将其放在spec.template.<component>
部分中。 - 6
- 存储在实例部署中指定。有关实例的存储选项的信息,请参阅安装页。
- 7
- 为 Tempo 容器定义计算资源。
- 8
- 在接受范围之前,必须确认经销商中的数据数量的整数值。
- 9
- 保留 trace 的配置选项。
- 10
- Tempo
distributor
组件的配置选项。 - 11
- Tempo
ingester
组件的配置选项。 - 12
- Tempo
compactor
组件的配置选项。 - 13
- Tempo
querier
组件的配置选项。 - 14
- Tempo
query-frontend
组件的配置选项。 - 15
- Tempo
gateway
组件的配置选项。 - 16
- 摄入(ingestion)和查询(query)率限制。
- 17
- 定义摄入率限制。
- 18
- 定义查询率限制。
- 19
- 配置操作对象以处理遥测数据。
- 20
- 配置搜索功能。
- 21
- 定义此 CR 是否由 Operator 管理。默认值为
managed
。
3.2.3. 查询配置选项
分布式追踪平台 (Tempo) 的两个组件,即 querier 和 query frontend,用于管理查询。您可以配置这两个组件。
querier 组件在 ingesters 或后端存储中查找请求的 trace ID。根据设置的参数,querier 组件可以查询 ingesters,并从后端拉取 bloom 或索引,以便在对象存储中搜索块。querier 组件在 GET /querier/api/traces/<trace_id>
公开 HTTP 端点,但不预期直接使用。查询必须发送到查询前端。
参数 | 描述 | 值 |
---|---|---|
| node-selection 约束的简单形式。 | 类型:对象 |
| 为组件创建的副本数。 | 类型:整数;格式: int32 |
| 特定于组件的 pod 容限。 | 类型:数组 |
查询前端组件负责为传入的查询对搜索空间进行分片。查询前端通过简单的 HTTP 端点公开 trace:GET /api/traces/<trace_id>
。在内部,查询 frontend 组件将 blockID
空间分成可配置的分片数量,然后对这些请求进行队列。querier 组件通过流 gRPC 连接连接到查询 frontend 组件,以处理这些分片查询。
参数 | 描述 | 值 |
---|---|---|
| 配置查询前端组件。 | 类型:对象 |
| 节点选择约束的简单形式。 | 类型:对象 |
| 为查询前端组件创建的副本数。 | 类型:整数;格式: int32 |
| 特定于查询前端组件的 Pod 容限。 | 类型:数组 |
| 特定于 Jaeger Query 组件的选项。 | 类型:对象 |
|
| 类型:布尔值 |
| Jaeger Query ingress 的选项。 | 类型:对象 |
| ingress 对象的注解。 | 类型:对象 |
| ingress 对象的主机名。 | 类型:字符串 |
| IngressClass 集群资源的名称。定义哪个入口控制器提供此入口资源。 | 类型:字符串 |
| OpenShift 路由的选项。 | 类型:对象 |
|
终止类型。默认为 | 类型:字符串 (enum: insecure, edge, passthrough, reencrypt) |
|
Jaeger Query UI 的 ingress 类型。支持的类型有 | 类型:字符串 (enum: ingress, route) |
| monitor 选项卡配置。 | 类型:对象 |
|
在 Jaeger 控制台中启用 monitor 选项卡。必须配置 | 类型:布尔值 |
|
包含 span rate、error 和 duration (RED) 指标的 Prometheus 实例的端点。例如: | 类型:字符串 |
TempoStack
CR 中的查询前端组件的配置示例
apiVersion: tempo.grafana.com/v1alpha1 kind: TempoStack metadata: name: simplest spec: storage: secret: name: minio type: s3 storageSize: 200M resources: total: limits: memory: 2Gi cpu: 2000m template: queryFrontend: jaegerQuery: enabled: true ingress: route: termination: edge type: route
其他资源
3.2.4. 在 Jaeger UI 中配置 monitor 选项卡
跟踪数据包含丰富的信息,数据在检测的语言和框架中规范化。因此,请求率、错误和持续时间(RED)指标可以从 trace 中提取。指标可以在 Jaeger 控制台的 Monitor 选项卡中视觉化。
指标派生自 OpenTelemetry Collector 中的 span,由 user-workload 监控堆栈中部署的 Prometheus 从 Collector 中提取。Jaeger UI 从 Prometheus 端点查询这些指标,并视觉化它们。
3.2.4.1. OpenTelemetry Collector 配置
OpenTelemetry Collector 需要配置 spanmetrics
连接器,该连接器从 trace 中派生指标,并以 Prometheus 格式导出指标。
OpenTelemetry Collector 自定义资源,用于 span RED
kind: OpenTelemetryCollector apiVersion: opentelemetry.io/v1alpha1 metadata: name: otel spec: mode: deployment observability: metrics: enableMetrics: true 1 config: | connectors: spanmetrics: 2 metrics_flush_interval: 15s receivers: otlp: 3 protocols: grpc: http: exporters: prometheus: 4 endpoint: 0.0.0.0:8889 add_metric_suffixes: false resource_to_telemetry_conversion: enabled: true # by default resource attributes are dropped otlp: endpoint: "tempo-simplest-distributor:4317" tls: insecure: true service: pipelines: traces: receivers: [otlp] exporters: [otlp, spanmetrics] 5 metrics: receivers: [spanmetrics] 6 exporters: [prometheus]
3.2.4.2. Tempo 配置
TempoStack
自定义资源必须指定以下内容: Monitor 选项卡已启用,Prometheus 端点则设置为 Thanos querier 服务,以从用户定义的监控堆栈查询数据。
带有启用的 Monitor 选项卡的 TempoStack 自定义资源
apiVersion: tempo.grafana.com/v1alpha1 kind: TempoStack metadata: name: redmetrics spec: storage: secret: name: minio-test type: s3 storageSize: 1Gi template: gateway: enabled: false queryFrontend: jaegerQuery: enabled: true monitorTab: enabled: true 1 prometheusEndpoint: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091 2 ingress: type: route
3.2.4.3. Span RED 指标和警报规则
spanmetrics
连接器生成的指标可用于警报规则。例如,对于有关较慢的服务或定义服务级别目标(SLO)的警报,连接器会创建一个 duration_bucket
直方图和 调用
计数器指标。这些指标具有标识服务、API 名称、操作类型和其他属性的标签。
标签 | 描述 | 值 |
---|---|---|
|
由 |
|
| 操作的名称。 |
|
| 标识服务器、客户端、消息传递或内部操作。 |
|
PrometheusRule
CR 示例,它为 SLO 定义了一个警告规则 - 在前端服务中,有 95% 的请求在 2000ms 内没有被处理完。
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: span-red
spec:
groups:
- name: server-side-latency
rules:
- alert: SpanREDFrontendAPIRequestLatency
expr: histogram_quantile(0.95, sum(rate(duration_bucket{service_name="frontend", span_kind="SPAN_KIND_SERVER"}[5m])) by (le, service_name, span_name)) > 2000 1
labels:
severity: Warning
annotations:
summary: "High request latency on {{$labels.service_name}} and {{$labels.span_name}}"
description: "{{$labels.instance}} has 95th request latency above 2s (current value: {{$value}}s)"
- 1
- 这个表达式检查,是否 95% 的前端服务器响应时间值低于 2000 ms。时间范围 (
[5m]
) 必须至少是提取间隔的四倍,并且足以适应指标的变化。
3.2.5. 配置接收器 TLS
TempoStack 或 TempoMonolithic 实例的自定义资源支持使用用户提供的证书或 OpenShift 的服务证书为接收器配置 TLS。
3.2.5.1. TempoStack 实例的接收器 TLS 配置
您可以在 secret 中提供 TLS 证书,或使用 OpenShift Container Platform 生成的服务证书。
要在 secret 中提供 TLS 证书,请在
TempoStack
自定义资源中配置它。注意启用的 Tempo Gateway 不支持此功能。
TLS 用于接收器并在 secret 中使用用户提供的证书
apiVersion: tempo.grafana.com/v1alpha1 kind: TempoStack # ... spec: # ... template: distributor: tls: enabled: true 1 certName: <tls_secret> 2 caName: <ca_name> 3 # ...
另外,您可以使用 OpenShift Container Platform 生成的服务证书。
注意此功能不支持 mutual TLS 身份验证 (mTLS)。
用于接收器的 TLS 并使用 OpenShift Container Platform 生成的服务证书
apiVersion: tempo.grafana.com/v1alpha1 kind: TempoStack # ... spec: # ... template: distributor: tls: enabled: true 1 # ...
- 1
- 在 Tempo Distributor 为 TLS 进行足够配置。
3.2.5.2. TempoMonolithic 实例的接收器 TLS 配置
您可以在 secret 中提供 TLS 证书,或使用 OpenShift Container Platform 生成的服务证书。
要在 secret 中提供 TLS 证书,请在
TempoMonolithic
自定义资源中配置它。注意启用的 Tempo Gateway 不支持此功能。
TLS 用于接收器并在 secret 中使用用户提供的证书
apiVersion: tempo.grafana.com/v1alpha1 kind: TempoMonolithic # ... spec: # ... ingestion: otlp: grpc: tls: enabled: true 1 certName: <tls_secret> 2 caName: <ca_name> 3 # ...
另外,您可以使用 OpenShift Container Platform 生成的服务证书。
注意此功能不支持 mutual TLS 身份验证 (mTLS)。
用于接收器的 TLS 并使用 OpenShift Container Platform 生成的服务证书
apiVersion: tempo.grafana.com/v1alpha1 kind: TempoMonolithic # ... spec: # ... ingestion: otlp: grpc: tls: enabled: true http: tls: enabled: true 1 # ...
- 1
- 在 Tempo Distributor 为 TLS 的最小配置。
3.2.6. 多租户
Tempo Gateway 服务中提供了带有身份验证和授权的多租户。身份验证使用 OpenShift OAuth 和 Kubernetes TokenReview
API。授权使用 Kubernetes SubjectAccessReview
API。
Tempo Gateway 服务只支持通过 OTLP/gRPC 处理 trace。不支持 OTLP/HTTP。
带有两个租户的 Tempo CR 示例,dev
和 prod
apiVersion: tempo.grafana.com/v1alpha1 kind: TempoStack metadata: name: simplest namespace: chainsaw-multitenancy spec: storage: secret: name: minio type: s3 storageSize: 1Gi resources: total: limits: memory: 2Gi cpu: 2000m tenants: mode: openshift 1 authentication: 2 - tenantName: dev 3 tenantId: "1610b0c3-c509-4592-a256-a1871353dbfa" 4 - tenantName: prod tenantId: "1610b0c3-c509-4592-a256-a1871353dbfb" template: gateway: enabled: true 5 queryFrontend: jaegerQuery: enabled: true
授权配置使用 Kubernetes 基于角色的访问控制(RBAC)的 ClusterRole
和 ClusterRoleBinding
。默认情况下,任何用户都没有读取或写入权限。
允许经过身份验证的用户读取 dev
和 prod
租户的 trace 数据的读取 RBAC 配置示例
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: tempostack-traces-reader rules: - apiGroups: - 'tempo.grafana.com' resources: 1 - dev - prod resourceNames: - traces verbs: - 'get' 2 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tempostack-traces-reader roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: tempostack-traces-reader subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated 3
允许 otel-collector
服务帐户编写 dev
租户的 trace 数据的写入 RBAC 配置示例
apiVersion: v1 kind: ServiceAccount metadata: name: otel-collector 1 namespace: otel --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: tempostack-traces-write rules: - apiGroups: - 'tempo.grafana.com' resources: 2 - dev resourceNames: - traces verbs: - 'create' 3 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tempostack-traces roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: tempostack-traces-write subjects: - kind: ServiceAccount name: otel-collector namespace: otel
追踪数据可以从 OpenTelemetry 收集器发送到 Tempo 实例,该收集器使用带有 RBAC 的服务帐户来写入数据。
OpenTelemetry CR 配置示例
apiVersion: opentelemetry.io/v1alpha1 kind: OpenTelemetryCollector metadata: name: cluster-collector namespace: tracing-system spec: mode: deployment serviceAccount: otel-collector config: | extensions: bearertokenauth: filename: "/var/run/secrets/kubernetes.io/serviceaccount/token" exporters: otlp/dev: 1 endpoint: tempo-simplest-gateway.tempo.svc.cluster.local:8090 tls: insecure: false ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt" auth: authenticator: bearertokenauth headers: X-Scope-OrgID: "dev" otlphttp/dev: 2 endpoint: https://tempo-simplest-gateway.chainsaw-multitenancy.svc.cluster.local:8080/api/traces/v1/dev tls: insecure: false ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt" auth: authenticator: bearertokenauth headers: X-Scope-OrgID: "dev" service: extensions: [bearertokenauth] pipelines: traces: exporters: [otlp/dev] 3
3.2.7. 使用污点和容限
要将 TempoStack pod 调度到专用节点上,请参阅 如何在 OpenShift 4 中使用 nodeSelector 和 tolerations 在 infra 节点上部署不同的 TempoStack 组件。
3.2.8. 配置监控和警报
Tempo Operator 支持每个 TempoStack 组件的监控和警报,如经销商、ingester 等,并公开有关 Operator 本身的升级和操作指标。
3.2.8.1. 配置 TempoStack 指标和警报
您可以启用 TempoStack 实例的指标和警报。
先决条件
- 在集群中启用对用户定义的项目的监控。
流程
要启用 TempoStack 实例的指标,请将
spec.observability.metrics.createServiceMonitors
字段设置为true
:apiVersion: tempo.grafana.com/v1alpha1 kind: TempoStack metadata: name: <name> spec: observability: metrics: createServiceMonitors: true
要为 TempoStack 实例启用警报,请将
spec.observability.metrics.createPrometheusRules
字段设置为true
:apiVersion: tempo.grafana.com/v1alpha1 kind: TempoStack metadata: name: <name> spec: observability: metrics: createPrometheusRules: true
验证
您可以使用 Web 控制台的 Administrator 视图来验证配置是否成功:
-
进入 Observe
Targets,过滤 Source: User, 检查 ServiceMonitors(格式为 tempo-<instance_name>-<component>
)的状态为 Up。 -
要验证警报是否已正确设置,请转至 Observe
Alerting Alerting rules,过滤 Source: User,并检查 TempoStack 实例组件的 Alert 规则 是否可用。
其他资源
3.2.8.2. 配置 Tempo Operator 指标和警报
从 web 控制台安装 Tempo Operator 时,您可以选择 Enable Operator recommended cluster monitoring on this Namespace 复选框,它允许创建 Tempo Operator 的指标和警报。
如果在安装过程中没有选择复选框,您可以在安装 Tempo Operator 后手动启用指标和警报。
流程
-
在安装了 Tempo Operator 的项目中添加
openshift.io/cluster-monitoring: "true"
标签,默认为openshift-tempo-operator
。
验证
您可以使用 Web 控制台的 Administrator 视图来验证配置是否成功:
-
进入 Observe
Targets,过滤 Source: Platform,并搜索 tempo-operator
,它必须具有 Up 状态。 -
要验证警报是否已正确设置,请转至 Observe
Alerting Alerting rules,过滤 Source: Platform,再找到 Tempo Operator 的 Alert 规则。