解决 Anthos Service Mesh 中的虚拟机支持问题

以下步骤和日志对于排查 Anthos Service Mesh 虚拟机支持问题非常有用。

调试虚拟机

如果您看到虚拟机实例正在运行但无法从网格到达,请在虚拟机实例上执行以下步骤。

验证代理

  1. 检查 envoy 代理运行状况:

    curl localhost:15000/ready -v
    
  2. 检查 envoy 错误日志

    less /var/log/envoy/envoy.err.log
    
  3. 检查是否存在 service-proxy-agent 错误:

    journalctl -u service-proxy-agent
    
  4. 在实例的 Google Cloud Observability 日志中或虚拟机上的 /var/log/syslog 下(对于 Debian)和 /var/log/messages(对于 Centos)查看syslog

验证代理运行状况

  1. 要调试代理的配置,请在虚拟机上运行以下命令:

    curl localhost:15000/config_dump > config.out
    
  2. 复制该文件并运行以下命令:

    istioctl proxy-config [cluster|route|listener] --file config.out
    

令牌错误无效

您可能会在 envoy 错误日志中看到类似于以下内容的错误:

E0217 17:59:17.206995798    2411 oauth2_credentials.cc:152]  Call to http server ended with error 500 [{
  "error": "invalid_target",
  "error_description": "federated token response does not have access token. {\"error\":\"invalid_grant\",\"error_description\":\"JWT expired.\"}",
  "error_uri": ""
}].

在这种情况下,请检查虚拟机上的 /var/run/secrets/tokens/istio-token 中的令牌是否已过期,并确认 exp(周期秒)值未到期:

cat /var/run/secrets/tokens/istio-token | cut -d '.' -f2 | base64 -d | python -m json.tool
{
    ...
    "azp": "...",
    "email": "example-service-account@developer.gserviceaccount.com",
    "email_verified": true,
    "exp": 1613995395,
    "google": {
        "compute_engine": {
            "instance_creation_timestamp": 1613775765,
            "instance_id": "5678",
            "instance_name": "vm-instance-03-0mqh",
            "project_id": "...",
            "project_number": 1234,
            "zone": "us-central1-c"
        }
    },
    "iat": ...,
    "iss": "https://accounts.google.com",
    "sub": "..."
}

不支持操作系统分发警告信息

验证代理中,如果您在 service-proxy-agent 日志中看到类似于以下内容的警告消息:

E0217 17:59:17.206995798    2021-04-09T21:21:29.6091Z service-proxy-agent Warn
Detected image is unsupported: [Ubuntu|Fedora|Suse]. Envoy may not work correctly.

这意味着您的 Linux 发行版可能不受支持,这可能导致您的代理出现意外行为。

调试集群

请按以下步骤排查集群问题。

验证自动注册是否正常运行

  1. 检查 istiod 自动生成的 WorkloadEntry

    kubectl get workloadentry -n WORKLOAD_NAMESPACE
    

    此外,您可以检查 Kubernetes 对象浏览器中其是否存在。

  2. 如果该文件不存在,请在 istiod 日志中检查错误,Google Cloud Observability 中会显示这些错误。您也可以直接检索它们:

    kubectl -n istio-system get pods -l app=istiod
    

    预期输出如下所示:

    NAME                                       READY   STATUS    RESTARTS   AGE
    istiod-asm-190-1-7f6699cfb-5mzxw           1/1     Running   0          5d13h
    istiod-asm-190-1-7f6699cfb-pgvpf           1/1     Running   0          5d13h
    
  3. 设置 pod 环境变量并使用它来导出日志:

    export ISTIO_POD=istiod-asm-190-1-7f6699cfb-5mzxw
    kubectl logs -n istio-system ${ISTIO_POD} | grep -i 'auto-register\|WorkloadEntry'
    

检查连接的代理

您可以使用 proxy-status 命令列出所有连接的代理,包括虚拟机的代理:

istioctl proxy-status

输出应显示类似如下所示的代理:

