Telemetry API

该特性正在积极 研发中,目前尚处于 experimental 阶段。

Istio 提供 Telemetry API, 能够灵活地配置指标访问日志追踪

使用 API

作用域、继承和覆盖

在 Istio 配置层次结构中,Telemetry API 资源从父级资源中继承配置:

  1. 根配置命名空间(例如 istio-system
  2. 本地命名空间(不带工作负载 selector 的作用于命名空间的资源)
  3. 工作负载(带有工作负载 selector 的作用于命名空间的资源)

istio-system 这类根配置命名空间中的 Telemetry API 资源提供了网格范围的默认行为。 根配置命名空间中的所有工作负载特定选择算符都将被忽略/拒绝。 在根配置命名空间中定义多个网格范围的 Telemetry API 资源是无效的。

通过将新的 Telemetry 资源应用到(不带工作负载选择算符的)目标命名空间中, 可以针对网格范围的配置达成特定于命名空间的覆盖。命名空间配置中指定的所有字段都将完全覆盖 (根配置命名空间中的)父级配置中的字段。

使用工作负载选择算符 将新的 Telemetry 资源应用到目标命名空间中,可以实现特定于工作负载的覆盖。

工作负载选择

命名空间内的单个工作负载通过 selector 进行选择,这允许基于标签选择工作负载。

使用 selector 让两个不同的 Telemetry 资源选择相同的工作负载是无效的。 同样在未指定 selector 时在一个命名空间中设定两个不同的 Telemetry 资源也是无效的。

提供程序选择

Telemetry API 使用提供程序的概念表明要使用的集成协议或类型。 可以在 MeshConfig 中配置提供程序。

MeshConfig 中的提供程序配置示例设置如下:

  1. data:
  2. mesh: |-
  3. extensionProviders: # The following content defines two example tracing providers.
  4. - name: "localtrace"
  5. zipkin:
  6. service: "zipkin.istio-system.svc.cluster.local"
  7. port: 9411
  8. maxTagLength: 56
  9. - name: "cloudtrace"
  10. stackdriver:
  11. maxTagLength: 256

为了方便,Istio 默认设置随附了几个开箱即用的提供程序:

提供程序名称功能
prometheus指标
stackdriver指标、追踪、访问日志
envoy访问日志

此外,还可以设置默认的提供程序, 便于在 Telemetry 资源未指定提供程序时将使用这个默认的提供程序。

如果您正使用 Sidecar 配置, 不要忘记添加提供程序的服务。

提供程序不支持 $(HOST_IP)。如果您正以代理(agent)模式运行收集器, 您可以使用服务内部流量策略, 并将 InternalTrafficPolicy 设置为 Local 以获得更好的性能。

示例

配置网格范围的行为

Telemetry API 资源从网格的根配置命名空间(通常是 istio-system)中进行继承。 要配置网格范围的行为,可以在根配置命名空间中添加新的(或编辑现有的)Telemetry 资源。

以下是上一节中使用提供程序配置的示例配置:

  1. apiVersion: telemetry.istio.io/v1alpha1
  2. kind: Telemetry
  3. metadata:
  4. name: mesh-default
  5. namespace: istio-system
  6. spec:
  7. tracing:
  8. - providers:
  9. - name: localtrace
  10. customTags:
  11. foo:
  12. literal:
  13. value: bar
  14. randomSamplingPercentage: 100

此配置覆盖源于 MeshConfig 的默认提供程序,将网格默认设置为 localtrace 提供程序。 它还将网格范围的抽样百分比设置为 100,配置一个标记以名称 foo 和赋值 bar 添加到所有链路 span。

配置作用于命名空间的追踪行为

要定制个别命名空间的行为,添加 Telemetry 资源到目标命名空间。 命名空间资源中指定的所有字段将完全覆盖从配置层次结构中继承的字段配置。 例如:

  1. apiVersion: telemetry.istio.io/v1alpha1
  2. kind: Telemetry
  3. metadata:
  4. name: namespace-override
  5. namespace: myapp
  6. spec:
  7. tracing:
  8. - customTags:
  9. userId:
  10. header:
  11. name: userId
  12. defaultValue: unknown

当用先前网格范围的示例配置部署到网格中时,这将造成 myapp 命名空间中的追踪行为, 将链路 span 发送到 localtrace 提供程序并随机以 100% 的比率选择追踪请求, 但这会使用名称 userIduserId 请求头中获取的值为每个 span 设置自定义标记。 重要的是,在 myapp 命名空间中将不会使用来自父级配置的 foo: bar 标记。 自定义标记行为将完全覆盖 mesh-default.istio-system 资源中配置的行为。

Telemetry 资源中的所有配置将完全覆盖配置层次结构中其父级资源的配置。这包括提供程序选择。

配置特定于工作负载的行为

要定制个别工作负载的行为,添加 Telemetry 资源到目标命名空间并使用 selector。 特定工作负载资源中指定的所有字段将完全覆盖从配置层次结构中继承的字段配置。

例如:

  1. apiVersion: telemetry.istio.io/v1alpha1
  2. kind: Telemetry
  3. metadata:
  4. name: workload-override
  5. namespace: myapp
  6. spec:
  7. selector:
  8. matchLabels:
  9. service.istio.io/canonical-name: frontend
  10. tracing:
  11. - disableSpanReporting: true

这种情况下,对于 myapp 命名空间中的 frontend 工作负载,追踪将被禁用。 Istio 仍将转发追踪头,但没有 span 将被报告给配置的追踪提供程序。

让带有工作负载选择算符的两个 Telemetry 资源选择相同的工作负载是无效的。 这种情况下,此行为属于未定义的状态。