8.4. Tracing

8.4.1. 跟踪请求

分布式追踪记录了一个请求在组成一个应用程序的多个微服务间的路径。它被用来将不同工作单元的信息串联在一起,理解分布式事务中整个事件链。工作单元可能会在不同进程或主机中执行。

8.4.1.1. 分布式追踪概述

作为服务所有者,您可以使用分布式追踪来检测您的服务,以收集与服务架构相关的信息。您可以使用分布式追踪来监控、网络性能分析,并对现代、云原生的基于微服务的应用中组件之间的交互进行故障排除。

通过分布式追踪,您可以执行以下功能:

  • 监控分布式事务
  • 优化性能和延迟时间
  • 执行根原因分析

Red Hat OpenShift distributed tracing 包括两个主要组件:

  • Red Hat OpenShift distributed tracing Platform - 此组件基于开源 Jaeger 项目
  • Red Hat OpenShift distributed tracing 数据收集 - 此组件基于开源 OpenTelemetry 项目

这两个组件都基于厂商中立的 OpenTracing API 和工具。

8.4.1.2. 其他资源

8.4.2. 使用 Red Hat OpenShift distributed tracing

您可以使用 Red Hat OpenShift Serverless 的 Red Hat OpenShift distributed tracing 监控无服务器应用程序并进行故障排除。

8.4.2.1. 使用 Red Hat OpenShift distributed tracing 启用分布式追踪

Red Hat OpenShift distributed tracing 由几个组件组成,它们一起收集、存储和显示追踪数据。

先决条件

  • 您可以访问具有集群管理员权限的 OpenShift Container Platform 帐户。
  • 还没有安装 OpenShift Serverless Operator、Knative Serving 和 Knative Eventing。这些需要在 Red Hat OpenShift distributed tracing 安装后安装。
  • 您已按照 OpenShift Container Platform "Installing distributed tracing" 文档 安装了 Red Hat OpenShift distributed tracing。
  • 已安装 OpenShift CLI(oc)。
  • 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。

流程

  1. 创建 OpenTelemetryCollector 自定义资源 (CR) :

    OpenTelemetryCollector CR 示例

    apiVersion: opentelemetry.io/v1alpha1
    kind: OpenTelemetryCollector
    metadata:
      name: cluster-collector
      namespace: <namespace>
    spec:
      mode: deployment
      config: |
        receivers:
          zipkin:
        processors:
        exporters:
          jaeger:
            endpoint: jaeger-all-in-one-inmemory-collector-headless.tracing-system.svc:14250
            tls:
              ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt"
          logging:
        service:
          pipelines:
            traces:
              receivers: [zipkin]
              processors: []
              exporters: [jaeger, logging]

  2. 验证有两个 pod 在安装了 Red Hat OpenShift distributed tracing 的命名空间中运行:

    $ oc get pods -n <namespace>

    输出示例

    NAME                                          READY   STATUS    RESTARTS   AGE
    cluster-collector-collector-85c766b5c-b5g99   1/1     Running   0          5m56s
    jaeger-all-in-one-inmemory-ccbc9df4b-ndkl5    2/2     Running   0          15m

  3. 验证是否已创建以下无头服务:

    $ oc get svc -n <namespace> | grep headless

    输出示例

    cluster-collector-collector-headless            ClusterIP   None             <none>        9411/TCP                                 7m28s
    jaeger-all-in-one-inmemory-collector-headless   ClusterIP   None             <none>        9411/TCP,14250/TCP,14267/TCP,14268/TCP   16m

    这些服务用于配置 Jaeger、Knative Serving 和 Knative Eventing。Jaeger 服务的名称可能会有所不同。

  4. 按照"安装 OpenShift Serverless Operator"文档安装 OpenShift Serverless Operator。
  5. 通过创建以下 KnativeServing CR 来安装 Knative Serving:

    KnativeServing CR 示例

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
        name: knative-serving
        namespace: knative-serving
    spec:
      config:
        tracing:
          backend: "zipkin"
          zipkin-endpoint: "http://cluster-collector-collector-headless.tracing-system.svc:9411/api/v2/spans"
          debug: "false"
          sample-rate: "0.1" 1

    1
    sample-rate 定义抽样概率。sample-rate: "0.1" 表示在 10 个 trace 中会抽样 1 个。
  6. 通过创建以下 KnativeEventing CR 来安装 Knative Eventing

    Example KnativeEventing CR

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeEventing
    metadata:
        name: knative-eventing
        namespace: knative-eventing
    spec:
      config:
        tracing:
          backend: "zipkin"
          zipkin-endpoint: "http://cluster-collector-collector-headless.tracing-system.svc:9411/api/v2/spans"
          debug: "false"
          sample-rate: "0.1" 1

    1
    sample-rate 定义抽样概率。sample-rate: "0.1" 表示在 10 个 trace 中会抽样 1 个。
  7. 创建 Knative 服务:

    服务示例

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          labels:
            app: helloworld-go
          annotations:
            autoscaling.knative.dev/minScale: "1"
            autoscaling.knative.dev/target: "1"
        spec:
          containers:
          - image: quay.io/openshift-knative/helloworld:v1.2
            imagePullPolicy: Always
            resources:
              requests:
                cpu: "200m"
            env:
            - name: TARGET
              value: "Go Sample v1"

  8. 向服务发出一些请求:

    HTTPS 请求示例

    $ curl https://helloworld-go.example.com

  9. 获取 Jaeger web 控制台的 URL:

    示例命令

    $ oc get route jaeger-all-in-one-inmemory  -o jsonpath='{.spec.host}' -n <namespace>

    现在,您可以使用 Jaeger 控制台检查 trace。

