Istio Virtual Service is not working very well

7/12/2021

I find that the Rewrite feature of my Virtual Service is not working very well. Here is my Virtual Service and DestinationRule yaml file:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: leads-http
  namespace: seldon
spec:
  gateways:
  - istio-system/seldon-gateway
  hosts:
  - '*'
  http:
  - match:
    - uri:
        prefix: /seldon/seldon/leads/
    rewrite:
      uri: /
    route:
    - destination:
        host: leads-leads
        port:
          number: 8000
        subset: leads
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: leads-leads
  namespace: seldon
spec:
  host: leads-leads
  subsets:
  - labels:
      version: leads
    name: leads
  trafficPolicy:
    connectionPool:
      http:
        idleTimeout: 60s

When I send an http request:

curl --location --request POST 'http://localhost/seldon/seldon/leads/v2/models/leads-lgb/versions/v0.1.0/infer'

I find that the istio-proxy service prints 404 not found in the logs:

"POST /seldon/seldon/leads/v2/models/leads-lgb/versions/v0.1.0/infer HTTP/1.1" 404

even though I expect:

POST /v2/models/leads-lgb/versions/v0.1.0/infer HTTP/1.1

I am not sure what's happening. Does anyone have any idea? Thanks!

-- xm lian
cloud
istio
kubernetes
seldon

1 Answer

7/14/2021

I think your issue is incorrectly configured DestinationRule or service name coneintion.

DestinationRule:

These rules specify configuration for load balancing, connection pool size from the sidecar, and outlier detection settings to detect and evict unhealthy hosts from the load balancing pool.

Version specific policies can be specified by defining a named subset and overriding the settings specified at the service level.

Note: Policies specified for subsets will not take effect until a route rule explicitly sends traffic to this subset.

DestinationRule-Subset:

enter image description here

It seems to me that name should go first in the structure. At least I havent seen/met another examples. So in your case correct(at least I hope) DR is:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: leads-leads
  namespace: seldon
spec:
  host: leads-leads
  subsets:
  - name: leads
	labels:
      version: leads

However, if that wont help - I encourage you to check this self-resolved question:

Dont you have the same situation with named service port? I mean as per Explicit protocol selection you should add sufix in service name... name: <protocol>[-<suffix>]

-- Vit
Source: StackOverflow