首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Istio入侵网关: 404 NR route_not_found

Istio入侵网关: 404 NR route_not_found
EN

Stack Overflow用户
提问于 2021-04-17 11:40:26
回答 2查看 6.2K关注 0票数 3

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

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

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

代码语言:javascript
运行
复制
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错误,如下所示。

代码语言:javascript
运行
复制
$ 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

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

代码语言:javascript
运行
复制
[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 - -

有谁知道这个问题可能是什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-23 07:15:07

为了更好地解释亚历山大的解,我添加了以下内容:

问题:"404未找到“由特使"404 NR route_not_found”引起。

当使用VirtualService属性未正确配置从网关到hosts的路由时,您将得到响应状态404未找到来自server: istio-envoy (响应标头)的响应,如下所示:

代码语言:javascript
运行
复制
$ 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 --除了。

Fix:添加通配符路由

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

为了解决这个问题,对于简单的测试和演示,在网关和E 233 VirtualService配置中为 host 使用通配符值。

另请参阅

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

关于使用Istio观察404 NR的情况,有类似的问题报告:

票数 1
EN

Stack Overflow用户

发布于 2021-04-17 13:54:45

我可以通过将主机的值从"host.docker.internal“更改为"*”来解决这个问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67137746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档