虚拟服务

影响流量路由的配置。以下是一些在流量路由的上下文中定义的有用术语。

服务 应用程序行为的单位,绑定到服务注册表中的唯一名称。服务由在 Pod、容器、VM 等上运行的工作负载实例实现的多个网络端点组成。

服务版本(又称子集) - 在持续部署场景中,对于给定服务,可能存在运行应用程序二进制文件的不同变体的不同实例子集。这些变体不一定是不同的 API 版本。它们可能是对同一服务的迭代更改,部署在不同的环境中(生产、登台、开发等)。发生这种情况的常见场景包括 A/B 测试、金丝雀发布等。特定版本的選擇可以根据各种标准(标头、URL 等)或根据分配给每个版本的权重来决定。每个服务都有一个包含其所有实例的默认版本。

- 调用服务的下游客户端。

主机 - 客户端尝试连接到服务时使用的地址。

访问模型 - 应用程序仅访问目标服务(主机),而不知道各个服务版本(子集)。版本的选择由代理/边车决定,使应用程序代码能够与依赖服务的演变分离。

VirtualService 定义了一组流量路由规则,当主机被访问时应用这些规则。每个路由规则定义了特定协议流量的匹配条件。如果流量匹配,则将其发送到注册表中定义的命名目标服务(或其子集/版本)。

流量源也可以在路由规则中匹配。这允许针对特定客户端上下文自定义路由。

以下 Kubernetes 示例默认将所有 HTTP 流量路由到带有标签“version: v1”的 reviews 服务的 pod。此外,以 /wpcatalog/ 或 /consumercatalog/ 开头的 HTTP 请求将被重写为 /newcatalog 并发送到带有标签“version: v2”的 pod。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - name: "reviews-v2-routes"
    match:
    - uri:
        prefix: "/wpcatalog"
    - uri:
        prefix: "/consumercatalog"
    rewrite:
      uri: "/newcatalog"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
  - name: "reviews-v1-route"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1

路由目标的子集/版本通过对命名服务子集的引用来标识,该子集必须在相应的 DestinationRule 中声明。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: reviews-destination
spec:
  host: reviews.prod.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

虚拟服务

影响流量路由的配置。

字段类型描述必填
hostsstring[]

流量发送到的目标主机。可以是带有通配符前缀的 DNS 名称或 IP 地址。根据平台的不同,可以使用短名称代替 FQDN(即名称中没有点)。在这种情况下,主机的主机名将根据底层平台推导出来。

单个 VirtualService 可用于描述对应主机的所有流量属性,包括多个 HTTP 和 TCP 端口的属性。或者,可以使用多个 VirtualService 定义主机的流量属性,但存在一些注意事项。有关详细信息,请参阅 操作指南

Kubernetes 用户注意:使用短名称(例如“reviews”而不是“reviews.default.svc.cluster.local”)时,Istio 将根据规则的命名空间而不是服务来解释短名称。在“default”命名空间中包含主机“reviews”的规则将被解释为“reviews.default.svc.cluster.local”,无论与 reviews 服务关联的实际命名空间是什么。为了避免潜在的错误配置,建议始终使用完全限定域名而不是短名称。

hosts 字段适用于 HTTP 和 TCP 服务。网格内的服务(即在服务注册表中找到的服务)必须始终使用其字母数字名称引用。IP 地址仅允许用于通过 Gateway 定义的服务。

注意:对于代理 VirtualService,它必须为空。

gatewaysstring[]

应该应用这些路由的网关和边车的名称。其他命名空间中的网关可以通过 <gateway namespace>/<gateway name> 引用;指定没有命名空间限定符的网关与指定 VirtualService 的命名空间相同。单个 VirtualService 用于网格内的边车以及一个或多个网关。此字段施加的选择条件可以使用协议特定路由的匹配条件中的源字段覆盖。保留字 mesh 用于暗示网格中的所有边车。当此字段省略时,将使用默认网关(mesh),它将规则应用于网格中的所有边车。如果提供网关名称列表,则规则仅应用于网关。要将规则应用于网关和边车,请将 mesh 指定为网关名称之一。

httpHTTPRoute[]

HTTP 流量的路由规则的有序列表。HTTP 路由将应用于使用 HTTP/HTTP2/GRPC 协议的平台服务端口,使用 HTTP/HTTP2/GRPC/TLS 终止 HTTPS 协议的网关端口以及使用 HTTP/HTTP2/GRPC 协议的服务条目端口。将使用第一个与传入请求匹配的规则。

tlsTLSRoute[]