8.4.3. 使用 Jaeger 分布式追踪

如果您不想安装 Red Hat OpenShift distributed tracing 的所有组件,您仍可使用带有 OpenShift Serverless 的 OpenShift Container Platform 上的分布式追踪。

8.4.3.1. 配置 Jaeger 以启用分布式追踪

要使用 Jaeger 启用分布式追踪,您必须安装并配置 Jaeger 作为独立集成。

先决条件

  • 您可以访问具有集群管理员权限的 OpenShift Container Platform 帐户。
  • 已安装 OpenShift Serverless Operator、Knative Serving 和 Knative Eventing。
  • 已安装 Red Hat OpenShift distributed tracing platform Operator。
  • 已安装 OpenShift CLI(oc)。
  • 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。

流程

  1. 创建并应用包含以下内容的 Jaeger 自定义资源(CR):

    Jaeger CR

    apiVersion: jaegertracing.io/v1
    kind: Jaeger
    metadata:
      name: jaeger
      namespace: default

  2. 通过编辑 KnativeServing CR 并添加用于追踪的 YAML 配置来启用 Knative Serving 的追踪:

    Serving 的追踪 YAML 示例

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeServing
    metadata:
      name: knative-serving
      namespace: knative-serving
    spec:
      config:
        tracing:
          sample-rate: "0.1" 1
          backend: zipkin 2
          zipkin-endpoint: "http://jaeger-collector.default.svc.cluster.local:9411/api/v2/spans" 3
          debug: "false" 4

    1
    sample-rate 定义抽样概率。sample-rate: "0.1" 表示在 10 个 trace 中会抽样 1 个。
    2
    后端 必须设为 zipkin
    3
    zipkin-endpoint 必须指向您的 jaeger-collector 服务端点。要获取此端点,请替换应用 Jaeger CR 的命名空间。
    4
    调试(debugging)应设为 false。通过设置 debug: "true" 启用调试模式,可绕过抽样将所有 span 发送到服务器。
  3. 通过编辑 KnativeEventing CR 来启用 Knative Eventing 的追踪:

    Eventing 的追踪 YAML 示例

    apiVersion: operator.knative.dev/v1beta1
    kind: KnativeEventing
    metadata:
      name: knative-eventing
      namespace: knative-eventing
    spec:
      config:
        tracing:
          sample-rate: "0.1" 1
          backend: zipkin 2
          zipkin-endpoint: "http://jaeger-collector.default.svc.cluster.local:9411/api/v2/spans" 3
          debug: "false" 4

    1
    sample-rate 定义抽样概率。sample-rate: "0.1" 表示在 10 个 trace 中会抽样 1 个。
    2
    backend 设置为 zipkin
    3
    zipkin-endpoint 指向 jaeger-collector 服务端点。要获取此端点,请替换应用 Jaeger CR 的命名空间。
    4
    调试(debugging)应设为 false。通过设置 debug: "true" 启用调试模式,可绕过抽样将所有 span 发送到服务器。

验证

您可以使用 jaeger 路由来访问 Jaeger web 控制台以查看追踪数据。

  1. 输入以下命令来获取 jaeger 路由的主机名:

    $ oc get route jaeger -n default

    输出示例

    NAME     HOST/PORT                         PATH   SERVICES       PORT    TERMINATION   WILDCARD
    jaeger   jaeger-default.apps.example.com          jaeger-query   <all>   reencrypt     None

  2. 在浏览器中使用端点地址来查看控制台。