从 ingress 迁移到 istio 时出现 404 Not Found

404 Not Found when migrating from ingress to istio

我正在尝试从入口迁移到 istio 网关 + 虚拟服务路由,但我一直收到 404 Not Found 错误。

应访问该应用程序的唯一 link 是使用本地配置的 my-todos.com

我在这里错过了什么?

注意:入口控制器工作正常。最初,istio.yaml 文件中的 todo-lb.default.svc.cluster.local 只是设置为 todo-lb,代表配置的负载均衡器,仍然没有成功。

这是 ingress.yaml 文件(从中迁移):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: todo-ingress
spec:
  rules:
    - host: my-todos.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: todo-lb
                port:
                  number: 3001
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: {{ .Values.api.apiName }}
                port:
                  number: {{ .Values.api.apiPort }}

这里是 istio.yaml 文件(迁移到):

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: todo-istio-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - my-todos.com
    # - "*"
    tls:
      httpsRedirect: true
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: tls-secret
    hosts:
    - my-todos.com
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: todo-lb
spec:
  hosts:
  - my-todos.com
  # - "*"
  gateways:
  - todo-istio-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: todo-lb.default.svc.cluster.local
        port:
          number: 3001
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: todo-api
spec:
  hosts:
  - my-todos.com
  # - "*"
  gateways:
  - todo-istio-gateway
  http:
  - match:
    - uri:
        prefix: /api
    route:
    - destination:
        host: {{ .Values.api.apiName }}
        port:
          number: {{ .Values.api.apiPort }}

据我所知,您的虚拟服务中的网关配置有误,这就是它可能无法正常工作的原因。


如果网关与虚拟服务不在同一个命名空间中,您必须在虚拟服务中指定

检查spec.gateways部分

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo-Mongo
spec:
  gateways:
  - some-config-namespace/my-gateway # can omit the namespace if gateway is in same
                                       namespace as virtual service.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
  namespace: some-config-namespace

有相关istio documentation


因此请将您的 todo-istio-gateway 移至默认命名空间。

或使用

gateways:
  - istio-system/todo-istio-gateway

检查几件事是否有帮助:

  • 您的应用程序是否部署在默认命名空间中?
  • 你的应用 injected 吗?

除了@Jakub 的回答之外,还有一个原因会导致您收到 404 错误。您当前在虚拟服务中的入口规则如下所示:

Hostname Path Route
my-todos.com / Forward to todo-lb.default.svc.cluster.local
my-todos.com /api Forward to {{ .Values.api.apiName }}

在Istio中,以上每一个都是一个ingress规则。如果在 Istio ingress-gateway 中,规则是按上述顺序添加的,那么所有 URL 路径包括前缀 /api 都会被路由到第一个服务,即 todo-lb.default。最好像这样创建一个虚拟服务,然后查看路由是否按预期工作。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: todo-api
spec:
  hosts:
  - my-todos.com
  gateways:
  - <namespace>/todo-istio-gateway
  http:
  - match:
    - uri:
        prefix: /api
    route:
    - destination:
        host: {{ .Values.api.apiName }}
        port:
          number: {{ .Values.api.apiPort }}
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: todo-lb.default
        port:
          number: 3001