Search code examples
kubernetesistiogateway

404 Not Found when migrating from ingress to istio


I'm trying to migrate from ingress to istio gateway + virtual service routing, but I keep receiving a 404 Not Found error.

The only link that the app should be accessed to is using my-todos.com, configured locally.

What am I missing here?

Note: the ingress controller works just fine. Initially, todo-lb.default.svc.cluster.local in the istio.yaml file was just set to todo-lb, representing the configured load balancer, still with no success.

Here is the ingress.yaml file (to migrate from):

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 }}

Here is the istio.yaml file (to migrate TO):

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 }}

Solution

  • In addition to @Jakub answer, there can be one more reason you can get 404 error. Your current ingress rules in virtual service looks like this:

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

    In Istio, each of the above is an ingress rule. If in Istio ingress-gateway, the rules are added in the above order, then all the URL path including the prefix /api gets routed to the first service i.e. todo-lb.default. It is better to create a single Virtual service like this and then see if the routing works as expected.

    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