问题描述
我发现我的虚拟服务的重写功能不能很好地工作。这是我的虚拟服务和 DestinationRule yaml 文件:
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
当我发送一个http请求时:
curl --location --request POST 'http://localhost/seldon/seldon/leads/v2/models/leads-lgb/versions/v0.1.0/infer'
我发现 istio-proxy 服务打印了 404 not found in the logs:
"POST /seldon/seldon/leads/v2/models/leads-lgb/versions/v0.1.0/infer HTTP/1.1" 404
尽管我期望:
POST /v2/models/leads-lgb/versions/v0.1.0/infer HTTP/1.1
我不确定发生了什么。有人有什么主意吗?谢谢!
解决方法
我认为您的问题配置错误 DestinationRule
或服务名称 conintion。
这些规则指定了负载平衡的配置、sidecar 中的连接池大小以及异常检测设置,以检测和从负载平衡池中驱逐不健康的主机。
可以通过定义命名子集并覆盖在服务级别指定的设置来指定特定于版本的策略。
注意:在路由规则明确将流量发送到该子集之前,为子集指定的策略不会生效。
在我看来,name
应该在结构中排在第一位。至少我还没有看到/遇到其他例子。
所以在你的情况下是正确的(至少我希望)DR 是:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: leads-leads
namespace: seldon
spec:
host: leads-leads
subsets:
- name: leads
labels:
version: leads
但是,如果这无济于事 - 我建议您检查 this self-resolved question:
你是不是也有命名服务端口的情况?我的意思是根据 Explicit protocol selection 您应该在服务名称中添加后缀...
name: <protocol>[-<suffix>]