非终止 TLS 和 HTTPS 流量的路由规则的有序列表。路由通常使用 ClientHello 消息呈现的 SNI 值执行。TLS 路由将应用于名为“https-”、“tls-”的平台服务端口,使用 HTTPS/TLS 协议(即使用“直通”TLS 模式)的非终止网关端口以及使用 HTTPS/TLS 协议的服务条目端口。将使用第一个与传入请求匹配的规则。注意:没有关联虚拟服务的“https-”或“tls-”端口的流量将被视为不透明 TCP 流量。

tcpTCPRoute[]

不透明 TCP 流量的路由规则的有序列表。TCP 路由将应用于任何不是 HTTP 或 TLS 端口的端口。将使用第一个与传入请求匹配的规则。

exportTostring[]

将此虚拟服务导出的命名空间列表。导出虚拟服务允许边车和网关在其他命名空间中使用它。此功能提供了一种机制,使服务所有者和网格管理员能够跨命名空间边界控制虚拟服务的可见性。

如果未指定任何命名空间,则默认情况下将虚拟服务导出到所有命名空间。

值“.”是保留的,它定义了导出到与声明虚拟服务的相同命名空间。类似地,值“*”是保留的,它定义了导出到所有命名空间。

目标

Destination 指示在处理路由规则后将请求/连接发送到的可寻址网络服务。destination.host 应该明确地引用服务注册表中的服务。Istio 的服务注册表由平台的服务注册表(例如 Kubernetes 服务、Consul 服务)中找到的所有服务以及通过 ServiceEntry 资源声明的服务组成。

Kubernetes 用户注意:使用短名称(例如“reviews”而不是“reviews.default.svc.cluster.local”)时,Istio 将根据规则的命名空间而不是服务来解释短名称。在“default”命名空间中包含主机“reviews”的规则将被解释为“reviews.default.svc.cluster.local”,无论与 reviews 服务关联的实际命名空间是什么。为了避免潜在的错误配置,建议始终使用完全限定域名而不是短名称。

以下 Kubernetes 示例默认将所有流量路由到带有标签“version: v1”(即子集 v1)的 reviews 服务的 pod,以及一些到子集 v2,在 Kubernetes 环境中。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
  namespace: foo
spec:
  hosts:
  - reviews # interpreted as reviews.foo.svc.cluster.local
  http:
  - match:
    - uri:
        prefix: "/wpcatalog"
    - uri:
        prefix: "/consumercatalog"
    rewrite:
      uri: "/newcatalog"
    route:
    - destination:
        host: reviews # interpreted as reviews.foo.svc.cluster.local
        subset: v2
  - route:
    - destination:
        host: reviews # interpreted as reviews.foo.svc.cluster.local
        subset: v1

以及相关的 DestinationRule

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: reviews-destination
  namespace: foo
spec:
  host: reviews # interpreted as reviews.foo.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

以下 VirtualService 为 Kubernetes 中对 productpage.prod.svc.cluster.local 服务的所有调用设置了 5 秒的超时时间。请注意,此规则中没有定义子集。Istio 将从服务注册表中获取 productpage.prod.svc.cluster.local 服务的所有实例,并填充边车的负载均衡池。另外,请注意,此规则是在 istio-system 命名空间中设置的,但使用 productpage 服务的完全限定域名 productpage.prod.svc.cluster.local。因此,规则的命名空间不会影响解析 productpage 服务的名称。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: my-productpage-rule
  namespace: istio-system
spec:
  hosts:
  - productpage.prod.svc.cluster.local # ignores rule namespace
  http:
  - timeout: 5s
    route:
    - destination:
        host: productpage.prod.svc.cluster.local

要控制绑定到网格外部服务的流量的路由,必须首先使用 ServiceEntry 资源将外部服务添加到 Istio 的内部服务注册表。然后可以定义 VirtualService 来控制绑定到这些外部服务的流量。例如,以下规则定义了 wikipedia.org 的服务,并为 HTTP 请求设置了 5 秒的超时时间。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-wikipedia
spec:
  hosts:
  - wikipedia.org
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: example-http
    protocol: HTTP
  resolution: DNS
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: my-wiki-rule
spec:
  hosts:
  - wikipedia.org
  http:
  - timeout: 5s
    route:
    - destination:
        host: wikipedia.org
字段类型描述必填
hoststring

服务注册表中服务的名称。服务名称从平台的服务注册表(例如 Kubernetes 服务、Consul 服务等)以及 ServiceEntry 声明的主机中查找。转发到在两者中都找不到的目标的流量将被丢弃。

