【问题标题】:Istio gives 404 NR response when it should be giving 200Istio 在应该给出 200 时给出 404 NR 响应
【发布时间】:2026-02-09 14:50:02
【问题描述】:

相关问题

Istio envoy is dropping requests with Host header

上述问题是唯一一个与我的问题非常相似的问题。但是,我的标头中的主机是service-b.myns.svc.cluster.local,我不明白为什么这会是个问题。

情况

我有一个包含许多 Deployments 和 Services 的命名空间。对于每个Service,我还定义了一个VirtualService。示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  labels:
    app: service-b
  name: service-b
  namespace: myns
spec:
  gateways:
  - myns.myns.svc.cluster.local
  hosts:
  - '*'
  http:
  - match:
    - uri:
        prefix: /.well-known
    - uri:
        prefix: /robots.txt
    - uri:
        prefix: /apple-app-site-association
    - uri:
        prefix: /favicon.ico
    - uri:
        prefix: /content/
    route:
    - destination:
        host: service-b.myns.svc.cluster.local
        port:
          number: 80

问题

我有另一个服务,称为 service-a,它应该能够检索 /.well-knownrobots.txt/content/header/content/footer 等。我假设是这样,因为我已经为这些路径直接通向service-b,它们应该可以由service-a 检索。但是,日志是这样说的:

[2019-02-22T01:07:54.557Z] "GET /content/headerHTTP/1.1" 404 NR 0 0 0 - "-" "curl/7.52.1" "789b3b81-9f61-43c3-b01a-b66d35c1d635" "service-b" "-" - - 10.x.x.x:80 10.y.y.y:47526

问题 #1

根据Envoy docsNR 表示没有路由。我没有在VirtualService 中定义路由吗?

问题 #2

如果我将这些路径插入浏览器的 URL 栏中(即<istio-ingressgateway-ip-address>/robots.txt),我可以获得每个路径的200 响应。为什么?

一些进展

我已将问题范围缩小到 service-a 的 pod 上的 istio 代理。我通过一次删除一个 istio-proxy 边车来做到这一点。有两种情况我从service-a成功获得200s:

[SVCA][ISTIOPROXY] ---> X [ISTIOPROXY][SVCB]  # Does not work
[SVCA][ISTIOPROXY] ---> X             [SVCB]  # Does not work
[SVCA]             ---> ✓             [SVCB]  # Does work
[SVCA]             ---> ✓ [ISTIOPROXY][SVCB]  # Does work

【问题讨论】:

  • istioctl proxy-config endpoint service-a 表明它在配置中有一个 HEALTHY outbound|80||service-b.myns.svc.cluster.local 端点。编辑:实际上是两个,因为service-b 有两个豆荚。
  • 您有网关:已指定。您真的有以这种方式设置的网关吗?这也可以解释为什么这是通过 Istio Gateway 进行外部路由...如果删除该网关会发生什么:声明?
  • 谢谢@PaulAnnetts,问题是默认网关是mesh,我得到这个错误:wildcard host * is not allowed for virtual services bound to the mesh gateway。 -- 通常它不会是主机的*,但是这是一个我没有设置任何 DNS 的测试集群,所以我必须使用 IP 地址来访问它......好吧,看起来我可以将 IP 地址放在那里并删除 gateways 块。 -- 但它仍然不起作用......实际上,除了istio-ingressgateway (istioctl proxy-status) 之外,我的所有 pod 上的 RDS 看起来都是 STALE
  • FWIW...我调整了ServiceEntry,它开始工作了。然后我尝试重现该问题,但无法获得相同的行为。

标签: kubernetes istio envoyproxy


【解决方案1】:

你没有配置默认路由。

默认路由示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  labels:
    app: service-b
  name: service-b
  namespace: myns
spec:
  gateways:
  - myns.myns.svc.cluster.local
  hosts:
  - '*'
  http:
  - match:
    - uri:
        prefix: /.well-known
    - uri:
        prefix: /robots.txt
    - uri:
        prefix: /apple-app-site-association
    - uri:
        prefix: /favicon.ico
    - uri:
        prefix: /content/
    route:
    - destination:
        host: service-a.myns.svc.cluster.local
        port:
          number: 80
  - route:
    - destination:
        host: service-b.myns.svc.cluster.local
        port:
          number: 80

【讨论】: