VirtualService

VirtualService

影响流量路由的配置。以下是一些术语,可在流量路由的上下文中进行定义。

Service 通常是绑定到服务注册表中唯一名称的应用程序行为的单元。服务包含多个网络 Endpoints,这些 EndPointsPod、容器、VM 等上运行的工作负载实例实现。

Service Version 即服务的版本。每个服务都有一个包含其所有实例的默认版本。在连续部署中,对于给定的服务,可能存在运行应用程序二进制文件的不同变体的实例的不同子集。这些变体不一定是不同的 API 版本,它们可能是对同一服务的迭代更改,部署在不同的环境(产品,阶段,开发等)中。发生这种情况的常见方案包括 A/B 测试、金丝雀发布等,可以根据各种标准(headersURL 等)和 / 或通过分配给每个版本的权重来决定特定版本的选择。

Source      资源,即调用 Service 的下游客户端

Host        客户端尝试连接 Service 时使用的地址

Access model        应用程序仅寻址目标服务(主机),而无需了解各个服务版本(子集)。版本的实际选择由 proxy/sidecar 决定,从而使应用程序代码能够与依赖服务解耦

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

在路由规则中也可以匹配流量的来源,允许为特定的客户端上下文自定义路由。

下面的示例中,默认情况下将所有 HTTP 流量路由到带有标签 version: v1reviews 服务的 Pod。此外,路径以 /wpcatalog//consumercatalog/ 开头的 HTTP 请求将被重写为 /newcatalog,并发送到标签为 version: v2reviews 服务的 Pod

apiVersion: networking.istio.io/v1alpha3
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

路由目标的 subset/version 是通过引用给定服务子集来标识的,该服务的 subset/version 必须在相应的 DestinationRule 中声明。

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

CorsPolicy

描述给定服务的跨域资源共享(CORS)策略。

下面的示例中,将跨源请求限制为来自 example.com 使用 HTTP POST/GET 的请求,并将 Access-Control-Allow-Credentials header 设置 为 false。此外,它仅暴露 X-Foo-bar header,并将有效期设置为1天。

apiVersion: networking.istio.io/v1alpha3
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:
      allowOrigin:
      - example.com
      allowMethods:
      - POST
      - GET
      allowCredentials: false
      allowHeaders:
      - X-Foo-Bar
      maxAge: "24h"
字段 类型 描述 是否必需
allowOrigin string[] 允许执行 CORS 请求的来源列表。内容会被序列化到 Access-Control-Allow-Origin header 中。通配符 * 允许所有来源
allowMethods string[] 允许访问资源的 HTTP 方法列表。内容会被序列化到 Access-Control-Allow-Methods header
allowHeaders string[] 请求资源时可以使用的 HTTP header 列表。会序列化为 Access-Control-Allow-Headers header
exposeHeaders string[] 允许浏览器访问的 HTTP header 的白名单列表。会序列化为 Access-Control-Expose-Headers header
maxAge Duration 指定可以将预检请求的结果缓存多长时间。会转换为 Access-Control-Max-Age header
allowCredentials BoolValue 指定是否允许调用者使用凭据发送实际请求(而不是预检请求)。会转换为 Access-Control-Allow-Credentials header

Destination

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

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

下面的 Kubernetes 示例中,默认将所有流量路由到版本 v1reviews 服务的 Pod,以及将某些流量路由到版本 v2reviews 服务的 Pod

扫描二维码关注公众号,回复: 13385880 查看本文章
apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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 服务的所有实例,并填充 Sidecar 的负载均衡池。

另外,该规则是在 istio-system 命名空间中设置的,但是使用了 productpage 服务的完全限定域名 productpage.prod.svc.cluster.local。因此,规则的命名空间对解析 productpage 服务的名称没有影响。

apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
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/v1alpha3
kind: VirtualService
metadata:
  name: my-wiki-rule
spec:
  hosts:
  - wikipedia.org
  http:
  - timeout: 5s
    route:
    - destination:
        host: wikipedia.org
