本页面适用于 Apigee 和 Apigee 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
配置。
- 确保已配置侦听器进行拦截。
- 检查
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.local
code>,其表示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 产品。
检查远程服务日志
- 启动在
debug level
进行日志记录的远程服务。请参阅设置远程服务日志级别。在命令行中使用
-l debug
选项。 例如:apigee-remote-service-envoy -l debug
- 尝试访问您的目标并检查日志
查看日志以查找如下所示的行:
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