GKE Gateway API路由正常但访问报‘no healthy upstream’问题求助
排查GKE Gateway API路由"no healthy upstream"问题
结合你的配置和问题现象,从以下几个方向逐一排查:
跨命名空间后端引用权限缺失
Gateway API v1beta1默认限制跨命名空间的服务引用,你的HTTPRoute引用了monitoring命名空间的服务,但如果该命名空间未配置ReferenceGrant允许HTTPRoute所在命名空间访问其服务,会导致路由无法正确关联后端,最终触发"no healthy upstream"。
解决:在monitoring命名空间创建ReferenceGrant资源(替换<HTTPRoute所在命名空间>为实际值):apiVersion: gateway.networking.k8s.io/v1beta1 kind: ReferenceGrant metadata: name: allow-monitoring-services namespace: monitoring spec: from: - group: gateway.networking.k8s.io kind: HTTPRoute namespace: <HTTPRoute所在命名空间> to: - group: "" kind: Service name: internal-grafana - group: "" kind: Service name: chronograf - group: "" kind: Service name: jaeger-query后端服务健康检查配置不匹配
GKE L7 ILB会自动为后端服务创建健康检查,默认检查路径为/。如果你的后端服务(如Jaeger)的健康检查路径不是/,默认检查会返回非200状态码,导致LB标记上游为不健康。
排查步骤:- 查看自动生成的健康检查详情:
gcloud compute health-checks describe <健康检查名称> - 验证Pod的健康路径响应:进入Pod执行
curl localhost:3000(Grafana)或curl localhost:80/healthz(Jaeger) - 若需修改健康检查路径,给后端服务添加注解并创建BackendConfig:
# 后端服务注解 annotations: cloud.google.com/backend-config: '{"default": "monitoring-backend-config"}'# BackendConfig资源 apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: name: monitoring-backend-config spec: healthCheck: checkIntervalSec: 5 port: 3000 # 对应服务端口 requestPath: /healthz # 替换为后端实际健康检查路径 timeoutSec: 5
- 查看自动生成的健康检查详情:
后端服务路径前缀与路由不兼容
路由配置PathPrefix: /grafana后,请求会转发到后端的/grafana路径,但如果Grafana等应用未配置baseURL,会返回404错误。若应用因路径错误无法响应健康检查,也会触发上游不健康标记。
解决:修改应用配置设置baseURL:- Grafana:添加环境变量
GF_SERVER_ROOT_URL=http://abc.com/grafana - Chronograf:配置
BASE_PATH=/chronograf - Jaeger Query:启动参数添加
--query.base-path=/jaeger
- Grafana:添加环境变量
后端服务端口映射错误
确认后端服务的targetPort是否与Pod监听端口一致:- 查看服务配置:
kubectl get svc internal-grafana -n monitoring -o yaml - 确保
spec.ports[].targetPort匹配Pod实际端口(Grafana默认3000,Chronograf默认80,Jaeger Query默认80)
- 查看服务配置:
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