字段 类型 描述 是否必需
host string 服务注册表中服务的名称。从平台的服务注册表(如 Kubernetes servicesConsul services)以及 ServiceEntry 声明的主机中查找服务名称。转发到两个目的地中都未找到的流量将被丢弃
subset string 服务中子集的名称,仅适用于网格内的服务。该子集必须在相应的 DestinationRule 中定义
port PortSelector 指定要寻址的 host 上的端口。如果服务仅公开单个端口,则不需要显式选择端口

HTTPFaultInjection

HTTPFaultInjection 可用于指定将 HTTP 请求转发到路由中指定的目标时要注入的一个或多个故障。故障规则是 VirtualService 规则的一部分。

故障包括中止来自下游服务的 HTTP 请求和延迟请求的代理。一个故障规则必须有延迟或中止,或两者都有。

注意:即使同时指定了延迟和异常中断故障,它们也是彼此独立的。

字段 类型 描述 是否必需
delay Delay 在转发之前延迟请求,模拟各种故障,如网络问题、上游服务过载等
abort Abort 中止 HTTP 请求尝试并将错误代码返回给下游服务,模拟上游服务有故障

HTTPFaultInjection.Abort

中止规则用于提前中止带有预先指定的错误代码的请求。下面的示例中,将向 v1 版本的 reviews 服务,每 1000 个请求中返回 1 个 HTTP 400 错误代码。

apiVersion: networking.istio.io/v1alpha3
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                # 0.1%
        httpStatus: 400

httpStatus 字段用于指定返回给调用者的 HTTP 状态码;可选的 percentage 字段只能用于中止一定百分比的请求,如果未指定,则中止所有请求。

字段 类型 描述 是否必需
httpStatus int32 (oneof) 用于中止 HTTP 请求的 HTTP 状态码
percentage Percent 通过提供的错误代码去中止请求的百分比
percent int32 使用提供的错误代码(0-100)中止请求的百分比。不建议使用 percent,建议使用 percentage

HTTPFaultInjection.Delay

延迟规则用于将延迟注入请求转发路径。下面的示例中,将对带有标签 env: prodv1 版本的 reviews 服务的所有 Pod,在每 1000 个请求中对 1 个请求引入 5 秒的延迟。

apiVersion: networking.istio.io/v1alpha3
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 字段只能用于延迟一定百分比的请求,如果未指定,则延迟所有请求。

字段 类型 描述 是否必需
httpStatus Duration (oneof) 在转发请求之前添加固定的延迟。格式:1h1m1s1ms。必须 >= 1ms
percentage Percent 通过提供的错误代码去延迟请求的百分比
percent int32 使用提供的错误代码(0-100)延迟请求的百分比。不建议使用 percent,建议使用 percentage

HTTPMatchRequest

HttpMatchRequest 指定一组要满足的条件,以便将该规则应用于HTTP请求。下面的示例中,将规则限制为仅匹配 URL 路径以 /ratings/v2/ 开头,请求包含自定义的 header end-user 且值是 jason 的请求。

apiVersion: networking.istio.io/v1alpha3
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 字段不能为空。

字段 类型 描述 是否必需
name string 分配给匹配项的名称。匹配的名称将与父路由的名称连接,并将被记录在访问日志中,用于匹配该路由的请求
uri StringMatch 区分大小写匹配 uri,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配。注意:不区分大小写的匹配可以通过 ignore_uri_case 启用
scheme StringMatch 区分大小写匹配 schema,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配
method StringMatch 区分大小写匹配 HTTP Method,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配
authority StringMatch 区分大小写匹配 HTTP Authority,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配
headers map<string, StringMatch> headers 的 key 必须是小写字母,并使用 - 作为分隔符,如 x-request-idheaders 的 value 区分大小写,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配。注意:key 为 urischememethodauthority 时将被忽略
port uint32 指定要寻址的 host 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口
sourceLabels map<string, StringMatch> 一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 VirtualService 有一个顶部指定的 gateway 列表,它必须包含保留的 gateway mesh 以使此字段可用
queryParams map<string, StringMatch> 查询参数以进行匹配。例如:对于 ?key=true 这样的查询参数,映射键将为 key,字符串匹配项可定义为 exact: "true";对于 ?key 这样的查询参数,映射键将为 key,字符串匹配项可定义为 exact: "";对于 ?key=123 这样的查询参数,映射键将为 key,字符串匹配项可定义为 regex: "\d+$",此配置将仅匹配 123 这样的值,而不匹配 a123123a 这样的值。注意:目前 prefix 不支持匹配
ignoreUriCase bool 指定 uri 匹配是否不区分大小写。注意:仅当 uri 匹配是 exactprefix 时,才会忽略大小写

