请求代理日志
Cloud Service Mesh 支持 Cloud Logging 中的两种不同类型的访问日志:流量日志(也称为 Google Cloud Observability 访问日志)和 Envoy 访问日志。本页介绍了如何启用、停用、查看和解读这些日志。请注意,流量日志默认处于启用状态。
启用和停用访问日志
托管式 Cloud Service Mesh
Envoy 访问日志
运行以下命令以启用 Envoy 访问日志并停用流量日志:
cat <<EOF | kubectl apply -n istio-system -f -
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: enable-envoy-disable-sd
namespace: istio-system
spec:
accessLogging:
- providers:
- name: envoy
- providers:
- name: stackdriver
disabled: true
EOF
请注意,流量日志的提供商名称为 stackdriver
。
流量日志
默认情况下,流量日志处于启用状态,Envoy 访问日志处于停用状态。如果您之前启用了 Envoy 访问日志,并希望启用流量日志并停用 Envoy 访问日志,请运行以下命令:
cat <<EOF | kubectl apply -n istio-system -f -
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: disable-envoy-enable-sd
namespace: istio-system
spec:
accessLogging:
- providers:
- name: envoy
disabled: true
- providers:
- name: stackdriver
EOF
两者
如需同时启用 Envoy 访问日志和流量日志,请运行以下命令:
cat <<EOF | kubectl apply -n istio-system -f - apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: enable-envoy-and-sd-access-log namespace: istio-system spec: accessLogging: - providers: - name: envoy - name: stackdriver EOF
如需同时停用 Envoy 访问日志和流量日志,请运行以下命令:
cat <<EOF | kubectl apply -n istio-system -f - apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: disable-envoy-and-sd namespace: istio-system spec: accessLogging: - providers: - name: envoy disabled: true - providers: - name: stackdriver disabled: true EOF
受管理的 istiod
Envoy 访问日志
运行以下命令以启用 Envoy 访问日志记录:
运行以下命令以添加
accessLogFile: /dev/stdout
:cat <<EOF | kubectl apply -f - apiVersion: v1 data: mesh: |- accessLogFile: /dev/stdout kind: ConfigMap metadata: name: istio-release-channel namespace: istio-system EOF
其中,release-channel 是您的发布渠道(
asm-managed
、asm-managed-stable
或asm-managed-rapid
)。运行以下命令以查看 configmap:
kubectl get configmap istio-release-channel -n istio-system -o yaml
如需验证访问日志记录是否已启用,请确保
mesh:
部分中显示accessLogFile: /dev/stdout
行。... apiVersion: v1 data: mesh: | .... accessLogFile: /dev/stdout ...
流量日志
流量日志默认处于启用状态。
集群内
Envoy 访问日志
如需了解详情,请参阅启用 Envoy 的访问日志记录。
流量日志
流量日志默认启用,除非使用 Istio CA(以前称为 Citadel)在 Google Distributed Cloud 上安装 Cloud Service Mesh。
如需在安装集群内 Cloud Service Mesh 时使用 Istio CA 在 Google Distributed Cloud 上启用流量日志,请使用标志 --option stackdriver
。或者,您也可以在集群内 Cloud Service Mesh 安装后使用 Istio CA 在 Google Distributed Cloud 上启用流量日志。
查看访问日志
Envoy 访问日志
命令行
如需在 istio-proxy 日志中查看 Envoy 访问日志,请运行以下命令:
kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy
日志浏览器
如需在 Logs Explorer 中查看 Envoy 访问日志,请执行以下操作:
导航到日志浏览器:
选择相应的 Google Cloud 项目。
请运行以下查询:
resource.type="k8s_container" \
resource.labels.container_name="istio-proxy"
resource.labels.cluster_name="CLUSTER_NAME" \
resource.labels.namespace_name="NAMESPACE_NAME" \
resource.labels.pod_name="POD_NAME"
流量日志
如需在日志浏览器中查看流量日志,请执行以下操作:
导航到日志浏览器:
选择相应的 Google Cloud 项目。
根据您正在查看客户端还是服务器访问日志,运行以下查询:
服务器日志
resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/server-accesslog-stackdriver"
客户端日志
resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/client-accesslog-stackdriver"
如需在 Cloud Service Mesh 页面中查看某服务在指定时间范围内的流量日志,请按照以下步骤操作:
在 Google Cloud 控制台中,前往 Cloud Service Mesh 页面。
在服务下,选择要检查的服务的名称。
转到指标页面。
从时间范围下拉菜单中指定一个时间范围,或使用时间轴设置自定义范围。
在 filter_list 选择过滤条件选项下,点击查看流量日志。
流量日志命名为 server-accesslog-stackdriver,并且会附加到您的服务当前使用的相应受监控的资源(k8s_container 或 gce_instance)。流量日志包含以下信息:
HTTP 请求属性,例如 ID、网址、大小、延迟时间和常见标头。
源和目标工作负载信息,例如名称、命名空间、身份和常见标签。
如果启用了跟踪功能,请跟踪信息,例如采样、跟踪记录 ID 和 span ID。
日志条目示例如下所示:
{ insertId: "1awb4hug5pos2qi" httpRequest: { requestMethod: "GET" requestUrl: "YOUR-INGRESS/productpage" requestSize: "952" status: 200 responseSize: "5875" remoteIp: "10.8.0.44:0" serverIp: "10.56.4.25:9080" latency: "1.587232023s" protocol: "http" } resource: { type: "k8s_container" labels: { location: "us-central1-a" project_id: "YOUR-PROJECT" pod_name: "productpage-v1-76589d9fdc-ptnt9" cluster_name: "YOUR-CLUSTER-NAME" container_name: "productpage" namespace_name: "default" } } timestamp: "2020-04-28T19:55:21.056759Z" severity: "INFO" labels: { destination_principal: "spiffe://cluster.local/ns/default/sa/bookinfo-productpage" response_flag: "-" destination_service_host: "productpage.default.svc.cluster.local" source_app: "istio-ingressgateway" service_authentication_policy: "MUTUAL_TLS" source_name: "istio-ingressgateway-5ff85d8dd8-mwplb" mesh_uid: "YOUR-MESH-UID" request_id: "021ce752-9001-4ac6-b6d6-3b15f5d3632" destination_namespace: "default" source_principal: "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account" destination_workload: "productpage-v1" destination_version: "v1" source_namespace: "istio-system" source_workload: "istio-ingressgateway" destination_name: "productpage-v1-76589d9fdc-ptnt9" destination_app: "productpage" } trace: "projects/YOUR-PROJECT/traces/d4197f59b7a43e3aeff3571bac99d536" receiveTimestamp: "2020-04-29T03:07:14.362416217Z" spanId: "43226343ca2bb2b1" traceSampled: true logName: "projects/YOUR-PROJECT/logs/server-accesslog-stackdriver" receiveTimestamp: "2020-04-28T19:55:32.185229100Z" }
解读 Cloud Service Mesh 遥测数据
以下部分介绍了如何查看网格的状态,并查看包含有用信息的各种遥测数据,以便进行问题排查。
解读控制层面指标
托管式 Cloud Service Mesh
采用托管式 Cloud Service Mesh 控制平面的 Cloud Service Mesh 不支持控制平面指标。
受管理的 istiod
采用托管式 istiod
控制平面的 Cloud Service Mesh 不支持本部分中的控制平面指标检查。
集群内
安装具有集群内控制平面的 Cloud Service Mesh 时,默认情况下 istiod
会将指标导出到 Google Cloud Observability 以进行监控。istiod
会在这些指标前面加上 istio.io/control
,有助于深入了解控制层面状态,例如连接到每个控制层面实例的代理数量、配置事件、推送和验证。
请按照以下步骤观察控制层面或排查控制层面问题。
加载示例信息中心:
git clone https://github.com/GoogleCloudPlatform/monitoring-dashboard-samples && cd monitoring-dashboard-samples/dashboards && git checkout servicemesh
安装 Cloud Service Mesh 信息中心:
gcloud monitoring dashboards create --config-from-file=dashboards/servicemesh/anthos-service-mesh-control-plane-monitoring.json
在列表中查找名为
Istio Control Plane Dashboard
的信息中心。 如需了解详情,请参阅查看已安装的信息中心。
如需查看可用指标的完整列表,请参阅导出的指标。
诊断配置延迟问题
托管式 Cloud Service Mesh
使用托管式 Cloud Service Mesh 控制平面的 Cloud Service Mesh 不支持诊断配置延迟。
受管理的 istiod
使用托管式 istiod 控制平面的 Cloud Service Mesh 不支持诊断配置延迟。
集群内
以下步骤说明了如何使用 pilot_proxy_convergence_time
指标来诊断配置更改和所有代理汇聚之间的延迟问题。
在 pod 中运行 shell 命令:
kubectl debug --image istio/base --target istio-proxy -it $(kubectl get pod -l app=pilot -o jsonpath='{.items[0].metadata.name}' -n istio-system) -n istio-system -- curl -s
访问
localhost:15014
,并通过grep
命令查找指标中的convergence
:curl http://localhost:15014/metrics | grep convergence
解读流量日志
以下信息说明了如何使用流量日志来排查连接问题。流量日志默认处于启用状态。
Cloud Service Mesh 会将数据导出到流量日志中,可帮助您调试以下类型的问题:
- 流量流和故障
- 端到端请求路由
对于在 Google Kubernetes Engine 上安装的 Cloud Service Mesh,默认会启用流量日志。您可以通过重新运行 asmcli install
来启用流量日志。使用与原始安装相同的选项,但不要选择停用 Stackdriver 的自定义叠加层。
流量日志有两种类型:
服务器访问日志提供请求的服务器端视图。这些日志位于
server-accesslog-stackdriver
下,并附加到k8s_container
受监控的资源。使用以下网址语法显示服务器端访问日志:https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver"&project=PROJECT_ID
客户端访问日志提供请求的客户端视图。这些日志位于
client-accesslog-stackdriver
下,并附加到k8s_pod
受监控的资源。使用以下网址语法显示客户端访问日志:https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/client-accesslog-stackdriver"&project=PROJECT_ID
访问日志包含以下信息:
- HTTP 请求属性,例如 ID、网址、大小、延迟时间和常见标头。
- 源和目标工作负载信息,例如名称、命名空间、身份和常见标签。
- 源和目标规范服务和修订版本信息。
- 如果启用了跟踪,则日志将包含采样、跟踪 ID 和 Span ID 等跟踪信息。
流量日志可能包含以下标签:
route_name
upstream_cluster
X-Envoy-Original-Path
以下是日志条目示例:
{ "insertId": "1j84zg8g68vb62z", "httpRequest": { "requestMethod": "GET", "requestUrl": "http://35.235.89.201:80/productpage", "requestSize": "795", "status": 200, "responseSize": "7005", "remoteIp": "10.168.0.26:0", "serverIp": "10.36.3.153:9080", "latency": "0.229384205s", "protocol": "http" }, "resource": { "type": "k8s_container", "labels": { "cluster_name": "istio-e2e22", "namespace_name": "istio-bookinfo-1-68819", "container_name": "productpage", "project_id": "***", "location": "us-west2-a", "pod_name": "productpage-v1-64794f5db4-8xbtf" } }, "timestamp": "2020-08-13T21:37:42.963881Z", "severity": "INFO", "labels": { "protocol": "http", "upstream_host": "127.0.0.1:9080", "source_canonical_service": "istio-ingressgateway", "source_namespace": "istio-system", "x-envoy-original-path": "", "source_canonical_revision": "latest", "connection_id": "32", "upstream_cluster": "inbound|9080|http|productpage.istio-bookinfo-1-68819.svc.cluster.local", "requested_server_name": "outbound_.9080_._.productpage.istio-bookinfo-1-68819.svc.cluster.local", "destination_version": "v1", "destination_workload": "productpage-v1", "source_workload": "istio-ingressgateway", "destination_canonical_revision": "v1", "mesh_uid": "cluster.local", "source_principal": "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account", "x-envoy-original-dst-host": "", "service_authentication_policy": "MUTUAL_TLS", "destination_principal": "spiffe://cluster.local/ns/istio-bookinfo-1-68819/sa/bookinfo-productpage", "response_flag": "-", "log_sampled": "false", "destination_service_host": "productpage.istio-bookinfo-1-68819.svc.cluster.local", "destination_name": "productpage-v1-64794f5db4-8xbtf", "destination_canonical_service": "productpage", "destination_namespace": "istio-bookinfo-1-68819", "source_name": "istio-ingressgateway-6845f6d664-lnfvp", "source_app": "istio-ingressgateway", "destination_app": "productpage", "request_id": "39013650-4e62-9be2-9d25-78682dd27ea4", "route_name": "default" }, "logName": "projects/***/logs/server-accesslog-stackdriver", "trace": "projects/***t/traces/466d77d15753cb4d7749ba5413b5f70f", "receiveTimestamp": "2020-08-13T21:37:48.758673203Z", "spanId": "633831cb1fda4fd5", "traceSampled": true }
您可以通过多种方式使用此日志:
- 与 Cloud Trace 集成,这是 Cloud Service Mesh 中的可选功能。
- 将流量日志导出到 BigQuery,您可以在其中运行查询,例如选择用时超过 5 秒的所有请求。
- 创建基于日志的指标。
- 排查
404
和503
错误
排查 404
和 503
错误
以下示例说明了如何在请求失败并返回 404
或 503
响应代码时使用此日志排查问题。
在客户端访问日志中,搜索如下所示的条目:
httpRequest: { requestMethod: "GET" requestUrl: "://IP_ADDRESS/src/Util/PHP/eval-stdin.php" requestSize: "2088" status: 404 responseSize: "75" remoteIp: "10.168.0.26:34165" serverIp: "10.36.3.149:8080" latency: "0.000371440s" protocol: "http" }
导航到访问日志条目中的标签。查找
response_flag
字段,如下所示:response_flag: "NR"
NR
值是NoRoute
的首字母缩写词,这意味着未找到目标位置的路由,或没有与下游连接匹配的过滤条件链。同样,您也可以使用response_flag
标签来排查503
错误。如果您在客户端和服务器访问日志中看到
503
错误,请检查为每个服务设置的端口名称是否与它们之间使用的协议名称匹配。例如,如果 golang 二进制客户端使用 HTTP 连接到 golang 服务器,但端口名为http2
,则协议将无法正确自动协商。
如需了解详情,请参阅响应标志。
解读 Envoy 访问日志
以下步骤说明了如何使用 Envoy 访问日志来显示连接两端之间的流量,以排查问题。
Envoy 访问日志对于诊断以下问题非常有用:
- 流量流和故障
- 端到端请求路由
默认情况下,Cloud Service Mesh 中未启用 Envoy 访问日志,您可以为网格中的集群启用访问日志。
您可以通过以下方法排查连接或请求失败问题:在您的应用中生成触发 HTTP 请求的活动,然后在来源日志或目标日志中检查关联的请求。
如果您触发请求,并且该请求出现在来源代理日志中,则说明 iptables
流量重定向正常并且 Envoy 代理正在处理流量。如果您在日志中看到错误,请生成 Envoy 配置转储文件,并检查 Envoy 集群配置以确保其正确无误。如果您看到请求,但日志没有错误,请改为检查目标代理日志。
如果请求出现在目标代理日志中,则说明网格本身工作正常。相反,如果您看到错误,请运行 Envoy 配置转储文件,并验证监听器配置中设置的流量端口的正确值。
如果在执行上述步骤后问题仍然存在,则说明 Envoy 可能无法自动协商 Sidecar 与其应用 Pod 之间的协议。请确保 Kubernetes 服务端口名称(例如 http-80
)与应用使用的协议匹配。
使用日志浏览器查询日志
您可以使用日志浏览器界面来查询特定的 Envoy 访问日志。例如,如需查询所有启用了 MULTUAL_TLS
并使用协议 grpc
的请求,请将以下代码附加到服务器访问日志查询:
labels.protocol="grpc" labels.service_authentication_policy="MULTUAL_TLS"
设置访问日志政策
托管式 Cloud Service Mesh
如需为采用托管式 Cloud Service Mesh 控制平面的 Cloud Service Mesh 配置访问日志,请参阅启用访问日志。
受管理的 istiod
如需为采用代管式 istiod 控制平面的 Cloud Service Mesh 配置访问日志,请参阅启用访问日志。
集群内
如需使用集群内控制平面为 Cloud Service Mesh 设置访问日志政策,请执行以下操作:
创建一个
IstioOperator
自定义叠加文件,其中包含适用于您的场景的AccessLogPolicyConfig
值。使用
--custom_overlay
选项将此文件传递给asmcli
以更新集群内控制层面配置。如需了解如何使用自定义叠加文件运行asmcli install
,请参阅使用可选功能安装。
查看特定于服务或工作负载的信息
如果您遇到特定服务或工作负载的问题,而不是网格相关的问题,请检查各个 Envoy 代理并收集相关信息。如需收集特定工作负载及其代理的相关信息,您可以使用 pilot-agent
:
kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- pilot-agent request GET SCOPE
在该示例中,SCOPE 是以下各项之一:
certs
- Envoy 实例中的证书clusters
- 配置了 Envoy 的集群config_dump
- 转储 Envoy 配置listeners
- 配置了 Envoy 的监听器logging
- 查看和更改日志记录设置stats
- Envoy 统计信息stats/prometheus
- 作为 Prometheus 记录的 Envoy 统计信息
查看代理套接字状态
您可以通过以下过程直接检查 Envoy 代理套接字的状态。
显示已建立的套接字列表,其中包含
TIME_WAIT
状态的套接字,如果其数量较高,可能会对可扩缩性产生负面影响:kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -anopim
显示套接字统计信息摘要:
kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -s
如需了解详情,请参阅 ss 命令简介。
istio-proxy
和 istio-init
日志
此外,请检索 istio-proxy
日志并查看其内容,以发现可能表明问题原因的任何错误:
kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy
您可以对 init
容器执行相同的操作:
kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-init
后续步骤
与 Cloud Trace 集成。Cloud Trace 是 Cloud Service Mesh 中的可选功能。