请求代理日志

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 访问日志记录:

  1. 运行以下命令以添加 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-managedasm-managed-stableasm-managed-rapid)。

  2. 运行以下命令以查看 configmap:

     kubectl get configmap istio-release-channel -n istio-system -o yaml
    
  3. 如需验证访问日志记录是否已启用,请确保 mesh: 部分中显示 accessLogFile: /dev/stdout 行。

    ...
    apiVersion: v1
    data:
      mesh: |
        ....
        accessLogFile: /dev/stdout
    ...
    

流量日志

流量日志默认处于启用状态。

集群内

Envoy 访问日志

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    accessLogFile: "/dev/stdout"

如需了解详情,请参阅启用 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 访问日志,请执行以下操作:

  1. 导航到日志浏览器:

    前往日志浏览器

  2. 选择相应的 Google Cloud 项目。

  3. 请运行以下查询:

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"

流量日志

如需在日志浏览器中查看流量日志,请执行以下操作:

  1. 导航到日志浏览器:

    前往日志浏览器

  2. 选择相应的 Google Cloud 项目。

  3. 根据您正在查看客户端还是服务器访问日志,运行以下查询:

    服务器日志

    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 页面中查看某服务在指定时间范围内的流量日志,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Cloud Service Mesh 页面。

    前往 Cloud Service Mesh 页面

  2. 服务下,选择要检查的服务的名称。

  3. 转到指标页面。

  4. 时间范围下拉菜单中指定一个时间范围,或使用时间轴设置自定义范围

  5. 选择过滤条件选项下,点击查看流量日志

流量日志命名为 server-accesslog-stackdriver,并且会附加到您的服务当前使用的相应受监控的资源(k8s_containergce_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,有助于深入了解控制层面状态,例如连接到每个控制层面实例的代理数量、配置事件、推送和验证。

请按照以下步骤观察控制层面或排查控制层面问题。

  1. 加载示例信息中心:

    git clone https://github.com/GoogleCloudPlatform/monitoring-dashboard-samples && cd monitoring-dashboard-samples/dashboards && git checkout servicemesh
  2. 安装 Cloud Service Mesh 信息中心:

    gcloud monitoring dashboards create --config-from-file=dashboards/servicemesh/anthos-service-mesh-control-plane-monitoring.json
  3. 在列表中查找名为 Istio Control Plane Dashboard 的信息中心。 如需了解详情,请参阅查看已安装的信息中心

如需查看可用指标的完整列表,请参阅导出的指标

诊断配置延迟问题

托管式 Cloud Service Mesh

使用托管式 Cloud Service Mesh 控制平面的 Cloud Service Mesh 不支持诊断配置延迟。

受管理的 istiod

使用托管式 istiod 控制平面的 Cloud Service Mesh 不支持诊断配置延迟。

集群内

以下步骤说明了如何使用 pilot_proxy_convergence_time 指标来诊断配置更改和所有代理汇聚之间的延迟问题。

  1. 在 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
  2. 访问 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 秒的所有请求。
  • 创建基于日志的指标。
  • 排查 404503 错误

排查 404503 错误

以下示例说明了如何在请求失败并返回 404503 响应代码时使用此日志排查问题。

  1. 在客户端访问日志中,搜索如下所示的条目:

    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"
    }
  2. 导航到访问日志条目中的标签。查找 response_flag 字段,如下所示:

    response_flag: "NR"

    NR 值是 NoRoute 的首字母缩写词,这意味着未找到目标位置的路由,或没有与下游连接匹配的过滤条件链。同样,您也可以使用 response_flag 标签来排查 503 错误。

  3. 如果您在客户端和服务器访问日志中看到 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 设置访问日志政策,请执行以下操作:

  1. 创建一个 IstioOperator 自定义叠加文件,其中包含适用于您的场景的 AccessLogPolicyConfig 值。

  2. 使用 --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 代理套接字的状态。

  1. 显示已建立的套接字列表,其中包含 TIME_WAIT 状态的套接字,如果其数量较高,可能会对可扩缩性产生负面影响:

    kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -anopim
  2. 显示套接字统计信息摘要:

    kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -s

如需了解详情,请参阅 ss 命令简介

istio-proxyistio-init 日志

此外,请检索 istio-proxy 日志并查看其内容,以发现可能表明问题原因的任何错误:

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy

您可以对 init 容器执行相同的操作:

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-init

后续步骤