NAME                                                    CDS        LDS        EDS        RDS          ISTIOD                               VERSION
details-v1-5f449bdbb9-bhl8d.default                     SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0-asm.1
httpbin-779c54bf49-647vd.default                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-eastwestgateway-5b6d4ddd9d-5rzx2.istio-system     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-ctb6b.istio-system      SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-vk4bb.istio-system      SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0-asm.1
vm-instance-03-39b3.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0
vm-instance-03-nh5k.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0
vm-instance-03-s4nl.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0

如需详细了解命令选项,请参阅 istioctl proxy-config

检查工作负载身份配置

检查 mesh 状态,以查看集群中是否存在潜在错误。请注意,必须使用最新版本的 gcloud。如需了解详情,请参阅更新到最新版本

gcloud alpha container hub mesh describe --project=PROJECT_ID

在有效配置中,成员集群状态代码为 OK

createTime: '2021-06-15T21:56:10.221032150Z'
featureState:
  detailsByMembership:
    projects/<your project number>/locations/global/memberships/<your cluster name>:
      code: OK
      description: Revision(s) ready for use: istiod-asm-195-2.
      updateTime: 2021-06-15T21:56:10.221032402Z
  lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T21:56:10.221032402Z'

如果虚拟机配置不正确,则状态代码将为 WARNING,并在说明中提供更多详细信息:

createTime: '2021-06-15T22:56:10.227167202Z'
featureState:
  detailsByMembership:
    projects/<your project number>/locations/global/memberships/<your cluster name>:
      code: WARNING
      description: |-
        Revision(s) ready for use: istiod-asm-195-2.
        WorkloadGroup <namespace>/<workloadgroup name> missing ServiceAccount field, please see https://cloud.google.com/service-mesh/v1.10/docs/troubleshooting/troubleshoot-vms#verify_the_workloadgroup_is_set_up_correctly.
      servicemeshFeatureState: {}
      updateTime: '2021-06-15T22:56:00.220164192Z'
  lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T22:56:10.227167402Z'

验证身份提供商是否正确设置

检查 IdentityProvider 资源字段:

 kubectl describe identityprovider

确保这些字段满足以下要求:

  • serviceAccount 字段设置为 request.auth.claims["email"]
  • issuerURI 字段设置为 https://accounts.google.com(我们目前仅支持 Google 作为 issuerURI)
  • 元数据下的提供商 name 字段必须设为 google,这是目前唯一受支持的提供商。

    有效的 IdentityProvider CR 示例:

    apiVersion: security.cloud.google.com/v1alpha1
    kind: IdentityProvider
    metadata:
      name: google
    spec:
      authentication:
        oidc:
          issuerUri: https://accounts.google.com
      serviceAccount: request.auth.claims["email"]
    

验证 WorkloadGroup 已正确设置

检查 WorkloadGroup

 kubectl get workloadgroup -n WORKLOAD_NAMESPACE

确保结果满足以下要求:

  • 已正确设置 serviceAccount 字段,例如 373206437219-compute@developer.gserviceaccount.com,其中的账号与虚拟机实例使用的服务账号相同
  • 已设置注解字段下的 security.cloud.google.com/IdentityProvider,例如 security.cloud.google.com/IdentityProvider: google
  • 工作负载组引用有效的 IdentityProvider,您可以通过检查现有身份提供商进行验证:

    kubectl describe identityprovider
    

    输出应为现有提供商的列表,如下所示:

     NAME     AGE
     google   39m
    

    检查 WorkloadGroup 中的 security.cloud.google.com/IdentityProvider 字段,查看提供商是否位于现有提供商列表中。

    有效的 WorkloadGroup CR 示例:

    apiVersion: networking.istio.io/v1alpha3
    kind: WorkloadGroup
    metadata:
    name: wg-a
    namespace: foo
    spec:
    metadata:
      annotations:
        security.cloud.google.com/IdentityProvider: google
      labels:
        app: wg-a
    template:
      ports:
        grpc: 3550
        http: 8080
      serviceAccount: 373206437219-compute@developer.gserviceaccount.com
    

发现内部错误

如果您收到消息 Internal Error Found,请参阅获取支持

Istio 虚拟机问题排查指南

如需了解其他问题排查步骤,请参阅调试虚拟机