Telemetry API

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 中的提供程序配置示例设置如下:

data:
  mesh: |-
      extensionProviders: # 以下内容定义了两个示例链路追踪提供程序。
      - name: "localtrace"
        zipkin:
          service: "zipkin.istio-system.svc.cluster.local"
          port: 9411
          maxTagLength: 56
      - name: "cloudtrace"
        stackdriver:
          maxTagLength: 256

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

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

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

示例

配置网格范围的行为

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

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

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: mesh-default
  namespace: istio-system
spec:
  tracing:
  - providers:
    - name: localtrace
    customTags:
      foo:
        literal:
          value: bar
    randomSamplingPercentage: 100

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

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

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

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: namespace-override
  namespace: myapp
spec:
  tracing:
  - customTags:
      userId:
        header:
          name: userId
          defaultValue: unknown

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

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

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

例如:

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: workload-override
  namespace: myapp
spec:
  selector:
    matchLabels:
      service.istio.io/canonical-name: frontend
  tracing:
  - disableSpanReporting: true

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

这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!