排查 GKE 中的 Cloud Endpoints 问题

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

Failed in 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 控制台创建集群。

    gcloud container clusters create CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群名称。

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

    gcloud container clusters get-credentials CLUSTER_NAME
    

未显示 Endpoints 指标和日志

如果您可以成功向 API 发送请求,但 Google Cloud 控制台中的 Endpoints > Services 页面上看不到任何指标或日志,请按以下步骤操作:

  1. 选中启用的所有必需服务
  2. 选中授予的所有所需权限

访问可扩展服务代理中的日志

如果需要访问 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