使用 Envoy 实现可观测性
本文档演示了如何为 Envoy 代理生成跟踪记录和日志记录。此外还介绍了如何将信息导出到 Cloud Trace 和 Cloud Logging。
使用服务网格可以观察进出服务的流量,从而实现更丰富的监控和调试,而无需更改服务本身的代码。在 Cloud Service Mesh 使用的 Sidecar 代理架构中,代理是处理请求并提供必要遥测信息的组件。遥测信息必须 收集并存储在一个集中位置以供进一步使用, 分析、提醒和问题排查。
演示设置
本文档使用以下配置来演示跟踪记录和日志记录:
- 侦听 HTTP 端口并返回处理请求的虚拟机实例的主机名的单个应用。在图示中,此应用位于右上角,标记为 HTTP 服务 (10.10.10.10:80)。一个或多个虚拟机可以提供此服务。
- 运行此服务使用方的单个 Compute Engine 虚拟机。在图示中,标记为 Demo Compute Engine 虚拟机。
- 由 Cloud Service Mesh 安装并配置的 Envoy Sidecar 代理。在图示中,标记为 Envoy。
- 左侧框中所示的服务使用方应用是在
10.10.10.10:80
上运行的 HTTP 服务的使用方。
以下步骤对应于图中带编号的标签:
Cloud Service Mesh 配置 Envoy 代理以执行以下操作:
10.10.10.10:80
服务的负载平衡流量。- 存储针对此服务发出的每个请求的访问日志信息。
- 生成该服务的跟踪记录信息。
在使用方向
10.10.10.10
发送请求后,Sidecar 代理会将该请求路由到正确的目的地。Sidecar 代理还会生成必要的遥测信息:
- 在本地磁盘上的访问日志中添加一个条目,其中包含有关该请求的其他信息。
- 生成跟踪条目,并使用 OpenCensus Envoy 跟踪记录将其发送到 Trace。
Logging 记录代理会将这些数据导出到 Cloud Logging API,以便数据可以在 Cloud Logging 界面中使用。
前提条件
在完成设置步骤之前,请确保完成以下操作:
- 已启用 Traffic Director API 并满足其他前提条件,如 准备设置虚拟机和无代理工作负载。
- 已启用 Cloud Trace API。
- 该 Compute Engine 虚拟机所用的服务账号配置了以下 Identity and Access Management (IAM) 角色:
- Cloud Trace Agent 角色 (
roles/cloudtrace.agent
) - Logs Writer 角色 (
roles/logging.logWriter
)
- Cloud Trace Agent 角色 (
- 借助防火墙规则,流量可以到达您在此设置过程中配置的虚拟机。
设置演示服务和 Cloud Service Mesh
本文档使用多个 shell 脚本来执行配置演示服务所需的步骤。查看脚本以了解它们执行的具体步骤。
启动 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 的虚拟机模板,以及一个使用此模板的代管式实例组。该脚本会在未启用自动扩缩的情况下启动单个实例。使用 Cloud Service Mesh 为
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
脚本会配置必要的 Cloud Service Mesh 代管式服务的参数。启动运行 HTTP 服务使用方的 Compute Engine 虚拟机,并在虚拟机上安装和配置 Sidecar 代理。在以下命令中,将
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 代理已预配置为使用 Cloud Service Mesh。
以下其他配置设置可启用跟踪记录和日志记录:
TRAFFICDIRECTOR_ACCESS_LOG_PATH
和TRAFFICDIRECTOR_ENABLE_TRACING
引导节点元数据变量会启用日志记录和跟踪功能,如 为 Cloud Service Mesh 配置 Envoy 引导属性。- 静态引导配置允许使用 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 代理分发的解析器。但是,使用此选项时,过滤和处理原始文本日志条目会更加困难。
下载并安装 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
重启代理;更改将在代理启动后生效:
sudo service google-fluentd restart
将 Envoy 日志导出为结构化文本
从 GitHub 安装 Envoy 访问日志解析器:
sudo /opt/google-fluentd/embedded/bin/gem install fluent-plugin-envoy-parser
下载并安装用于以结构化格式导出 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
重启代理;更改将在代理启动后生效:
sudo service google-fluentd restart
如需了解详情,请参阅配置 Logging 代理。
验证配置
- 从 Sidecar 代理虚拟机生成对演示服务的请求。
此操作会创建新的本地日志记录。举例来说,您可以运行
curl 10.10.10.10
。 - 在 Google Cloud 控制台中,转到 Logging > 日志浏览器。在下拉菜单中,选择 envoy-access 日志类型。您会看到非结构化或结构化格式的最新请求的日志条目,具体取决于您之前选择的配置类型。
问题排查
请阅读以下部分,了解如何针对不同的 Envoy 可观测性问题
配置多个项目的跟踪记录
如果您希望跨多个项目部署的 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"]
如果配置已完成,但看不到跟踪记录或日志条目 请验证以下内容:
- Compute Engine 虚拟机的服务账号具有必要的 Trace 和 Logging IAM 权限(如前提条件中指定的)。如需了解 Trace IAM 权限,请参阅访问权限控制。如需了解 Logging 权限,请参阅访问权限控制。
- 对于日志记录:请确保
/var/log/google-fluentd/google-fluentd.log
中没有错误。 - 对于日志记录:请确保在发出请求时新的条目会显示在本地访问日志文件中。
后续步骤
- 如需查找相关信息,请参阅使用无代理 gRPC 应用实现可观测性。
- 如需查找常规 Cloud Service Mesh 问题排查信息,请参阅排查使用 Envoy 的部署的问题。