Kubernetes 用户注意:使用短名称(例如“reviews”而不是“reviews.default.svc.cluster.local”)时,Istio 将根据规则的命名空间而不是服务来解释短名称。在“default”命名空间中包含主机“reviews”的规则将被解释为“reviews.default.svc.cluster.local”,无论与 reviews 服务关联的实际命名空间是什么。为了避免潜在的错误配置,建议始终使用完全限定域名而不是短名称。

subsetstring

服务中子集的名称。仅适用于网格内的服务。子集必须在相应的 DestinationRule 中定义。

portPortSelector

指定要访问的主机上的端口。如果服务仅公开单个端口,则不需要显式选择端口。

HTTPRoute

描述路由 HTTP/1.1、HTTP2 和 gRPC 流量的匹配条件和操作。有关使用示例,请参阅 VirtualService。

字段类型描述必填
namestring

为调试目的分配给路由的名称。路由的名称将与匹配的名称连接起来,并在与该路由/匹配匹配的请求的访问日志中记录。

matchHTTPMatchRequest[]

要激活规则以满足的匹配条件。单个匹配块中的所有条件具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配规则。

routeHTTPRouteDestination[]

HTTP 规则可以返回 direct_response、重定向或转发(默认)流量。转发目标可以是服务的多个版本之一(请参阅文档开头的词汇表)。与服务版本关联的权重决定了它接收的流量比例。

redirectHTTPRedirect

HTTP 规则可以返回 direct_response、重定向或转发(默认)流量。如果规则中指定了流量直通选项,则将忽略路由/重定向。重定向原语可用于将 HTTP 301 重定向发送到不同的 URI 或 Authority。

directResponseHTTPDirectResponse

HTTP 规则可以返回 direct_response、重定向或转发(默认)流量。Direct Response 用于指定应发送给客户端的固定响应。

仅当 RouteRedirect 为空时才能设置它。

delegate委托

Delegate 用于指定可用于定义代理 HTTPRoute 的特定 VirtualService。

仅当 RouteRedirect 为空时才能设置它,并且代理 VirtualService 的路由规则将与当前的路由规则合并。

注意:

  1. 仅支持一级委托。
  2. 代理的 HTTPMatchRequest 必须是根的严格子集,否则存在冲突,HTTPRoute 不会生效。
rewriteHTTPRewrite

重写 HTTP URI 和 Authority 标头。Rewrite 不能与 Redirect 原语一起使用。Rewrite 将在转发之前执行。

timeoutDuration

HTTP 请求的超时时间,默认情况下禁用。

retriesHTTPRetry

HTTP 请求的重试策略。

注意:如果未指定,默认的集群级重试策略为

attempts: 2
retryOn: "connect-failure,refused-stream,unavailable,cancelled,503"

这可以在 Mesh Config defaultHttpRetryPolicy 中自定义。

faultHTTPFaultInjection

在客户端对 HTTP 流量应用的故障注入策略。请注意,在客户端启用故障时,将不会启用超时或重试。

mirror目标

除了将请求转发到目标目的地外,还将 HTTP 流量镜像到另一个目的地。镜像流量是尽力而为的,边车/网关不会等待镜像集群响应,然后才返回来自原始目的地的响应。将为镜像目的地生成统计信息。

mirrorsHTTPMirrorPolicy[]

指定除了原始目的地以外的目的地,以镜像 HTTP 流量。镜像流量是尽力而为的,边车/网关不会等待镜像目的地响应,然后才返回来自原始目的地的响应。将为镜像目的地生成统计信息。

mirrorPercentagePercent

mirror 字段镜像的流量百分比。如果此字段不存在,则所有流量(100%)将被镜像。最大值为 100。

corsPolicyCorsPolicy

跨源资源共享策略 (CORS)。有关跨源资源共享的更多详细信息,请参阅 CORS

headers标头

标头操作规则

委托

描述代理 VirtualService。以下路由规则通过名为 productpage 的代理 VirtualService 将流量转发到 /productpage,通过名为 reviews 的代理 VirtualService 将流量转发到 /reviews

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "bookinfo.com"
  gateways:
  - mygateway
  http:
  - match:
    - uri:
        prefix: "/productpage"
    delegate:
       name: productpage
       namespace: nsA
  - match:
    - uri:
        prefix: "/reviews"
    delegate:
        name: reviews
        namespace: nsB
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: productpage
  namespace: nsA
spec:
  http:
  - match:
     - uri:
        prefix: "/productpage/v1/"
    route:
    - destination:
        host: productpage-v1.nsA.svc.cluster.local
  - route:
    - destination:
        host: productpage.nsA.svc.cluster.local
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
  namespace: nsB
spec:
  http:
  - route:
    - destination:
        host: reviews.nsB.svc.cluster.local
