排查可观测性问题

本页面介绍如何排查 Google Cloud Console 中的 Anthos Service Mesh 页面的问题。

服务列表缺少特定服务

如果列表中缺少某项服务,请验证集群中是否存在 Kubernetes 服务配置

要获取所有 Kubernetes 服务的列表,请执行以下操作:

 kubectl get services --all-namespaces

要获取特定命名空间中的 Kubernetes 服务列表,请执行以下操作:

kubectl get services -n YOUR_NAMESPACE

服务缺少遥测数据或遥测数据不正确

默认情况下,安装 Anthos Service Mesh 时,将在 Google Cloud 项目中启用 Cloud Monitoring 和 Cloud Logging。如需报告遥测数据,注入到服务 pod 的每个边车代理都会调用 Cloud Monitoring API 和 Cloud Logging API。部署工作负载后,遥测数据大约需要一两分钟才会显示在 Google Cloud 控制台中。Anthos Service Mesh 自动使服务信息中心保持最新:

  • 对于指标,Sidecar 代理大约每分钟调用一次 Cloud Monitoring API。

  • 为了更新拓扑图,Sidecar 代理大约每分钟发送一次增量报告,大约每十分钟发送一次完整报告。

  • 对于日志记录,Sidecar 代理大约每十秒调用一次 Cloud Logging API。

  • 如需进行跟踪,您必须启用 Cloud Trace。跟踪将根据您配置的采样频率(通常每 100 个请求一个)进行报告。

在 Anthos Service Mesh 的“指标”页面上仅为 HTTP 服务显示指标。如果您没有看到任何指标,请检查以下各项:

验证是否已注入 Sidecar 代理

检查应用服务的命名空间中的所有 Pod 是否已注入 Sidecar 代理:

kubectl get pod -n YOUR_NAMESPACE --all

在上一个命令的以下示例输出中,注意 READY 列表示每个工作负载均有两个容器:主容器和边车代理的容器。

NAME                    READY   STATUS    RESTARTS   AGE
YOUR_WORKLOAD           2/2     Running   0          20s
...

如果您没有看到两个容器,请检查您的命名空间是否具有 istio-injection=enabled 标签,该标签表示已启用自动 Sidecar 注入:

  kubectl get ns --show-labels

输出示例:

NAME              STATUS   AGE   LABELS
default           Active   35m   istio-injection=enabled
istio-system      Active   34m   istio-injection=disabled,istio-operator-managed=Reconcile
  • 如果您没有看到 istio-injection=enabled 标签,请运行以下命令以启用自动 Sidecar 注入:

    kubectl label namespace YOUR_NAMESPACE istio-injection=enabled --overwrite
  • 如果您看到 istio-injection=enabled 标签并在包含工作负载的现有 Google Kubernetes Engine 集群上安装 Anthos Service Mesh,则您需要重启所有正在运行的 Pod,以使用 Anthos Service Mesh 注入或更新边车代理。如需了解详情,请参阅为现有 Pod 更新 Sidecar

验证 Kubernetes 服务端口名称

检查 Kubernetes 服务端口名称,以验证 Anthos Service Mesh 是否将服务视为 HTTP 服务。要包含在 Anthos Service Mesh 中,服务端口必须命名,并且名称必须包含端口的协议,例如:

apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http

服务端口名称可以包含以下语法的后缀:name: protocol[-suffix],其中方括号表示必须以短划线开头的可选后缀,例如:

kind: Service
metadata:
  name: myservice
spec:
  ports:
  - number: 3306
    name: mysql
  - number: 80
    name: http-web

如需在 Google Cloud 控制台中显示指标,必须使用以下协议之一为服务端口命名:httphttp2grpc。使用 https 协议命名的服务端口被视为 tcp,因此对于这些服务,系统不会显示指标。

验证是否已启用所需 API

Anthos Service Mesh 要求使用多个 API 来报告和显示遥测。您可以使用 gcloud services list 命令查看为您的项目启用的 API,也可以仅启用所有必需的 API,以确保获取所有 API。

  1. 设置 Google Cloud CLI 的默认项目:

    gcloud config set project YOUR_PROJECT_ID
  2. 启用所有必需的 API:

    gcloud services enable \
       container.googleapis.com \
       compute.googleapis.com \
       monitoring.googleapis.com \
       logging.googleapis.com \
       meshca.googleapis.com \
       meshtelemetry.googleapis.com \
       meshconfig.googleapis.com \
       iamcredentials.googleapis.com \
       anthos.googleapis.com \
       gkeconnect.googleapis.com \
       gkehub.googleapis.com \
       cloudresourcemanager.googleapis.com

验证 ASM 网格数据平面服务账号是否存在

  1. 在 Google Cloud 控制台中,打开 IAM 页面:

    打开 IAM 页面

  2. 选择您的项目。

  3. 在成员列表中,查找名为 ASM 网格数据平面服务账号的服务账号。

  4. 如果缺少服务账号,请创建一个:

    curl --request POST \
      --header "Authorization: Bearer $(gcloud auth print-access-token)" \
      --data '' \
      https://meshconfig.googleapis.com/v1alpha1/projects/YOUR_PROJECT_ID:initialize

验证您的工作负载是否正在运行

  1. 在 Google Cloud 控制台中,打开 GKE 工作负载页面:

    打开 GKE 工作负载

  2. 选择您的项目。

  3. 为集群添加过滤器。验证应用和 Anthos Service Mesh 的所有工作负载是否已启动且运行状态为 OK。工作负载可能会因资源(CPU、内存等)有限而失败,在这种情况下,您需要使用更多资源升级集群。如需了解详情,请参阅调整集群大小

验证您的应用是否正在处理请求

验证您的应用是否真正在处理请求。QPS 可能较低,但应该会收到流量。

拓扑图为空

如果拓扑图未显示您的服务,并显示错误消息 No data available to graph. Check your filters and try again,请检查以下内容:

验证网格 ID

验证集群是否具有正确的 mesh_id 标签:

  1. 获取项目编号,这是创建项目时自动生成的唯一编号。

  2. 确保集群的 mesh_id 标签采用以下格式:mesh_id: proj-PROJECT_NUMBER

    修复 mesh_id 标签(如果该标签缺失或不正确)。如需了解详情,请参阅针对现有集群添加或更新标签

  3. 设置以下环境变量:

    • 设置集群名称:

      export CLUSTER_NAME=YOUR_CLUSTER_NAME
    • CLUSTER_LOCATION 设置为您的集群区域或集群地区:

      export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION
  4. 使用您先前使用的相同选项重新部署 Anthos Service Mesh

  5. 在安装 Anthos Service Mesh 之前在集群上运行的任何工作负载都需要更新边车代理,以使其具有当前的 Anthos Service Mesh。

    kubectl rollout restart YOUR_DEPLOYMENT -n YOUR_NAMESPACE