Kubernetes部署Kong出现‘no Route matched’路由匹配失败求助
问题现象
部署Kong Ingress Controller后,所有请求返回路由匹配失败:
curl -X GET https://<$PROXY_IP>/<service_name> -L {"message":"no Route matched with those values"}%
Kong日志无错误输出,但在Admin界面可查看到对应的路由与服务资源。
相关K8s资源配置
Ingress配置
kind: Ingress metadata: annotations: konghq.com/override: <service_name> meta.helm.sh/release-name: <service_name> meta.helm.sh/release-namespace: services creationTimestamp: "2022-09-23T14:03:05Z" generation: 1 labels: app.kubernetes.io/managed-by: Helm name: <service_name> namespace: <service_ns> resourceVersion: "18823478" uid: 10f15c94-0c56-4d27-b97d-0ad5bdd549ec spec: ingressClassName: kong rules: - http: paths: - backend: service: name: <service_name> port: number: 8080 path: /<service_name> pathType: ImplementationSpecific status: loadBalancer: ingress: - ip: 172.16.44.236
KongIngress配置
apiVersion: configuration.konghq.com/v1 kind: KongIngress metadata: annotations: meta.helm.sh/release-name: <service_name> meta.helm.sh/release-namespace: services creationTimestamp: "2022-09-23T14:03:05Z" generation: 1 labels: app.kubernetes.io/managed-by: Helm name: <service_name> namespace: services resourceVersion: "18823487" uid: 9dd47a3c-598a-48fe-ba60-29779156b58d route: methods: - GET strip_path: true
Service配置
apiVersion: v1 kind: Service metadata: annotations: cloud.google.com/neg: '{"ingress":true}' konghq.com/override: <service_name> meta.helm.sh/release-name: <service_name> meta.helm.sh/release-namespace: services creationTimestamp: "2022-09-23T14:03:04Z" labels: app.kubernetes.io/instance: <service_name> app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: <service_name> app.kubernetes.io/version: latest helm.sh/chart: <local_chart> name: authenticate namespace: services resourceVersion: "18820083" uid: a3112c22-4df7-40b0-8fd3-cde8516354cc spec: clusterIP: 172.16.45.71 clusterIPs: - 172.16.45.71 internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: http port: 8080 protocol: TCP targetPort: 8080 selector: app.kubernetes.io/instance: <service_name> app.kubernetes.io/name: <service_name> sessionAffinity: None type: ClusterIP status: loadBalancer: {}
排查与解决步骤
核心问题:Service名称不匹配
Ingress配置中spec.rules[0].http.paths[0].backend.service.name设置为<service_name>,但实际Service的名称是authenticate,这会导致Kong无法关联到正确的上游服务,即使路由存在,也会返回路由匹配失败的错误。修正Ingress中的Service名称为authenticate即可解决此问题。命名空间一致性问题
Ingress部署在<service_ns>命名空间,而KongIngress和Service都在services命名空间。KongIngress的konghq.com/override注解要求Ingress与目标KongIngress在同一命名空间(2.6.x版本不支持跨命名空间引用KongIngress),建议将Ingress迁移到services命名空间,确保资源同域。路径匹配规则优化
将Ingress的pathType从ImplementationSpecific改为Prefix,明确路径匹配逻辑,避免Kong对路径解析产生歧义。验证Kong路由配置
通过Admin API检查路由的实际生效配置,确认strip_path和methods是否正确应用:curl http://<admin_ip>:8001/routes查看对应路由的
paths、methods、strip_path字段是否与预期一致。
内容的提问来源于stack exchange,提问作者hoisu

