使用 Envoy 实现可观测性

本文档演示了如何为 Envoy 代理生成跟踪记录和日志记录。此外还介绍了如何将信息导出到 Cloud TraceCloud Logging

使用服务网格可以观察进出服务的流量,从而实现更丰富的监控和调试,而无需更改服务本身的代码。在 Traffic Director 使用的边车代理架构中,代理是处理请求并提供必要遥测信息的组件。遥测信息必须收集并存储在集中的位置以供进一步使用,例如数据分析、提醒和问题排查。

演示设置

本文档使用以下配置来演示跟踪记录和日志记录:

  • 侦听 HTTP 端口并返回处理请求的虚拟机实例的主机名的单个应用。在图示中,此应用位于右上角,标记为 HTTP 服务 (10.10.10.10:80)。一个或多个虚拟机可以提供此服务。
  • 运行此服务使用方的单个 Compute Engine 虚拟机。在图示中,标记为 Demo Compute Engine 虚拟机
  • 由 Traffic Director 安装并配置的 Envoy 边车代理。在图示中,标记为 envoy
  • 左侧框中所示的服务使用方应用是在 10.10.10.10:80 上运行的 HTTP 服务的使用方。
Envoy 的日志记录和监控功能的演示应用。
用于对 Envoy 进行日志记录和监控的演示应用(点击可放大)

以下步骤对应于图中带编号的标签:

  1. Traffic Director 配置 Envoy 代理以执行以下操作:

    • 10.10.10.10:80 服务的负载平衡流量。
    • 存储针对此服务发出的每个请求的访问日志信息。
    • 生成该服务的跟踪记录信息。
  2. 在使用方向 10.10.10.10 发送请求后,边车代理会将该请求路由到正确的目的地。

  3. 边车代理还会生成必要的遥测信息:

    1. 在本地磁盘上的访问日志中添加一个条目,其中包含有关该请求的其他信息。
    2. 生成跟踪条目,并使用 OpenCensus Envoy 跟踪记录将其发送到 Trace。
  4. Logging 记录代理会将这些数据导出到 Cloud Logging API,以便数据可以在 Cloud Logging 界面中使用。

前提条件

在完成设置步骤之前,请确保完成以下操作:

  1. 已启用 Traffic Director API 并满足其他前提条件,如准备使用 Envoy 设置 Traffic Director 中所述。
  2. 已启用 Cloud Trace API。
  3. 该 Compute Engine 虚拟机所用的服务账号配置了以下 Identity and Access Management (IAM) 角色:
  4. 借助防火墙规则,流量可以到达您在此设置过程中配置的虚拟机。

设置演示服务和 Traffic Director

本文档使用多个 shell 脚本来执行配置演示服务所需的步骤。查看脚本以了解它们执行的具体步骤。

  1. 启动 Compute Engine 虚拟机并在虚拟机上配置 HTTP 服务:

    curl -sSO https://storage.googleapis.com/traffic-director/demo/observability/setup_demo_service.sh
    chmod 755 setup_demo_service.sh && ./setup_demo_service.sh
    

    setup_demo_service.sh 脚本会创建一个在虚拟机启动时启动 apache2 的虚拟机模板,以及一个使用此模板的代管式实例组。该脚本会在未启用自动扩缩的情况下启动单个实例。

  2. 使用 Traffic Director 为 10.10.10.10 服务配置路由:

    curl -sSO https://storage.googleapis.com/traffic-director/demo/observability/setup_demo_trafficdirector.sh
    chmod 755 setup_demo_trafficdirector.sh && ./setup_demo_trafficdirector.sh
    

    setup_demo_trafficdirector.sh 脚本会为 Traffic Director 托管式服务配置必要的参数,类似于使用手动 Envoy 部署为 Compute Engine 虚拟机设置 Traffic Director 中所述的配置。

  3. 启动运行 HTTP 服务使用方的 Compute Engine 虚拟机,并在虚拟机上安装和配置边车代理。在以下命令中,将 PROJECT_ID 替换为应将 Trace 信息发送到的项目 ID。这通常是虚拟机所属的 Google Cloud 项目。

    curl -sSO https://storage.googleapis.com/traffic-director/demo/observability/setup_demo_client.sh
    chmod 755 setup_demo_client.sh && ./setup_demo_client.sh PROJECT_ID
    

    setup_demo_client.sh 脚本会创建一个 Compute Engine 虚拟机,该虚拟机有一个 Envoy 代理已预先配置为使用 Traffic Director。这类似于使用手动 Envoy 部署为 Compute Engine 虚拟机设置 Traffic Director 中描述的配置。

以下其他配置设置可启用跟踪记录和日志记录:

  • 为 Traffic Director 配置 Envoy 引导属性中所述,TRAFFICDIRECTOR_ACCESS_LOG_PATHTRAFFICDIRECTOR_ENABLE_TRACING 引导节点元数据变量支持日志记录和跟踪记录。
  • 静态引导配置允许使用 OpenCensus 将跟踪信息导出到 Trace。

运行这些脚本后,您可以登录 td-observability-demo-client 虚拟机并访问 10.10.10.10 上可用的 HTTP 服务:

curl http://10.10.10.10

此时,Envoy 会生成访问日志记录和跟踪记录信息。以下部分介绍了如何导出日志和跟踪记录信息。

