×

配置后端存储

有关配置后端存储的信息,请参见 理解持久性存储 以及您选择的存储选项的相关配置部分。

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 跟踪保留的配置选项。
10 Tempo distributor 组件的配置选项。
11 Tempo ingester 组件的配置选项。
12 Tempo compactor 组件的配置选项。
13 Tempo querier 组件的配置选项。
14 Tempo query-frontend 组件的配置选项。
15 Tempo gateway 组件的配置选项。
16 限制摄取和查询速率。
17 定义摄取速率限制。
18 定义查询速率限制。
19 配置操作数以处理遥测数据。
20 配置搜索功能。
21 定义此 CR 是否由 Operator 管理。默认值为 managed

查询配置选项

分布式追踪平台 (Tempo) 的两个组件,查询器 (querier) 和查询前端 (query frontend),负责管理查询。您可以配置这两个组件。

查询器组件在 ingester 或后端存储中查找请求的 trace ID。根据设置的参数,查询器组件可以同时查询 ingester 并从后端拉取布隆过滤器 (bloom filter) 或索引来搜索对象存储中的块。查询器组件在GET /querier/api/traces/<trace_id> 处公开了一个 HTTP 端点,但不建议直接使用。查询必须发送到查询前端。

表 1. 查询器组件的配置参数
参数 描述

nodeSelector

节点选择约束的简单形式。

类型:对象 (object)

replicas

要为组件创建的副本数量。

类型:整数 (integer);格式:int32

tolerations

组件特定的 Pod 容忍度。

类型:数组 (array)

查询前端组件负责为传入的查询划分搜索空间。查询前端通过简单的 HTTP 端点公开跟踪信息:GET /api/traces/<trace_id>。在内部,查询前端组件将blockID空间分割成可配置数量的片段,然后将这些请求排队。查询器组件通过流式 gRPC 连接连接到查询前端组件以处理这些分片查询。

表 2. 查询前端组件的配置参数
参数 描述

component

查询前端组件的配置。

类型:对象 (object)

component.nodeSelector

节点选择约束的简单形式。

类型:对象 (object)

component.replicas

要为查询前端组件创建的副本数量。

类型:整数 (integer);格式:int32

component.tolerations

查询前端组件特定的 Pod 容忍度。

类型:数组 (array)

jaegerQuery

Jaeger 查询组件的特定选项。

类型:对象 (object)

jaegerQuery.enabled

启用时,创建 Jaeger 查询组件 jaegerQuery

类型:布尔值 (boolean)

jaegerQuery.ingress

Jaeger 查询入口的选项。

类型:对象 (object)

jaegerQuery.ingress.annotations

入口对象的注解。

类型:对象 (object)

jaegerQuery.ingress.host

入口对象的hostname。

类型:字符串 (string)

jaegerQuery.ingress.ingressClassName

IngressClass 集群资源的名称。定义哪个 ingress 控制器服务此 ingress 资源。

类型:字符串 (string)

jaegerQuery.ingress.route

OpenShift 路由的选项。

类型:对象 (object)

jaegerQuery.ingress.route.termination

终止类型。默认为edge

类型:字符串 (string) (枚举:insecure, edge, passthrough, reencrypt)

jaegerQuery.ingress.type

Jaeger 查询 UI 的入口类型。支持的类型为ingressroutenone

类型:字符串 (string) (枚举:ingress, route)

jaegerQuery.monitorTab

监控选项卡配置。

类型:对象 (object)

jaegerQuery.monitorTab.enabled

启用 Jaeger 控制台中的监控选项卡。必须配置PrometheusEndpoint

类型:布尔值 (boolean)

jaegerQuery.monitorTab.prometheusEndpoint

包含跨度速率、错误和持续时间 (RED) 指标的 Prometheus 实例的端点。例如,https://thanos-querier.openshift-monitoring.svc.cluster.local:9091

类型:字符串 (string)

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

Jaeger UI 中监控选项卡的配置

跟踪数据包含丰富的信息,并且数据在已检测的语言和框架之间进行了标准化。因此,可以从跟踪中提取请求速率、错误和持续时间 (RED) 指标。这些指标可以在 Jaeger 控制台的**监控**选项卡中可视化。

这些指标是从 OpenTelemetry Collector 中的跨度派生的,这些跨度由用户工作负载监控堆栈中部署的 Prometheus 从 Collector 中抓取。Jaeger UI 从 Prometheus 端点查询这些指标并将其可视化。