HTTPRedirect

HTTPRedirect 可用于向调用者发送 301 重定向响应,在此响应中的 Authority/Host 和 uri 可与指定的值交换。下面的示例中,将 ratings 服务上对 /v1/getProductRatings API 的请求重定向到 bookratings 服务提供的 /v1/bookRatings

apiVersion: networking.istio.io/v1alpha3
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
  ...
字段 类型 描述 是否必需
uri string redirect 上,使用此值覆盖 URL 的 Path 部分。无论将请求 uri 匹配为 exact 还是 prefix,都将替换整个路径
authority string redirect 上,使用此值覆盖 URL 的 Authority/Host 部分
redirectCode uint32 redirect 上,指定要在重定向响应中使用的 HTTP 状态码。默认响应码为 MOVED_PERMANENTLY (301)

HTTPRetry

描述当 HTTP 请求失败时使用的重试策略。下面的示例中,在调用 Ratings:v1 服务时将最大重试次数设置为 3,每次重试尝试超时为 2s。

apiVersion: networking.istio.io/v1alpha3
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
字段 类型 描述 是否必需
attempts int32 给定请求的重试次数。重试之间的时间间隔将自动确定(25ms 以上),尝试重试的实际次数取决于 httpReqTimeout
perTryTimeout Duration 给定请求的每次重试尝试超时。格式:1h1m1s1ms。必须 >= 1ms
retryOn string 指定发生重试的条件。可以使用 , 分隔列表指定一个或多个策略

HTTPRewrite

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

apiVersion: networking.istio.io/v1alpha3
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
字段 类型 描述 是否必需
uri string 使用此值重写 uri 的路径(或前缀)部分。如果原始 uri 是根据 prefix 匹配的,则此字段中提供的值将替换相应的匹配前缀
authority string 使用此值重写 Authority/Host header

HTTPRoute

描述用于路由 HTTP1.1、HTTP2 和 gRPC 流量时的匹配条件和动作。

字段 类型 描述 是否必需
name string 为调试目的而分配给 route 的名称。route 的名称将与 match 的名称连接在一起,并记录在访问日志中,用于匹配该 route/match 的请求
match HTTPMatchRequest[] 匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配该规则
route HTTPRouteDestination[] HTTP 规则可以重定向或转发(默认)流量。转发目标可以是服务的多个版本之一,与服务版本相关联的权重决定了它接收流量的比例
redirect HTTPRedirect HTTP 规则可以重定向或转发(默认)流量。如果在规则中指定了流量通过选项,则将忽略 route/redirectredirect 可用于将 HTTP 301 重定向发送到不同的 URI/Authority
rewrite HTTPRewrite 重写 HTTP URI/Authority headersrewrite 不能与 redirect 一起使用,rewrite 将在转发之前执行
timeout Duration HTTP 请求超时
retries HTTPRetry 重试 HTTP 请求的策略
fault HTTPFaultInjection 应用于客户端 HTTP 流量的故障注入策略。当在客户端启用故障时,将不会启用超时或重试
mirror Destination 除了将请求转发到预期目标之外,还将 HTTP 流量镜像到另一个目标。镜像流量是基于最佳努力的,在从原始目的地返回响应之前,sidecar/gateway 不会等待镜像集群响应。将为镜像的目标生成统计信息
mirrorPercent UInt32Value mirror 字段要镜像的流量百分比。如果不存在此字段,则将镜像所有流量(100%),最大值为100
corsPolicy CorsPolicy 跨域资源共享策略(CORS)
headers Headers header 操作规则

HTTPRouteDestination

