问题排查

本页面适用于 ApigeeApigee Hybrid

查看 Apigee Edge 文档。

Istio 404(未找到)错误

针对 Istio 上 404(未找到)错误进行的调试可能会令人不快。希望这能让您开始着手追踪可能出现问题的环节。

通配符网关冲突

只能有一个使用通配符“*”主机值的网关定义。如果您部署了包含通配符网关的任何内容,则客户端调用将失败并显示 404 状态。

例如:

$ istioctl get gateways
GATEWAY NAME         HOSTS     NAMESPACE   AGE
bookinfo-gateway     *         default     20s
httpbin-gateway      *         default     3s

如果这样,您需要删除或更改其中一个冲突网关。

搜索路线失败的位置

Istio 就像是洋葱(或者像 Ogre)一样拥有层。一种用于调试 404 的系统化方法是从目标向外探索。

后端工作负载

验证您可以从 Sidecar 访问工作负载:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl localhost:80/headers

后端 Sidecar

设置您的服务地址并获取工作负载 pod 的 IP 地址。

SERVICE=httpbin.default.svc.cluster.local:80
  POD_IP=$(kubectl get pod $WORKLOAD_POD -o jsonpath='{.status.podIP}')

通过 Sidecar 访问工作负载:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v http://$SERVICE/headers --resolve "$SERVICE:$POD_IP"

如果启用了 Istio mTLS:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v https://$SERVICE/headers --resolve "$SERVICE:$POD_IP" --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

网关(或前端 Sidecar)

通过网关访问服务:

kubectl -n istio-system exec $GATEWAY_POD -- curl -v http://$SERVICE/header

如果启用了 Istio mTLS:

kubectl -n istio-system exec $GATEWAY_POD -- curl -v https://$SERVICE/headers --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

缺少分析

如果您在 Analytics(分析)界面中未看到分析数据,请考虑以下可能的原因:

  • Apigee 可能延迟几分钟才会收到信息
  • Envoy gRPC 访问日志未正确配置
  • Envoy 无法连接到远程服务
  • 远程服务上传失败

缺少 API 密钥或错误的 API 密钥未遭拒

如果 API 密钥验证无法正常工作,请考虑以下可能的原因:

直接代理

检查 ext-authz 配置。

Sidecar
  • 确保已配置侦听器进行拦截。
  • 检查 ext-authz 配置。

正在检查并已允许无效请求

  • 已配置远程服务进行应急开启
  • 没有配置 Envoy 以进行 RBAC 检查

如需了解如何解决这些问题,请参阅以下 Envoy 文档主题:外部授权,并参阅 failure_mode_allow 属性的相关信息。通过此属性,您可以更改过滤器的出错行为。

缺少 JWT 或错误的 JWT 未遭拒

可能的原因是尚未配置 Envoy JWT 过滤器。

有效的 API 密钥失败

可能的原因

  • Envoy 无法连接到远程服务
  • 您的凭据无效
  • 没有为目标和环境配置 Apigee API 产品
  • Envoy 不知道 Apigee API 产品

问题排查步骤

在 Apigee 上查看您的 API 产品

  • 是否已为您的环境(测试与生产)启用?

    该产品必须与您的远程服务绑定到同一环境。

  • 它是否已绑定到您访问的目标?

    查看 Apigee 远程服务目标部分。请记住,服务名称必须是完全限定的主机名。对于 Istio 服务,其名称类似于 helloworld.default.svc.cluster.localcode>,其表示 default 命名空间中的 helloworld 服务。

  • 资源路径是否与您的请求相匹配?

    请注意,//** 等路径将与任何路径匹配。您也可以使用“*”或“**”通配符进行匹配。

  • 您是否拥有开发者应用?

    API 产品必须绑定到开发者应用才能检查其密钥。

  • Apigee API Product operationConfigType 是否设置为 remoteservice?

    使用 Apigee Management API 检查 API 产品配置,并确认 operationConfigType 设置为 remoteservice

查看您的请求

  • 您是否在 x-api-key header 中传递使用方密钥

    例如:

    curl http://localhost/hello -H "x-api-key: wwTcvmHvQ7Dui2qwj43GlKJAOwmo"
  • 您是否使用合适的使用方密钥?

    确保您正在使用的应用的凭据已获得批准,可以用于 API 产品。

检查远程服务日志

  1. 启动在 debug level 进行日志记录的远程服务。请参阅设置远程服务日志级别

    在命令行中使用 -l debug 选项。 例如:

    apigee-remote-service-envoy -l debug
  2. 尝试访问您的目标并检查日志

    查看日志以查找如下所示的行:

    Resolve api: helloworld.default.svc.cluster.local, path: /hello, scopes: []
    Selected: [helloworld]
    Eliminated: [helloworld2 doesn't match path: /hello]
    

设置远程服务日志级别

使用命令行标志,您可以在以下调试模式(按详细程度排序)之一下启动远程服务,其中 debug 是最高详细程度,error 是最低详细程度:

  • debug - 详细程度最高的日志记录模式。
  • info - 默认模式。
  • warn
  • error - 详细程度最低的日志记录模式。

例如,如需在 debug 级启动服务,请运行以下命令:

apigee-remote-service-envoy -l debug