Istio 虚拟服务运行不佳

问题描述

我发现我的虚拟服务的重写功能不能很好地工作。这是我的虚拟服务和 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。

DestinationRule

这些规则指定了负载平衡的配置、sidecar 中的连接池大小以及异常检测设置,以检测和从负载平衡池中驱逐不健康的主机。

可以通过定义命名子集并覆盖在服务级别指定的设置来指定特定于版本的策略。

注意:在路由规则明确将流量发送到该子集之前,为子集指定的策略不会生效。

DestinationRule-Subset

enter image description here

在我看来,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>]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...