每个路由规则都与一个或多个服务版本相关联,与版本相关联的权重决定了该版本接收流量的比例。下面的示例中,会将 reviews 服务的 25% 流量路由到带有 v2 标签的实例,而其余流量(75%)路由到 v1 标签的实例。

apiVersion: networking.istio.io/v1alpha3
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/v1alpha3
kind: DestinationRule
metadata:
  name: reviews-destination
spec:
  host: reviews.prod.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

流量也可以在两个完全不同的服务之间分配,而不必定义新的子集。下面的示例中,将 reviews.com 25% 的流量转发到到 dev.reviews.com

apiVersion: networking.istio.io/v1alpha3
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 Destination 目标唯一地标识请求/连接应转发到的服务实例
weight int32 要转发到服务版本的流量比例(0-100)。各个目标之间的权重总和是 100。如果规则中只有一个目标,则权重值将视为 100
headers Headers header 操作规则
removeResponseHeaders string[] remove_response_header 已过时,建议改用 headers 字段
appendResponseHeaders map<string, string> append_response_headers 已过时,建议改用 headers 字段
removeRequestHeaders string[] remove_request_headers 已过时,建议改用 headers 字段
appendRequestHeaders map<string, string> append_request_headers 已过时,建议改用 headers 字段

Headers

当 Envoy 将请求转发到目标服务或从目标服务转发响应时,可以操作消息的 header。可以为特定的路由目的地或所有目的地指定 header 操作规则。

下面示例中的 VirtualService,将为路由到任何 reviews 服务目标的请求添加一个值为 truetest header。它还移除了 foo response header,但只移除了来自 reviews 服务的 v1 子集(版本)的响应。

apiVersion: networking.istio.io/v1alpha3
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
字段 类型 描述 是否必需
request HeaderOperations 在将请求转发到目标服务之前应用的 header 操作规则
response HeaderOperations 在向调用者返回响应之前应用的 header 操作规则

Headers.HeaderOperations

Headers.HeaderOperations 描述要应用的 header 操作。

字段 类型 描述 是否必需
set map<string, string> 用给定的值覆盖由 key 指定的 header
add map<string, string> 将给定的值附加到由 keys 指定的 header(将创建一个以 , 分隔的值的列表)
remove string 删除指定的 header

L4MatchAttributes

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

字段 类型 描述 是否必需
destinationSubnets string[] 有可选子网的目标 IPv4 或 IPv6 地址。如 a.b.c.d/xxa.b.c.d 形式
port uint32 指定要寻址的 host 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口
sourceLabels map<string, string> 一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 VirtualService 有一个顶部指定的 gateway 列表,它必须包含保留的 gateway mesh 以使此字段可用
gateways string[] 规则应应用到的 gateway 的名称。位于 VirtualService 顶部的 gateway 名称(如果有)将被覆盖。gateway 匹配独立于 sourceLabels

Percent

Percent 指定 [0.0, 100.0] 范围内的百分比。

字段 类型 描述 是否必需
value double [0.0, 100.0] 范围内的数

PortSelector

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

字段 类型 描述 是否必需
number uint32 有效的端口号

RouteDestination

L4 路由规则加权目的地。

字段 类型 描述 是否必需
destination Destination destination 唯一标识请求/连接应转发到的服务的实例
weight int32 要转发到服务版本的流量比例。如果规则中只有一个 destination,则所有流量都将路由到该 destination,而与权重无关

StringMatch

描述如何匹配 HTTP header 中的给定字符串。匹配区分大小写。

字段 类型 描述 是否必需
exact string (oneof) 字符串完全匹配
prefix string (oneof) 基于前缀匹配
regex string (oneof) 基于正则匹配

TCPRoute

描述路由 TCP 流量时的匹配条件和动作。下面的示例中,路由规则将到达端口 27017 的 mongo.prod.svc.cluster.local 的流量转发给端口 5555 上的 另一个 Mongo 服务 mongo.backup.svc.cluster.local

apiVersion: networking.istio.io/v1alpha3
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
字段 类型 描述 是否必需
match L4MatchAttributes[] 匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配该规则
route RouteDestination[] 连接应转发到的目的地