字段类型描述必填
namestring

Name 指定代理 VirtualService 的名称。

命名空间string

命名空间指定委托虚拟服务的命名空间。默认情况下,它与根命名空间相同。

标头

当 Envoy 将请求转发到目标服务或从目标服务转发响应时,可以操作消息头。可以为特定路由目标或所有目标指定头操作规则。以下虚拟服务为路由到任何 reviews 服务目标的请求添加了一个值为 true 的 test 头。它还删除了 foo 响应头,但仅从来自 reviews 服务的 v1 子集(版本)的响应中删除。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - headers:
      request:
        set:
          test: "true"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      headers:
        response:
          remove:
          - foo
      weight: 75
字段类型描述必填
请求HeaderOperations

在将请求转发到目标服务之前应用的头操作规则

响应HeaderOperations

在将响应返回给调用者之前应用的头操作规则

TLSRoute

描述了匹配条件和操作,用于路由未终止的 TLS 流量(TLS/HTTPS)。以下路由规则将到达名为 mygateway 的网关 443 端口的未终止 TLS 流量转发到网格中的内部服务,具体取决于 SNI 值。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-sni
spec:
  hosts:
  - "*.bookinfo.com"
  gateways:
  - mygateway
  tls:
  - match:
    - port: 443
      sniHosts:
      - login.bookinfo.com
    route:
    - destination:
        host: login.prod.svc.cluster.local
  - match:
    - port: 443
      sniHosts:
      - reviews.bookinfo.com
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
字段类型描述必填
matchTLSMatchAttributes[]

要激活规则以满足的匹配条件。单个匹配块中的所有条件具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配规则。

routeRouteDestination[]

连接应转发到的目标。

TCPRoute

描述了匹配条件和操作,用于路由 TCP 流量。以下路由规则将到达 mongo.prod.svc.cluster.local 的 27017 端口的流量转发到另一个 Mongo 服务器的 5555 端口。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-mongo
spec:
  hosts:
  - mongo.prod.svc.cluster.local
  tcp:
  - match:
    - port: 27017
    route:
    - destination:
        host: mongo.backup.svc.cluster.local
        port:
          number: 5555
字段类型描述必填
matchL4MatchAttributes[]

要激活规则以满足的匹配条件。单个匹配块中的所有条件具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配规则。

routeRouteDestination[]

连接应转发到的目标。

HTTPMatchRequest

HttpMatchRequest 指定了一组必须满足的条件,以便规则应用于 HTTP 请求。例如,以下内容将规则限制为仅匹配 URL 路径以 /ratings/v2/ 开头且请求包含值为 jason 的自定义 end-user 头的请求。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - headers:
        end-user:
          exact: jason
      uri:
        prefix: "/ratings/v2/"
      ignoreUriCase: true
    route:
    - destination:
        host: ratings.prod.svc.cluster.local

HTTPMatchRequest 不能为空。注意:

  1. 如果根虚拟服务通过正则表达式匹配了任何属性(路径、头等),委托虚拟服务不应该在同一属性上进行任何其他匹配。
  2. 如果委托虚拟服务通过正则表达式匹配了任何属性(路径、头等),根虚拟服务不应该在同一属性上进行任何其他匹配。
字段类型描述必填
namestring

分配给匹配的名称。匹配的名称将与父路由的名称连接起来,并在访问日志中记录与该路由匹配的请求。

uriStringMatch

要匹配的值区分大小写,格式如下

注意:可以通过 ignoreUriCase 标志启用不区分大小写的匹配。

方案StringMatch

URI 方案值区分大小写,格式如下

方法StringMatch

HTTP 方法值区分大小写,格式如下

权限StringMatch

HTTP 权限值区分大小写,格式如下

headersmap<string, StringMatch>

头键必须是小写,并使用连字符作为分隔符,例如 x-request-id

头值区分大小写,格式如下

如果值为空并且只指定了头的名称,则检查头的存在性。要提供空值,请使用 {},例如

 - match:
   - headers:
       myheader: {}

注意:urischememethodauthority 将被忽略。

portuint32

指定正在寻址的主机上的端口。许多服务只公开一个端口或用它们支持的协议标记端口,在这些情况下,不需要显式选择端口。

源标签map<string, string>

一个或多个标签,用于将规则的适用性限制在具有给定标签的源(客户端)工作负载。如果 VirtualService 在顶层的 gateways 字段中指定了一组网关,则它必须包含保留的网关 mesh 才能使此字段适用。

gatewaysstring[]

应应用规则的网关名称。VirtualService 的顶层 gateways 字段中的网关名称(如果有)将被覆盖。网关匹配独立于源标签。

