OpenCensus Agent

完成本任务之后,您将明白如何使用 OpenCensus Agent 跟踪应用, 如何将这些链路导出到 OpenTelemetry Collector, 以及如何使用 OpenTelemetry Collector 将这些 span 导出到 Jaeger。

若要学习 Istio 如何处理链路,请查阅本任务的概述

开始之前

  • 按照安装指南中的说明安装 Istio。

    如果您安装 demo安装配置, 则将启用 Egress Gateway 和访问日志。

  • sleep 示例应用程序部署为发送请求的测试源。 如果您启用了自动 Sidecar 注入, 运行以下命令部署示例应用程序:

    Zip

    1. $ kubectl apply -f @samples/sleep/sleep.yaml@

    否则,在使用以下命令部署 sleep 应用程序之前,手动注入 Sidecar:

    Zip

    1. $ kubectl apply -f <(istioctl kube-inject -f @samples/sleep/sleep.yaml@)

    您可以使用任何安装了 curl 的 Pod 作为测试源。

  • 为了发送请求,您需要创建 SOURCE_POD 环境变量来存储源 Pod 的名称:

    1. $ export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
  • 在集群中安装 Jaeger

  • 部署 Bookinfo 样例应用。

配置跟踪

如果您使用了 IstioOperator CR 来安装 Istio,请添加以下字段到您的配置:

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. meshConfig:
  5. defaultProviders:
  6. tracing:
  7. - "opencensus"
  8. enableTracing: true
  9. extensionProviders:
  10. - name: "opencensus"
  11. opencensus:
  12. service: "opentelemetry-collector.istio-system.svc.cluster.local"
  13. port: 55678
  14. context:
  15. - W3C_TRACE_CONTEXT

采用此配置时,OpenCensus Agent 作为默认的跟踪器来安装 Istio。链路数据将被发送到 OpenTelemetry 后端。

默认情况下,Istio 的 OpenCensus Agent 跟踪将尝试读写 4 种链路头:

  • B3
  • gRPC 的二进制链路头
  • W3C Trace Context
  • 和云链路上下文(Cloud Trace Context)。

如果您提供多个值,代理将尝试以指定的顺序读取链路头,使用第一个成功解析的头并写入所有头。 这允许使用不同头的服务之间具有互操作性,例如在同一个链路中,一个服务传播 B3 头, 一个服务传播 W3C Trace Context 头。 在本例中,我们仅使用 W3C Trace Context。

在默认的配置文件中,采样率为 1%。 使用 Telemetry API 将其提高到 100%:

  1. $ kubectl apply -f - <<EOF
  2. apiVersion: telemetry.istio.io/v1alpha1
  3. kind: Telemetry
  4. metadata:
  5. name: mesh-default
  6. namespace: istio-system
  7. spec:
  8. tracing:
  9. - randomSamplingPercentage: 100.00
  10. EOF

部署 OpenTelemetry Collector

OpenTelemetry Collector 支持默认将链路导出到核心分发中的几个后端。 其他后端可用于 OpenTelemetry Collector 的贡献分发中。

