API7 网关故障排查
本指南帮助你诊断和解决 API7 网关在安装、配置和运行过程中遇到的常见问题。对于每个问题,本指南都提供了症状、可能原因和解决步骤。
前置条件
诊断工具
在排查具体问题前,请先熟悉以下诊断工具。
检查组件状态
Kubernetes
# 检查所有 API7 Pod
kubectl get pods -n api7 -o wide
# 检查 Pod 事件中的错误
kubectl describe pod {pod_name} -n api7
# 检查 Pod 日志
kubectl logs {pod_name} -n api7 --tail=100
Docker
# 检查容器状态
docker ps -a --filter "name=api7"
# 检查容器日志
docker logs {container_name} --tail=100
检查数据面错误日志
# Kubernetes
kubectl exec -n api7 {gateway_pod} -- tail -f /usr/local/apisix/logs/error.log
# Docker
docker exec {gateway_container} tail -f /usr/local/apisix/logs/error.log
检查控制面日志
# Kubernetes
kubectl logs -n api7 {cp_pod} --tail=100
# Docker
docker logs {cp_container} --tail=100
测试连通性
# 测试网关 HTTP 端口
curl -v "http://{GATEWAY_HOST}:9080/"
# 测试网关 HTTPS 端口
curl -v "https://{GATEWAY_HOST}:9443/" --insecure
# 测试控制台访问
curl -v "https://{DASHBOARD_HOST}:7443/" --insecure
控制面问题
无法访问控制台
症状:无法访问 https://{host}:7443 上的控制台 Web 界面。
可能原因和解决方法:
-
Pod 或容器未运行:
# Kuberneteskubectl get pods -n api7 -l app.kubernetes.io/component=dashboard# Dockerdocker ps -a --filter "name=dashboard"如果 Pod 处于
CrashLoopBackOff状态,或容器已经退出,请检查日志中的启动错误。 -
端口未暴露或被防火墙阻止:
- 确认服务正在监听:
kubectl get svc -n api7 | grep dashboard。 - 确认端口 7443 未被防火墙或安全组规则阻止。
- 若要本地访问,请执行
kubectl port-forward svc/api7ee3-dashboard 7443:7443 -n api7。
- 确认服务正在监听:
-
TLS 证书问题:如果使用自定义 TLS 证书,请确认其有效且已正确挂载。
PostgreSQL 连接失败
症状:控制面 Pod 因数据库连接错误无法启动。
可能原因和解决方法:
-
PostgreSQL 未运行:
kubectl get pods -n api7 -l app.kubernetes.io/name=postgresql -
数据库凭证不正确:确认 Helm values 或环境变量中的数据库密码与 PostgreSQL 配置一致。
-
持久卷问题:如果 PostgreSQL 存储已满或 PVC 未绑定,请执行:
kubectl get pvc -n api7
配置变更未生效
症状:在控制台中进行的变更没有出现在数据面。
可能原因和解决方法:
-
DP Manager 连接问题:确认 DP Manager 服务正在运行且数据面可以访问:
kubectl get svc -n api7 | grep dp-manager -
检查控制面与数据面之间使用的 mTLS 证书是否已过期;如已过期,请续期并重新部署。
-
确保 NetworkPolicy 或防火墙规则没有阻止控制面与数据面之间的 7900/7943 端口通信。
数据面问题
HTTP 502 Bad Gateway
症状:客户端收到 502 Bad Gateway 响应。
可能原因和解决方法:
-
上游服务无法访问:从网关 Pod 中确认上游服务正在运行且可以访问:
kubectl exec -n api7 {gateway_pod} -- curl -v "http://{upstream_host}:{upstream_port}/" -
DNS 解析失败:如果使用服务名称,请在网关 Pod 内确认 DNS 解析:
kubectl exec -n api7 {gateway_pod} -- nslookup {upstream_service_name} -
上游超时:检查错误日志中的超时消息。如果后端响应缓慢,请提高上游超时时间。API7 网关的上游配置位于 Service 中;
timeout对象的connect、send和read值均以秒为单位:curl -k "https://localhost:7443/apisix/admin/services/{service_name}?gateway_group_id={gateway_group_id}" -X PUT \-H "X-API-KEY: ${API_KEY}" \-H "Content-Type: application/json" \-d '{"name": "{service_name}","upstream": {"type": "roundrobin","nodes": [{"host": "{upstream_host}", "port": {upstream_port}, "weight": 1}],"timeout": {"connect": 30,"send": 30,"read": 30}}}'必须发送完整的 Service 请求体(名称和上游配置),因为 PUT 会替换整个资源。发送前先使用
GET /apisix/admin/services/{service_name}?gateway_group_id={gateway_group_id}获取当前 Service,并将新的timeout配置合并到完整请求体中。
HTTP 503 Service Temporarily Unavailable
症状:特定路由返回 503。
可能原因和解决方法:
- 所有上游节点均不健康:如果启用了主动健康检查且所有节点都失败,网关会返回 503。请在控制台中检查上游健康状态。
- 触发熔断器:如果启用了
api-breaker插件,连续失败可能已触发熔断器并打开熔断。
HTTP 404 Route Not Found
症状:请求返回 {"error_msg":"404 Route Not Found"}。