TLSMatchAttributes

TLS 连接匹配属性。

字段 类型 描述 是否必需
sniHosts string[] 匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配该规则
destinationSubnets string[] 有可选子网的目标 IPv4 或 IPv6 地址。如 a.b.c.d/xxa.b.c.d 形式
port uint32 指定要寻址的 host 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口
sourceLabels map<string, string> 一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 VirtualService 有一个顶部指定的 gateway 列表,它必须包含保留的 gateway mesh 以使此字段可用
gateways string[] 规则应应用到的 gateway 的名称。位于 VirtualService 顶部的 gateway 名称(如果有)将被覆盖。gateway 匹配独立于 sourceLabels

TLSRoute

描述用于路由未终止 TLS 流量(TLS/HTTPS)的匹配条件和操作。下面的示例中,路由规则根据 SNI 值将到达网关 mygateway 的端口 443 的未终止 TLS 流量转发到网格中的内部服务。

apiVersion: networking.istio.io/v1alpha3
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
字段 类型 描述 是否必需
match TLSMatchAttributes[] 匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配该规则
route RouteDestination[] 连接应转发到的目的地

VirtualService

影响流量路由的配置。

字段 类型 描述 是否必需
hosts string[] 向其发送流量的目标主机,可以是带有通配符前缀的 DNS 名称或 IP 地址。hosts 字段同时适用于 HTTP 和 TCP 服务。单个 VirtualService 可以用于描述相应主机的所有流量属性,包括多个 HTTP 和 TCP 端口的流量属性。网格内的服务(即在服务注册表中找到的服务)必须始终使用其字母数字名称进行引用。仅允许通过 Gateway 定义的服务使用 IP 地址
gateways string[] 应用这些路由的 gatewayssidecars 的名称。单个 VirtualService 可用于网格内的 sidecars 以及一个或多个 gateways。在特定协议路由的匹配条件中,可以使用 source 字段来覆盖该字段施加的选择条件。保留字 mesh 用于表示网格中的所有 sidecars,省略 gateways 字段时,将使用默认网关(mesh),这会将规则应用于网格中的所有 sidecars。如果提供了网关名称列表,则规则将仅应用于列表中的网关。要将规则应用于网关和边车,请将 mesh 指定 为网关名称之一
http HTTPRoute[] 用于 HTTP 流量的路由规则的有序列表。HTTP 路由将被应用到名为 http-/http2-/grpc-* 的平台服务端口、协议为 HTTP/HTTP2/GRPC/TLS-terminated-HTTPS 的网关端口、以及使用 HTTP/HTTP2/GRPC 协议的服务入口端口。使用与传入请求匹配的第一条规则
tls TLSRoute[] 用于 未终止的TLS 和 HTTPS 流量的路由规则的有序列表。通常使用 ClientHello 消息提供的 SNI 值执行路由。TLS 路由将被应用到名为 https-/tls- 的平台服务端口、使用 HTTPS/TLS 协议(即采用“直通” TLS 模式)的未终止的网关端口、以及使用 HTTPS/TLS 协议的服务入口端口。使用与传入请求匹配的第一条规则。注意:没有关联虚拟服务的 https-tls- 端口的流量将被视为不透明的 TCP 流量
tcp TLSRoute[] 用于不透明 TCP 流量的路由规则的有序列表。TCP 路由将被应用到任何不是 HTTPTLS 端口的端口。使用与传入请求匹配的第一条规则
exportTo string[] VirtualService 暴露到的命名空间的列表。暴露 VirtualService 允许其被其他命名空间中定义的 sidecarsgateways 使用。此功能可以控制 VirtualService 跨命名空间边界的可见性。如果未指定命名空间,则默认情况下会将 VirtualService 暴露到所有命名空间。. 作为保留,表示暴露 VirtualService 到声明它的同一命名空间。类似的,* 作为保留,表示暴露到所有命名空间。注意:在当前版本中,该 exportTo 值限制为 .*(即当前命名空间或所有命名空间)

猜你喜欢

转载自blog.csdn.net/miss1181248983/article/details/118309662