排查 GKE 中的 Cloud Endpoints 问题

本文档介绍如何排查 Google Kubernetes Engine (GKE) 和 Kubernetes 中的 Endpoints 部署问题。

登录 kubectl create -f gke.yaml 失败

如果您看到错误消息 Failed in kubectl create -f gke.yaml,请执行以下步骤:

  1. gcloud 授权:

    gcloud auth login
        gcloud auth application-default login
        
  2. 创建集群。您可以使用以下 gcloud 命令,也可以使用 Google Cloud Console 创建集群。

        gcloud container clusters create CLUSTER_NAME
        

    CLUSTER_NAME 替换为您的集群名称。

  3. 获取集群的凭据并将其提供给 kubectl

        gcloud container clusters get-credentials CLUSTER_NAME
        

未显示 Endpoints 指标和日志

如果您可以成功向 API 发送请求,但 Cloud Console 中的 Endpoints > 服务页面上未显示任何指标或日志,请检查集群是否具有所需的 OAuth 范围,如下所示:

  1. 在 Cloud Console 中,转到“Kubernetes 集群”页面。

    转到“Kubernetes 集群”页面

  2. 从列表中选择您的集群。

  3. 点击权限

  4. 确认 Service Control 和 Service Management 具有以下 OAuth 范围:

    • Service Control:已启用
    • Service Management:只读

    如果 Service Control 和 Service Management 没有所需的 OAuth 范围,您需要另外创建一个具有所需范围的集群,或者按照更新 GKE 虚拟机范围(无需停机)中的步骤操作。

    如需了解详情,请参阅什么是访问权限范围?

访问 Extensible Service Proxy 中的日志

如果需要访问 Extensible Service Proxy (ESP) 日志以诊断问题,请使用 kubectl,如下所示:

  1. 获取 pod 的名称:

    kubectl get pod
    
        NAME                       READY     STATUS    RESTARTS   AGE
        esp-echo-174578890-x09gl   2/2       Running   2          21s
        

    pod 的名称为 esp-echo-174578890-x09gl,它有两个容器:especho

  2. 如需查看 pod 中的日志,请使用 kubectl logs

        kubectl logs POD_NAME -c CONTAINER_NAME
        

    其中,POD_NAMECONTAINER_NAME 是上一步中的 kubectl get pod 命令的返回值。例如:

      kubectl logs esp-echo-174578890-x09gl -c esp
        

验证服务名称

如果您看到错误消息 Fetching service config failed,请验证您在部署清单文件(也称为 deployment.yaml)的 --service 字段中指定的服务名称是否与在 gRPC API 配置 YAML 文件(也称为 api_config.yaml)的 name 属性中指定的主机名相匹配。

如果 deployment.yaml 文件中的名称不正确

  1. 打开 deployment.yaml 文件并转到为 ESP 容器配置的部分。例如:

        containers:
        - name: esp
          image: gcr.io/endpoints-release/endpoints-runtime:1
          args: [
            "--http_port=8081",
            "--backend=127.0.0.1:8080",
            "--service=SERVICE_NAME",
            "--rollout_strategy=managed"
          ]
          

    更改 SERVICE_NAME,使其与在 api_config.yaml 文件的 name 属性中指定的主机名匹配,然后保存 deployment.yaml 文件。

  2. 启动 Kubernetes 服务:

      kubectl create -f deployment.yaml
        

如果 api_config.yaml 文件中的名称不正确

  1. 获取 Endpoints 配置使用的服务名称

  2. 删除服务:

        gcloud endpoints services delete SERVICE_NAME
        

    SERVICE_NAME 替换为上一步中的名称。从 Google Cloud 中删除服务需要 30 天的时间。 在此期间,您无法再次使用该服务名称。

  3. 打开 api_config.yaml 文件,然后更正 name 属性中的主机名并保存文件。

  4. 部署更新后的服务配置:

    gcloud endpoints services deploy api_descriptor.pb api_config.yaml api_config_http.yaml
        

    等待服务配置成功部署。

  5. 启动 Kubernetes 服务:

      kubectl create -f deployment.yaml
        

检查配置文件

  1. 使用 ssh 通过 kubectl 命令连接到 pod:

        kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
        

    CONTAINER_NAME 替换为您的容器名称,并将 POD_NAME 替换为您的 pod 名称。

  2. etc/nginx/endpoints/ 目录中,检查以下配置文件是否存在错误:

    • nginx.conf - 包含 ESP 指令的 nginx 配置文件
    • service.jso - 服务配置文件

访问 Endpoints 状态页面

如果您在启动 ESP 时将 rollout_strategy 设置为 managed,并且需要查找 ESP 实例正在使用的配置 ID,则可从“Endpoints 状态”页面中获取该信息。

如需访问 Endpoints 状态页面,请执行以下操作:

  1. 使用 ssh 通过 kubectl 命令连接到 pod:

        kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
        

    CONTAINER_NAME 替换为您的容器名称,并将 POD_NAME 替换为您的 pod 名称。

  2. 安装 curl

  3. 输入以下内容:

      curl http://localhost:8090/endpoints_status
        

    随即会显示类似以下的内容:

    "serviceConfigRollouts": {
            "rolloutId": "2017-08-09r27",
            "percentages": {
                 "2017-08-09r26": "100"
            }
        }
        

rolloutId 中的值是 ESP 正在使用的服务配置 ID。如需确保 ESP 使用与 Endpoints 相同的配置,请参阅获取服务名称和配置 ID