本文档介绍如何排查 Google Kubernetes Engine (GKE) 和 Kubernetes 中的 Endpoints 部署问题。
Failed in kubectl create -f gke.yaml
如果您看到错误消息 Failed in kubectl create -f gke.yaml
,请执行以下步骤:
向
gcloud
授权:gcloud auth login gcloud auth application-default login
创建集群。您可以使用以下
gcloud
命令,也可以使用 Google Cloud 控制台创建集群。gcloud container clusters create CLUSTER_NAME
将
CLUSTER_NAME
替换为您的集群名称。获取集群的凭据并将其提供给
kubectl
:gcloud container clusters get-credentials CLUSTER_NAME
未显示 Endpoints 指标和日志
如果您可以成功向 API 发送请求,但 Google Cloud 控制台中的 Endpoints > Services 页面上看不到任何指标或日志,请按以下步骤操作:
访问可扩展服务代理中的日志
如果需要访问 Extensible Service Proxy (ESP) 日志以诊断问题,请使用 kubectl
,如下所示:
获取 pod 的名称:
kubectl get pod NAME READY STATUS RESTARTS AGE esp-echo-174578890-x09gl 2/2 Running 2 21s
pod 的名称为
esp-echo-174578890-x09gl
,它有两个容器:esp
和echo
。如需查看 pod 中的日志,请使用
kubectl logs
:kubectl logs POD_NAME -c CONTAINER_NAME
其中,
POD_NAME
和CONTAINER_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
文件中的名称不正确:
打开
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
文件。启动 Kubernetes 服务:
kubectl create -f deployment.yaml
如果 api_config.yaml
文件中的名称不正确:
获取 Endpoints 配置使用的服务名称。
删除服务:
gcloud endpoints services delete SERVICE_NAME
将
SERVICE_NAME
替换为上一步中的名称。从 Google Cloud 中删除服务需要 30 天的时间。 在此期间,您无法再次使用该服务名称。打开
api_config.yaml
文件,然后更正name
属性中的主机名并保存文件。部署更新的服务配置:
gcloud endpoints services deploy api_descriptor.pb api_config.yaml api_config_http.yaml
等待服务配置成功部署。
启动 Kubernetes 服务:
kubectl create -f deployment.yaml
检查配置文件
使用
ssh
通过kubectl
命令连接到 pod:kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
将
CONTAINER_NAME
替换为您的容器名称,并将POD_NAME 替换为您的 pod 名称。 在
etc/nginx/endpoints/
目录中,检查以下配置文件是否存在错误:nginx.conf
- 包含 ESP 指令的nginx
配置文件service.jso
- 服务配置文件
访问 Endpoints 状态页面
如果您在启动 ESP 时将 rollout_strategy
设置为 managed
,并且需要查找 ESP 实例正在使用的配置 ID,则可从“Endpoints 状态”页面中获取该信息。
如需访问 Endpoints 状态页面,请执行以下操作:
使用
ssh
通过kubectl
命令连接到 pod:kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
将
CONTAINER_NAME
替换为您的容器名称,并将POD_NAME
替换为您的 pod 名称。安装
curl
。输入以下内容:
curl http://localhost:8090/endpoints_status
随即会显示类似以下的内容:
"serviceConfigRollouts": { "rolloutId": "2017-08-09r27", "percentages": { "2017-08-09r26": "100" } }
rolloutId
中的值是 ESP 正在使用的服务配置 ID。如需确保 ESP 使用与 Endpoints 相同的配置,请参阅获取服务名称和配置 ID。