Kong外部服务路由匹配失败:Minikube环境请求报错no Route matched
严格按照Kong官方External Service教程步骤,在本地Minikube Kubernetes集群部署Kong Gateway后,向http://localhost/httpbin/anything发送HTTP请求时,收到“no Route matched with those values”错误。请问教程是否过时或缺失步骤?
Kong部署步骤
在本地Minikube集群中部署Kong Gateway,操作如下:
minikube start --driver=docker
# 在另一个终端窗口/后台进程执行 minikube tunnel
安装Gateway API CRDs:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
echo " --- apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: kong annotations: konghq.com/gatewayclass-unmanaged: 'true' spec: controllerName: konghq.com/kic-gateway-controller --- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: kong spec: gatewayClassName: kong listeners: - name: proxy port: 80 protocol: HTTP " | kubectl apply -f -
通过Helm安装Kong:
helm repo add kong https://charts.konghq.com helm repo update helm install kong kong/ingress -n kong --create-namespace
测试连通性:
export PROXY_IP=$(kubectl get svc --namespace kong kong-gateway-proxy -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $PROXY_IP curl -i $PROXY_IP
外部服务配置
将Service与HTTPRoute合并到同一个YAML文件中:
--- # Service kind: Service apiVersion: v1 metadata: name: proxy-to-httpbin spec: ports: - protocol: TCP port: 80 type: ExternalName externalName: httpbin.org --- # Route /httpbin apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: proxy-from-k8s-to-httpbin annotations: konghq.com/strip-path: 'true' spec: parentRefs: - name: kong rules: - matches: - path: type: value: /httpbin backendRefs: - name: proxy-to-httpbin kind: Service port: 80
应用该配置:
$ kubectl apply -f ./external-service.yaml service/proxy-to-httpbin created httproute.gateway.networking.k8s.io/proxy-from-k8s-to-httpbin created
执行结果:
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE proxy-to-httpbin ExternalName <none> httpbin.org 80/TCP 8m1s $ kubectl get httproutes NAME HOSTNAMES AGE proxy-from-k8s-to-httpbin 8m51s
问题现象
教程说明完成上述步骤后,测试服务时应得到与httpbin.org/anything类似的响应。但向gateway-proxy/httpbin/anything发送请求时,收到路由匹配错误:
$ curl -s -i $PROXY_IP/httpbin/anything HTTP/1.1 404 Not Found Content-Type: application/json; charset=utf-8 Content-Length: 52 Connection: keep-alive Date: Wed, 15 Nov 2023 15:58:39 GMT X-Kong-Response-Latency: 0 Server: kong/3.4.2 X-Kong-Upstream-Latency: 9 X-Kong-Proxy-Latency: 1 Via: kong/3.4.2 { "message":"no Route matched with those values" }
求助问题
如何配置才能让Kong Gateway正确将HTTP请求转发至外部服务?
更新说明
使用相同配置在AKS上部署Kong后,外部服务httpbin可正常工作:
curl -s -i 4.232.X.X/httpbin/anything HTTP/1.1 200 OK Content-Type: application/json Content-Length: 480 Connection: keep-alive X-Cache-Key: c48fe84b97bba1516dd96c93604fc907de95cf449284992594d1325998236ffb X-Cache-Status: Bypass Date: Fri, 01 Dec 2023 10:22:10 GMT Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true X-Kong-Upstream-Latency: 504 X-Kong-Proxy-Latency: 1 Via: kong/3.4.2 { "args": {}, "data": "", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Host": "4.232.X.X", "User-Agent": "curl/8.2.1", "X-Amzn-Trace-Id": "Root=1-6569b3d1-7a71e89914522ebe73d9d548", "X-Forwarded-Host": "4.232.X.X", "X-Forwarded-Path": "/httpbin/anything", "X-Forwarded-Prefix": "/httpbin/" }, "json": null, "method": "GET", "origin": "10.224.0.4, 4.232.X.Y", "url": "http://4.232.X.X/anything" }
推测该问题可能与Minikube环境有关。
针对Minikube环境下的路由匹配问题,可通过以下步骤修复:
1. 补全HTTPRoute的Path匹配类型
Gateway API v1版本要求明确指定路径匹配类型,你的HTTPRoute配置中path.type字段为空,这会导致Kong无法正确识别路由规则。修改HTTPRoute的path部分为:
matches: - path: type: Prefix value: /httpbin
Prefix类型会匹配所有以/httpbin开头的请求,包括/httpbin/anything这类子路径。
2. 明确指定Gateway的Namespace
你通过Helm将Kong安装在kong命名空间,但HTTPRoute默认创建在default命名空间,parentRefs中未指定命名空间可能导致路由无法关联到正确的Gateway。修改parentRefs部分:
parentRefs: - name: kong namespace: kong
3. 验证Minikube Tunnel状态
确保minikube tunnel进程持续运行,它负责将Minikube的负载均衡服务暴露到本地网络。可以通过以下命令检查Gateway的负载均衡IP是否正常:
kubectl get gateway kong -n kong
确认ADDRESS字段有有效IP地址,且与你导出的PROXY_IP一致。
4. 重新应用配置
修改YAML文件后,重新应用配置:
kubectl apply -f ./external-service.yaml
等待几秒让Kong同步路由规则,再次测试请求:
curl -i $PROXY_IP/httpbin/anything
内容的提问来源于stack exchange,提问作者mikyll98