queryParamsmap<string, StringMatch>

用于匹配的查询参数。

例如

  • 对于像 “?key=true” 这样的查询参数,map 键将是 “key”,字符串匹配可以定义为 exact: "true"

  • 对于像 “?key” 这样的查询参数,map 键将是 “key”,字符串匹配可以定义为 exact: ""

  • 对于像 “?key=abc” 或 “?key=abx” 这样的查询参数,map 键将是 “key”,字符串匹配可以定义为 prefix: "ab"

  • 对于像 “?key=123” 这样的查询参数,map 键将是 “key”,字符串匹配可以定义为 regex: "\d+$"。请注意,此配置将只匹配像 “123” 这样的值,而不是 “a123” 或 “123a”。

ignoreUriCasebool

指定 URI 匹配是否应该不区分大小写的标志。

注意:仅在 exactprefix URI 匹配的情况下忽略大小写。

withoutHeadersmap<string, StringMatch>

withoutHeader 与 header 语法相同,但含义相反。如果 header 在 withoutHeader 中通过匹配规则匹配,则流量将不再匹配。

源命名空间string

源命名空间,用于将规则的适用性限制在该命名空间中的工作负载。如果 VirtualService 在顶层的 gateways 字段中指定了一组网关,则它必须包含保留的网关 mesh 才能使此字段适用。

statPrefixstring

在为该路由发出统计信息时使用的可读前缀。统计信息使用前缀 route.<stat_prefix> 生成。这应该为希望获得 “每路由” 统计信息的非常重要的路由设置。此前缀仅用于代理级统计信息(envoy_),而不是服务级统计信息(istio_)。有关配置此项时生成的统计信息,请参考 https://envoy.k8s.ac.cn/docs/envoy/latest/api-v3/config/route/v3/route_components.proto#envoy-v3-api-field-config-route-v3-route-stat-prefix

HTTPRouteDestination

每个路由规则都与一个或多个服务版本相关联(请参阅文档开头的词汇表)。与版本关联的权重决定了它接收的流量比例。例如,以下规则将把 “reviews” 服务的 25% 流量路由到具有 “v2” 标签的实例,其余流量(即 75%)路由到 “v1”。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      weight: 75

以及相关的 DestinationRule

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: reviews-destination
spec:
  host: reviews.prod.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

流量也可以在两个完全不同的服务之间进行拆分,而无需定义新的子集。例如,以下规则将 25% 的 reviews.com 流量转发到 dev.reviews.com

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route-two-domains
spec:
  hosts:
  - reviews.com
  http:
  - route:
    - destination:
        host: dev.reviews.com
      weight: 25
    - destination:
        host: reviews.com
      weight: 75
字段类型描述必填
目的地目标

Destination 唯一标识应将请求/连接转发到的服务实例。

权重int32

权重指定转发到目的地的流量的相对比例。目的地将接收 weight/(所有权重之和) 请求。如果规则中只有一个目的地,它将接收所有流量。否则,如果权重为 0,则目的地将不会接收任何流量。

headers标头

标头操作规则

RouteDestination

L4 路由规则加权目的地。

字段类型描述必填
目的地目标

Destination 唯一标识应将请求/连接转发到的服务实例。

权重int32

权重指定转发到目的地的流量的相对比例。目的地将接收 weight/(所有权重之和) 请求。如果规则中只有一个目的地,它将接收所有流量。否则,如果权重为 0,则目的地将不会接收任何流量。

L4MatchAttributes

L4 连接匹配属性。请注意,L4 连接匹配支持不完整。

字段类型描述必填
destinationSubnetsstring[]

目的地的 IPv4 或 IPv6 ip 地址,带可选子网。例如,a.b.c.d/xx 格式或仅 a.b.c.d。

portuint32

指定正在寻址的主机上的端口。许多服务只公开一个端口或用它们支持的协议标记端口,在这些情况下,不需要显式选择端口。

源标签map<string, string>

一个或多个标签,用于将规则的适用性限制在具有给定标签的工作负载。如果 VirtualService 在顶层的 gateways 字段中指定了一组网关,则它应该包含保留的网关 mesh 才能使此字段适用。

gatewaysstring[]

应应用规则的网关名称。VirtualService 的顶层 gateways 字段中的网关名称(如果有)将被覆盖。网关匹配独立于源标签。

源命名空间string

源命名空间,用于将规则的适用性限制在该命名空间中的工作负载。如果 VirtualService 在顶层的 gateways 字段中指定了一组网关,则它必须包含保留的网关 mesh 才能使此字段适用。