设置到 Cloud Trace 的跟踪记录导出

您在运行 setup-demo-client.sh 脚本时创建的 Envoy 引导配置足以生成跟踪记录信息。 所有其他配置都是可选的。如果要配置其他参数,请参阅 OpenCensus Envoy 配置页面并修改 Envoy 引导配置中的跟踪记录选项。

向演示服务器 (curl 10.10.10.10) 发出示例请求后,在 Google Cloud Console 中,转到 Trace 界面(Trace > Trace 列表)。您会看到一条与您发出的请求对应的跟踪记录。

如需详细了解如何使用 Trace,请参阅 Cloud Trace 文档

设置到 Logging 的访问日志导出

在此阶段,Envoy 应该将访问日志信息记录到运行虚拟机的本地磁盘。要将这些记录导出到 Logging,您必须在本地安装 Logging 代理。这需要安装和配置 Logging 代理。

安装 Logging 代理。

在导出日志记录信息的虚拟机上安装 Logging 代理。对于此示例配置,虚拟机为 td-observability-demo-vm

curl -sSO https://dl.google.com/cloudagents/add-logging-agent-repo.sh
sudo bash add-logging-agent-repo.sh --also-install

如需了解详情,请参阅将 Cloud Logging 代理安装在单个虚拟机上

配置 Logging 代理

您可以将 Envoy 日志导出为非结构化文本或结构化文本。

将 Envoy 日志导出为非结构化文本

此选项会将访问权限日志中的日志记录作为原始文本导出到 Cloud Logging。访问日志中的每个条目都会作为单个条目导出到 Logging。此配置更易于安装,因为它依赖于使用当前版本的 Logging 代理分发的解析器。但是,使用此选项时,过滤和处理原始文本日志条目会更加困难。

  1. 下载并安装 Envoy 访问日志非结构化导出配置文件。

    curl -sSO https://storage.googleapis.com/traffic-director/demo/observability/envoy_access_fluentd_unstructured.conf
    sudo cp envoy_access_fluentd_unstructured.conf /etc/google-fluentd/config.d/envoy_access.conf
    
  2. 重启代理;更改将在代理启动后生效:

    sudo service google-fluentd restart
    

将 Envoy 日志导出为结构化文本

  1. 从 GitHub 安装 Envoy 访问日志解析器

    sudo /opt/google-fluentd/embedded/bin/gem install fluent-plugin-envoy-parser
    
  2. 下载并安装用于以结构化格式导出 Envoy 访问日志的配置文件:

    curl -sSO https://storage.googleapis.com/traffic-director/demo/observability/envoy_access_fluentd_structured.conf
    sudo cp envoy_access_fluentd_structured.conf /etc/google-fluentd/config.d/envoy_access.conf
    
  3. 重启代理;更改将在代理启动后生效:

    sudo service google-fluentd restart
    

如需了解详情,请参阅配置 Logging 代理

验证配置

  1. 从边车代理虚拟机生成对演示服务的请求。 此操作会创建新的本地日志记录。举例来说,您可以运行 curl 10.10.10.10
  2. 在 Google Cloud 控制台中,转到 Logging > 日志浏览器。在下拉菜单中,选择 envoy-access 日志类型。您会看到非结构化或结构化格式的最新请求的日志条目,具体取决于您之前选择的配置类型。

问题排查

配置多个项目的跟踪记录

如果您希望跨多个项目部署的 Envoy 跟踪请求,请注意以下事项:

  • 必须使用运行 Envoy 的项目的凭据配置每个 Envoy。
  • 每个 Envoy 都会将跟踪记录数据发送到与其用于运行的凭据相对应的项目。
  • 如果您的应用在发出请求时保留 X-Cloud-Trace-Context HTTP 标头的值,则您可以查看跨项目请求的跟踪记录 span。

Trace 与无代理 gRPC 应用的兼容性

Envoy 的 OpenCensus 跟踪器配置可以使从无代理 gRPC 应用和 Envoy 代理导出的跟踪记录在服务网格中完全兼容。为了确保兼容性,Envoy 引导必须将跟踪记录上下文配置为在 OpenCensusConfig 中包含 GRPC_TRACE_BIN 跟踪记录格式,如下所示:

tracing:
  http:
      name: envoy.tracers.opencensus
      typed_config:
        "@type": type.googleapis.com/envoy.config.trace.v2.OpenCensusConfig
        stackdriver_exporter_enabled: "true"
        stackdriver_project_id: "PROJECT_ID"
        incoming_trace_context: ["CLOUD_TRACE_CONTEXT", "GRPC_TRACE_BIN"]
        outgoing_trace_context: ["CLOUD_TRACE_CONTEXT", "GRPC_TRACE_BIN"]

如果配置已完成,但您没有看到可用的跟踪条目或日志记录条目,请验证以下内容:

  1. Compute Engine 虚拟机的服务账号具有必要的 Trace 和 Logging IAM 权限(如前提条件中指定的)。如需了解 Trace IAM 权限,请参阅访问权限控制。如需了解 Logging 权限,请参阅访问权限控制
  2. 对于日志记录:请确保 /var/log/google-fluentd/google-fluentd.log 中没有错误。
  3. 对于日志记录:请确保在发出请求时新的条目会显示在本地访问日志文件中。

后续步骤