OpenTelemetry Collector 配置

OpenTelemetry Collector 需要配置spanmetrics连接器,该连接器从跟踪中派生指标并以 Prometheus 格式导出指标。

用于 span RED 的 OpenTelemetry Collector 自定义资源
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]
1 创建ServiceMonitor自定义资源以启用 Prometheus 导出器的抓取。
2 Spanmetrics 连接器接收跟踪并导出指标。
3 OTLP 接收器用于接收 OpenTelemetry 协议中的跨度。
4 Prometheus 导出器用于以 Prometheus 格式导出指标。
5 Spanmetrics 连接器在跟踪管道中配置为导出器。
6 Spanmetrics 连接器在指标管道中配置为接收器。

Tempo 配置

TempoStack自定义资源必须指定以下内容:启用**监控**选项卡,并将 Prometheus 端点设置为 Thanos 查询器服务,以从用户定义的监控堆栈查询数据。

启用监控选项卡的 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
1 启用 Jaeger 控制台中的监控选项卡。
2 来自用户工作负载监控的 Thanos Querier 服务名称。

Span RED 指标和告警规则

spanmetrics连接器生成的指标可用于告警规则。例如,对于有关慢速服务的告警或定义服务级别目标 (SLO),连接器会创建一个duration_bucket直方图和calls计数器指标。这些指标具有标识服务、API 名称、操作类型和其他属性的标签。

表 3. 在spanmetrics连接器中创建的指标的标签
标签 描述

service_name

otel_service_name环境变量设置的服务名称。

frontend

span_name

操作的名称。

  • /

  • /customer

span_kind

标识服务器、客户端、消息传递或内部操作。

  • SPAN_KIND_SERVER

  • SPAN_KIND_CLIENT

  • SPAN_KIND_PRODUCER

  • SPAN_KIND_CONSUMER

  • SPAN_KIND_INTERNAL

定义前端服务在 2000 毫秒内未服务 95% 请求的 SLO 的示例PrometheusRule CR
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 毫秒的表达式。时间范围 ([5m]) 必须至少是抓取间隔的四倍,并且足够长以适应指标的变化。

配置接收器 TLS

您的 TempoStack 或 TempoMonolithic 实例的自定义资源支持通过使用用户提供的证书或 OpenShift 的服务提供证书来配置接收器的 TLS。

TempoStack 实例的接收器 TLS 配置

您可以秘密提供 TLS 证书,或者使用 OpenShift Container Platform 生成的服务提供证书。

  • 要在秘密中提供 TLS 证书,请在TempoStack自定义资源中配置它。

    启用 Tempo Gateway 后不支持此功能。

    接收器的 TLS 和使用保存在密钥中的用户提供的证书
    apiVersion: tempo.grafana.com/v1alpha1
    kind:  TempoStack
    # ...
    spec:
    # ...
      template:
        distributor:
          tls:
            enabled: true (1)
            certName: <tls_secret> (2)
            caName: <ca_name> (3)
    # ...
    1 在 Tempo Distributor 上启用 TLS。
    2 包含您提前应用的tls.key 密钥和tls.crt 证书的密钥。
    3 可选:配置映射中的 CA,以启用相互 TLS 身份验证 (mTLS)。
  • 或者,您可以使用 OpenShift Container Platform 生成的服务提供证书。

    此功能不支持相互 TLS 身份验证 (mTLS)。

    接收器的 TLS 和使用 OpenShift Container Platform 生成的服务提供的证书
    apiVersion: tempo.grafana.com/v1alpha1
    kind:  TempoStack
    # ...
    spec:
    # ...
      template:
        distributor:
          tls:
            enabled: true (1)
    # ...
    1 Tempo Distributor 上 TLS 的充分配置。

TempoMonolithic 实例的接收器 TLS 配置

您可以秘密提供 TLS 证书,或者使用 OpenShift Container Platform 生成的服务提供证书。

  • 要在密钥中提供 TLS 证书,请在TempoMonolithic自定义资源中对其进行配置。

    启用 Tempo Gateway 后不支持此功能。

    接收器的 TLS 和使用保存在密钥中的用户提供的证书
    apiVersion: tempo.grafana.com/v1alpha1
    kind:  TempoMonolithic
    # ...
      spec:
    # ...
      ingestion:
        otlp:
          grpc:
            tls:
              enabled: true (1)
              certName: <tls_secret> (2)
              caName: <ca_name> (3)
    # ...
    1 在 Tempo Distributor 上启用 TLS。
    2 包含您提前应用的tls.key 密钥和tls.crt 证书的密钥。
    3 可选:配置映射中的 CA,以启用相互 TLS 身份验证 (mTLS)。
  • 或者,您可以使用 OpenShift Container Platform 生成的服务提供证书。

    此功能不支持相互 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 的最小配置。