TLSMatchAttributes

TLS 连接匹配属性。

字段类型描述必填
sniHostsstring[]

要匹配的 SNI(服务器名称指示器)。通配符前缀可以在 SNI 值中使用,例如,*.com 将匹配 foo.example.com 以及 example.com。SNI 值必须是相应虚拟服务的 host 的子集(即,位于域内)。

destinationSubnetsstring[]

目的地的 IPv4 或 IPv6 ip 地址,带可选子网。例如,a.b.c.d/xx 格式或仅 a.b.c.d。

portuint32

指定正在寻址的主机上的端口。许多服务只公开一个端口或用它们支持的协议标记端口,在这些情况下,不需要显式选择端口。

源标签map<string, string>

一个或多个标签,用于将规则的适用性限制在具有给定标签的工作负载。如果 VirtualService 在顶层的 gateways 字段中指定了一组网关,则它应该包含保留的网关 mesh 才能使此字段适用。

gatewaysstring[]

应应用规则的网关名称。VirtualService 的顶层 gateways 字段中的网关名称(如果有)将被覆盖。网关匹配独立于源标签。

源命名空间string

源命名空间,用于将规则的适用性限制在该命名空间中的工作负载。如果 VirtualService 在顶层的 gateways 字段中指定了一组网关,则它必须包含保留的网关 mesh 才能使此字段适用。

HTTPRedirect

HTTPRedirect 可用于向调用者发送 301 重定向响应,其中响应中的 Authority/Host 和 URI 可以用指定的值交换。例如,以下规则将 ratings 服务上的 /v1/getProductRatings API 的请求重定向到 bookratings 服务提供的 /v1/bookRatings。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    redirect:
      uri: /v1/bookRatings
      authority: newratings.default.svc.cluster.local
  ...
字段类型描述必填
uristring

在重定向时,用此值覆盖 URL 的 Path 部分。请注意,整个路径将被替换,而不管请求 URI 是作为精确路径还是前缀匹配。

权限string

在重定向时,用此值覆盖 URL 的 Authority/Host 部分。

portuint32 (oneof)

在重定向时,用此值覆盖 URL 的端口部分。

derivePortRedirectPortSelection (oneof)

在重定向时,动态设置端口

  • FROM_PROTOCOL_DEFAULT:自动设置为 HTTP 的 80 和 HTTPS 的 443。
  • FROM_REQUEST_PORT:自动使用请求的端口。
方案string

在重定向时,用此值覆盖 URL 的方案部分。例如,httphttps。如果未设置,将使用原始方案。如果 derivePort 设置为 FROM_PROTOCOL_DEFAULT,这也将影响使用的端口

redirectCodeuint32

在重定向时,指定重定向响应中使用的 HTTP 状态代码。默认响应代码是 MOVED_PERMANENTLY (301)。

HTTPDirectResponse

HTTPDirectResponse 可用于向客户端发送固定响应。例如,以下规则为 /v1/getProductRatings API 的请求返回一个固定的 503 状态,并附带正文。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    directResponse:
      status: 503
      body:
        string: "unknown error"
  ...

也可以指定二进制响应正文。这对于非文本协议(例如 gRPC)非常有用。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    directResponse:
      status: 503
      body:
        bytes: "dW5rbm93biBlcnJvcg==" # "unknown error" in base64
  ...

最好在 HTTPRoute 和 direct_response 中添加头,例如指定返回的 Content-Type。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    directResponse:
      status: 503
      body:
        string: "{\"error\": \"unknown error\"}"
    headers:
      response:
        set:
          content-type: "text/plain"
  ...
字段类型描述必填
状态uint32

指定要返回的 HTTP 响应状态。

正文HTTPBody

指定响应正文的内容。如果省略此设置,则生成的响应中不包含正文。

HTTPBody

字段类型描述必填
stringstring (oneof)

响应正文作为字符串

字节字节 (oneof)

响应正文作为 base64 编码的字节。

HTTPRewrite

HTTPRewrite 可用于在将请求转发到目标之前重写 HTTP 请求的特定部分。Rewrite 原语只能与 HTTPRouteDestination 一起使用。以下示例演示了如何在进行实际 API 调用之前重写对 ratings 服务的 api 调用(/ratings)的 URL 前缀。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        prefix: /ratings
    rewrite:
      uri: /v1/bookRatings
    route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
字段类型描述必填
uristring

用此值重写 URI 的路径(或前缀)部分。如果原始 URI 是基于前缀匹配的,则此字段中提供的值将替换相应的匹配前缀。

权限string

用此值重写 Authority/Host 头。

uriRegexRewriteRegexRewrite