部署并配置 Collector 以接收和导出 span 到 Jaeger 实例:

  1. $ kubectl apply -f - <<EOF
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: opentelemetry-collector
  6. namespace: istio-system
  7. labels:
  8. app: opentelemetry-collector
  9. data:
  10. config: |
  11. receivers:
  12. opencensus:
  13. endpoint: 0.0.0.0:55678
  14. processors:
  15. memory_limiter:
  16. limit_mib: 100
  17. spike_limit_mib: 10
  18. check_interval: 5s
  19. exporters:
  20. zipkin:
  21. # Export via zipkin for easy querying
  22. endpoint: http://zipkin.istio-system.svc:9411/api/v2/spans
  23. logging:
  24. loglevel: debug
  25. extensions:
  26. health_check:
  27. port: 13133
  28. service:
  29. extensions:
  30. - health_check
  31. pipelines:
  32. traces:
  33. receivers:
  34. - opencensus
  35. processors:
  36. - memory_limiter
  37. exporters:
  38. - zipkin
  39. - logging
  40. ---
  41. apiVersion: v1
  42. kind: Service
  43. metadata:
  44. name: opentelemetry-collector
  45. namespace: istio-system
  46. labels:
  47. app: opentelemetry-collector
  48. spec:
  49. type: ClusterIP
  50. selector:
  51. app: opentelemetry-collector
  52. ports:
  53. - name: grpc-opencensus
  54. port: 55678
  55. protocol: TCP
  56. targetPort: 55678
  57. ---
  58. apiVersion: apps/v1
  59. kind: Deployment
  60. metadata:
  61. name: opentelemetry-collector
  62. namespace: istio-system
  63. labels:
  64. app: opentelemetry-collector
  65. spec:
  66. replicas: 1
  67. selector:
  68. matchLabels:
  69. app: opentelemetry-collector
  70. template:
  71. metadata:
  72. labels:
  73. app: opentelemetry-collector
  74. spec:
  75. containers:
  76. - name: opentelemetry-collector
  77. image: "otel/opentelemetry-collector:0.49.0"
  78. imagePullPolicy: IfNotPresent
  79. command:
  80. - "/otelcol"
  81. - "--config=/conf/config.yaml"
  82. ports:
  83. - name: grpc-opencensus
  84. containerPort: 55678
  85. protocol: TCP
  86. volumeMounts:
  87. - name: opentelemetry-collector-config
  88. mountPath: /conf
  89. readinessProbe:
  90. httpGet:
  91. path: /
  92. port: 13133
  93. resources:
  94. requests:
  95. cpu: 40m
  96. memory: 100Mi
  97. volumes:
  98. - name: opentelemetry-collector-config
  99. configMap:
  100. name: opentelemetry-collector
  101. items:
  102. - key: config
  103. path: config.yaml
  104. EOF

访问仪表板

远程访问遥测插件详细说明了如何配置通过 Gateway 访问 Istio 插件。

对于测试(和临时访问),您也可以使用端口转发。 使用以下命令,假设您已将 Jaeger 部署到 istio-system 命名空间:

  1. $ istioctl dashboard jaeger

使用 Bookinfo 样例生成链路

  1. 当 Bookinfo 应用启动且运行时,访问一次或多次 http://$GATEWAY_URL/productpage 以生成链路信息。

    要查看追踪数据,必须向服务发送请求。请求的数量取决于 Istio 的采样率。 采样率在安装 Istio 时设置,默认采样速率为 1%。在第一个跟踪可见之前,您需要发送至少 100 个请求。 使用以下命令向 productpage 服务发送 100 个请求:

    1. $ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
  2. 从仪表板的左侧窗格中,从 Service 下拉列表中选择 productpage.default 并点击 Find Traces

    Tracing Dashboard

    Tracing Dashboard

  3. 点击顶部最近的链路,查看与 /productpage 最近请求对应的详情:

    Detailed Trace View

    Detailed Trace View

  4. 链路由一组 span 组成,每个 span 对应在执行 /productpage 期间调用的一个 Bookinfo 服务, 或对应 istio-ingressgateway 这种内部 Istio 组件。

由于您还在 OpenTelemetry Collector 中配置了日志记录导出器,因此您也可以在日志中看到链路:

  1. $ kubectl -n istio-system logs deploy/opentelemetry-collector

清理

  1. 使用 Ctrl-C 或以下命令移除可能仍在运行的所有 istioctl 进程:

    1. $ killall istioctl
  2. 如果您未计划探索后续的任务,请参阅 Bookinfo 清理指示说明, 以关闭该应用。

  3. 移除 Jaeger 插件:

    1. $ kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.19/samples/addons/jaeger.yaml
  4. 移除 OpenTelemetry Collector:

    1. $ kubectl delete -n istio-system cm opentelemetry-collector
    2. $ kubectl delete -n istio-system svc opentelemetry-collector
    3. $ kubectl delete -n istio-system deploy opentelemetry-collector
  5. 在您的 Istio 安装配置中移除 meshConfig.extensionProvidersmeshConfig.defaultProviders 设置,或将其设置为 ""

  6. 移除遥测资源:

    1. $ kubectl delete telemetries.telemetry.istio.io -n istio-system mesh-default