Istio入口网关:404 NR route_not_found



我想配置一个Istio入口网关,它根据HTTP路径的前缀将流量路由到不同的服务。

例如,HTTP流量路径/myservice应路由到服务myservice

到目前为止,我已经创建了以下YAML配置:

apiVersion: apps/v1
kind: Deployment
metadata:
name: myservice
namespace: microservices
labels:
app: myservice
spec:
replicas: 1
selector:
matchLabels:
app: myservice
template:
metadata:
labels:
app: myservice
spec:
containers:
- name: myservice
image: myservice-node
ports:
- containerPort: 3002
imagePullPolicy: Never
---
apiVersion: v1
kind: Service
metadata:
name: myservice
namespace: microservices
spec:
ports:
- nodePort: 32015
port: 3002
targetPort: 3002
selector:
app: myservice
type: LoadBalancer
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: mygateway
namespace: microservices
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "host.docker.internal"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: crossway
namespace: microservices
spec:
hosts:
- "*"
gateways:
- mygateway
http:
- match:
- uri:
prefix: /myservice
route:
- destination:
port:
number: 3002
host: myservice.microservices.svc.cluster.local

向发送请求http://192.168.99.111:31878/myservice产生404错误,如下所示。

$ export INGRESS_HOST=$(minikube ip)
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o     jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ echo "INGRESS_HOST=$INGRESS_HOST, INGRESS_PORT=$INGRESS_PORT"
INGRESS_HOST=192.168.99.111, INGRESS_PORT=31878
$ curl -I http://192.168.99.111:31878/myservice
HTTP/1.1 404 Not Found
date: Sat, 17 Apr 2021 10:54:43 GMT
server: istio-envoy
transfer-encoding: chunked

在入口网关的日志文件中,我发现了以下错误消息:

[2021-04-17T10:54:43.408Z] "HEAD /myservice HTTP/1.1" 404 NR route_not_found - "-" 0 0 0 - "172.17.0.1" "curl/7.64.0" "3b11c571-4372-9b4a-971e-25af260eeba3" "192.168.99.111:31878" "-" - - 172.17.0.4:8080 172.17.0.1:42458 - -

有人知道可能是什么问题吗?

我可以通过将hosts的值从";host.doker.internal";至"*&";。

为了进一步解释Alexander的解决方案,我添加了:

问题:";404未找到";由istio特使引起的";404 NR route_ not_found">

当从网关虚拟服务的路由未使用hosts属性正确配置时,您将获得响应状态404未找到作为来自server: istio-envoy的响应(响应标头(,如:

$ curl -I http://192.168.99.111:31878/myservice
HTTP/1.1 404 Not Found
date: Sat, 17 Apr 2021 10:54:43 GMT
server: istio-envoy
transfer-encoding: chunked

这是由于入口网关(istio-envoy(找不到路由造成的。因此,您在特使的访问日志中看到了这样一条错误消息,其中包含响应标志NR:

NR:除了404响应代码外,没有为给定请求配置路由,或者没有为下游连接配置匹配的过滤器链。

类似于日志中给定的404 NR route_not_found部分,除了。

修复:添加通配符路由

为了使内部服务(虚拟主机(可以从外部访问,就像从浏览器访问一样,您必须定义从**的通配符路由。请参阅Istio文档中的解释使用浏览器访问入口服务:

要解决此问题以进行简单的测试和演示,请为网关虚拟服务配置中的host使用通配符*值。

另请参阅

Istio官方指南:配置Istio入口网关还包括测试入口网关配置的步骤。

对于使用Istio观察404 NR,报告了类似的问题:

  • isto:问题#226562:";GET/HTTP/2";404尝试通过ingressgateway时NR
  • envoyproxy:问题#12936:连接在404+NR之后关闭

最新更新