使用指定的正则表达式重写 URI 的路径部分。

RegexRewrite

字段类型描述必填
matchstring

基于 RE2 风格正则表达式的匹配.

rewritestring

用于替换原始 URI 匹配部分的字符串。模式中的捕获组可以在新的 URI 中引用。示例

示例 1:使用捕获组重写 路径模式“/service/update/v1/api” 匹配“^/service/([^/]+)(/.*)$” 重写字符串“/customprefix/\2/\1” 将转换为“/customprefix/v1/api/update”。

示例 2:不区分大小写的重写 路径模式“/aaa/XxX/bbb” 匹配“(?i)/xxx/” 重写字符串“/yyy/” 将进行不区分大小写的匹配并将路径转换为“/aaa/yyy/bbb”。

StringMatch

描述如何在 HTTP 头文件中匹配给定的字符串。exactprefix 匹配区分大小写。regex 匹配支持不区分大小写的匹配。

字段类型描述必填
exactstring (oneof)

精确字符串匹配

prefixstring (oneof)

基于前缀的匹配

regexstring (oneof)

基于 RE2 风格正则表达式的匹配.

示例:(?i)^aaa$ 可以用于不区分大小写地匹配由三个字母 "a" 组成的字符串。

HTTPRetry

描述在 HTTP 请求失败时使用的重试策略。例如,以下规则将调用 ratings:v1 服务时的最大重试次数设置为 3,每次重试尝试的超时时间为 2 秒。如果发生连接失败、拒绝流或上游服务器响应服务不可用 (503),则将尝试重试。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: gateway-error,connect-failure,refused-stream
字段类型描述必填
attemptsint32

允许对给定请求进行的重试次数。重试之间的间隔将自动确定 (25 毫秒+)。当请求timeoutHTTP 路由per_try_timeout 配置时,实际尝试的重试次数还取决于指定的请求 timeoutper_try_timeout 值。必须 >= 0。如果为 0,则将禁用重试。最大可能的请求次数为 1 + attempts

perTryTimeoutDuration

对给定请求的每次尝试的超时时间,包括初始调用和任何重试。格式:1h/1m/1s/1ms。必须 >= 1 毫秒。默认值为与请求 timeoutHTTP 路由 相同的值,这意味着没有超时。

retryOnstring

指定发生重试的条件。可以使用以“,”分隔的列表指定一个或多个策略。有关更多详细信息,请参阅 重试策略gRPC 重试策略

除了上面指定的策略之外,还可以传递 HTTP 状态码列表,例如 retryOn: "503,reset"。请注意,这些状态码是指从目标接收的实际响应。例如,如果连接重置,Istio 将将其转换为 503 以进行响应。但是,目标并未返回 503 错误,因此这将不匹配 "503"(但是,它将匹配 "reset")。

如果未指定,则默认为 connect-failure,refused-stream,unavailable,cancelled,503

retryRemoteLocalitiesBoolValue

标志,用于指定重试是否应重试到其他区域。有关更多详细信息,请参阅 重试插件配置

CorsPolicy

描述给定服务的跨域资源共享 (CORS) 策略。有关跨域资源共享的更多详细信息,请参阅 CORS。例如,以下规则将跨域请求限制为使用 HTTP POST/GET 从 example.com 域发起的请求,并将 Access-Control-Allow-Credentials 标头设置为 false。此外,它仅公开 X-Foo-bar 标头并设置 1 天的过期时间。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
    corsPolicy:
      allowOrigins:
      - exact: https://example.com
      allowMethods:
      - POST
      - GET
      allowCredentials: false
      allowHeaders:
      - X-Foo-Bar
      maxAge: "24h"
字段类型描述必填
allowOriginsStringMatch[]

与允许的来源匹配的字符串模式。如果任何字符串匹配器匹配,则允许来源。如果找到匹配项,则传出的 Access-Control-Allow-Origin 将设置为客户端提供的来源。

allowMethodsstring[]

允许访问资源的 HTTP 方法列表。内容将被序列化到 Access-Control-Allow-Methods 标头中。

allowHeadersstring[]

请求资源时可以使用 HTTP 标头列表。序列化到 Access-Control-Allow-Headers 标头中。

exposeHeadersstring[]

浏览器允许访问的 HTTP 标头列表。序列化到 Access-Control-Expose-Headers 标头中。

maxAgeDuration

指定预检请求的结果可以缓存多长时间。转换为 Access-Control-Max-Age 标头。

allowCredentialsBoolValue

指示调用者是否允许使用凭据发送实际请求(而不是预检请求)。转换为 Access-Control-Allow-Credentials 标头。