多租户

Tempo Gateway 服务提供具有身份验证和授权功能的多租户。身份验证使用 OpenShift OAuth 和 Kubernetes TokenReview API。授权使用 Kubernetes SubjectAccessReview API。

Tempo Gateway 服务仅通过 OTLP/gRPC 支持跟踪数据的摄取。不支持 OTLP/HTTP。

具有两个租户(devprod)的 Tempo CR 示例
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
1 必须设置为openshift
2 租户列表。
3 租户名称。在摄取数据时,必须在X-Scope-OrgId标头中提供。
4 唯一的租户 ID。
5 启用执行身份验证和授权的网关。Jaeger UI 公开在http://<gateway-ingress>/api/traces/v1/<tenant-name>/search

授权配置使用 Kubernetes 基于角色的访问控制 (RBAC) 的ClusterRoleClusterRoleBinding。默认情况下,没有用户具有读取或写入权限。

允许已认证用户读取devprod租户跟踪数据的读取 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)
1 列出租户。
2 get值启用读取操作。
3 授予所有已认证用户读取跟踪数据的权限。
允许otel-collector服务帐户为dev租户写入跟踪数据的写入 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
1 客户端导出跟踪数据时使用的服务帐户名称。客户端必须发送服务帐户令牌/var/run/secrets/kubernetes.io/serviceaccount/token作为承载令牌标头。
2 列出租户。
3 create值启用写入操作。

可以使用服务帐户(使用 RBAC 写入数据)的 OpenTelemetry Collector 将跟踪数据发送到 Tempo 实例。

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)
1 OTLP gRPC 导出器。
2 OTLP HTTP 导出器。
3 您可以为 OTLP gRPC 导出器指定otlp/dev,或为 OTLP HTTP 导出器指定otlphttp/dev

使用污点和容忍度

配置监控和告警

Tempo Operator 支持监控和告警每个 TempoStack 组件(例如分发器、摄取器等),并公开有关 Operator 本身的升级和操作指标。

配置 TempoStack 指标和告警

您可以启用 TempoStack 实例的指标和告警。

先决条件
  • 集群中启用了用户定义项目的监控。

步骤
  1. 要启用 TempoStack 实例的指标,请将spec.observability.metrics.createServiceMonitors字段设置为true

    apiVersion: tempo.grafana.com/v1alpha1
    kind: TempoStack
    metadata:
      name: <name>
    spec:
      observability:
        metrics:
          createServiceMonitors: true
  2. 要为 TempoStack 实例启用告警,请将spec.observability.metrics.createPrometheusRules字段设置为true

    apiVersion: tempo.grafana.com/v1alpha1
    kind: TempoStack
    metadata:
      name: <name>
    spec:
      observability:
        metrics:
          createPrometheusRules: true
验证

您可以使用 Web 控制台的**管理员**视图来验证配置是否成功。

  1. 转到**观察**→**目标**,筛选**来源:用户**,并检查格式为tempo-<instance_name>-<component>ServiceMonitors是否具有**正常**状态。

  2. 要验证告警是否正确设置,请转到**观察**→**告警**→**告警规则**,筛选**来源:用户**,并检查 TempoStack 实例组件的告警规则是否可用。

配置 Tempo Operator 指标和告警

从 Web 控制台安装 Tempo Operator 时,您可以选中**在此命名空间上启用 Operator 建议的集群监控**复选框,这将启用创建 Tempo Operator 的指标和告警。

如果在安装期间未选中此复选框,您甚至可以在安装 Tempo Operator 后手动启用指标和告警。

步骤
  • 在安装 Tempo Operator 的项目(默认为openshift-tempo-operator)中添加openshift.io/cluster-monitoring: "true"标签。

验证

您可以使用 Web 控制台的**管理员**视图来验证配置是否成功。

  1. 转到**观察**→**目标**,筛选**来源:平台**,并搜索tempo-operator,它必须具有**正常**状态。

  2. 要验证告警是否正确设置,请转到**观察**→**告警**→**告警规则**,筛选**来源:平台**,并找到**Tempo Operator**的告警规则