unmatchedPreflightsUnmatchedPreflights

指示是否应将不匹配配置的允许来源的预检请求转发到上游。默认情况下是转发到上游。

HTTPFaultInjection

HTTPFaultInjection 可用于指定一个或多个故障,在将 HTTP 请求转发到路由中指定的目的地时注入这些故障。故障规范是 VirtualService 规则的一部分。故障包括中止来自下游服务的 Http 请求,和/或延迟请求的代理。故障规则必须具有延迟或中止或两者兼而有之。

注意:延迟和中止故障是独立的,即使同时指定了它们。

字段类型描述必填
delayDelay

在转发之前延迟请求,模拟各种故障,例如网络问题、上游服务过载等。

abortAbort

中止 Http 请求尝试并将错误代码返回到下游服务,给人一种上游服务有故障的印象。

HTTPMirrorPolicy

HTTPMirrorPolicy 可用于指定除了原始目的地之外的镜像 HTTP 流量的目的地。镜像流量是尽力而为的,其中 sidecar/gateway 不会等待镜像目的地响应,然后才返回来自原始目的地的响应。将为镜像目的地生成统计信息。

字段类型描述必填
目的地目标

Destination 指定镜像操作的目标。

percentagePercent

destination 字段镜像的流量百分比。如果此字段不存在,则将镜像所有流量 (100%)。最大值为 100。

PortSelector

PortSelector 指定要用于匹配或选择最终路由的端口号。

字段类型描述必填
numberuint32

有效的端口号

Percent

Percent 指定 0.0 到 100.0 范围内的百分比。

字段类型描述必填
valuedouble

Headers.HeaderOperations

HeaderOperations 描述要应用的标头操作

字段类型描述必填
setmap<string, string>

用给定值覆盖由键指定的标头

addmap<string, string>

将给定值追加到由键指定的标头(将创建一个以逗号分隔的值列表)

removestring[]

删除指定的标头

HTTPFaultInjection.Delay

延迟规范用于将延迟注入请求转发路径。以下示例将在来自具有标签 env: prod 的所有 pod 的“reviews”服务的“v1”版本的每 1000 个请求中引入一个 5 秒的延迟

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - match:
    - sourceLabels:
        env: prod
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
    fault:
      delay:
        percentage:
          value: 0.1
        fixedDelay: 5s

fixedDelay 字段用于指示延迟量(以秒为单位)。可选的 percentage 字段可用于仅延迟一定百分比的请求。如果未指定,则不会延迟任何请求。

字段类型描述必填
fixedDelayDuration (oneof)

在转发请求之前添加固定延迟。格式:1h/1m/1s/1ms。必须 >= 1 毫秒。

percentagePercent

将注入延迟的请求的百分比。如果未指定,则不会延迟任何请求。

percentint32

将注入延迟的请求的百分比 (0-100)。使用整数 percent 值已弃用。请改用双精度 percentage 字段。

HTTPFaultInjection.Abort

中止规范用于使用预先指定的错误代码过早中止请求。以下示例将在每 1000 个对“ratings”服务“v1”的请求中返回 HTTP 400 错误代码。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
    fault:
      abort:
        percentage:
          value: 0.1
        httpStatus: 400

httpStatus 字段用于指示要返回给调用者的 HTTP 状态代码。可选的 percentage 字段可用于仅中止一定百分比的请求。如果未指定,则不会中止任何请求。

字段类型描述必填
httpStatusint32 (oneof)

用于中止 Http 请求的 HTTP 状态代码。

grpcStatusstring (oneof)

用于中止请求的 GRPC 状态代码。支持的代码记录在 https://github.com/grpc/grpc/blob/master/doc/statuscodes.md 注意:如果要返回状态“Unavailable”,则应将代码指定为 UNAVAILABLE(全部大写),而不是 14

percentagePercent

使用提供的错误代码中止的请求的百分比。如果未指定,则不会中止任何请求。

google.protobuf.UInt32Value

uint32 的包装消息。

UInt32Value 的 JSON 表示形式为 JSON 数字。

字段类型描述必填
valueuint32

uint32 值。

HTTPRedirect.RedirectPortSelection

Name描述
FROM_PROTOCOL_DEFAULT
FROM_REQUEST_PORT

CorsPolicy.UnmatchedPreflights

Name描述
UNSPECIFIED

默认为 FORWARD

FORWARD

不匹配配置的允许来源的预检请求将被转发到上游。

IGNORE

不匹配配置的允许来源的预检请求将不会被转发到上游。

这些信息对您有帮助吗?
您对改进有什么建议吗?

感谢您的反馈!