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"
字段类型描述是否必需
allowOriginstring[]允许执行 CORS 请求的来源列表。内容会被序列化到 Access-Control-Allow-Origin header 中。通配符 * 允许所有来源
allowMethodsstring[]允许访问资源的 HTTP 方法列表。内容会被序列化到 Access-Control-Allow-Methods header
allowHeadersstring[]请求资源时可以使用的 HTTP header 列表。会序列化为 Access-Control-Allow-Headers header
exposeHeadersstring[]允许浏览器访问的 HTTP header 的白名单列表。会序列化为 Access-Control-Expose-Headers header
maxAgeDuration指定可以将预检请求的结果缓存多长时间。会转换为 Access-Control-Max-Age header
allowCredentialsBoolValue指定是否允许调用者使用凭据发送实际请求(而不是预检请求)。会转换为 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

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
字段类型描述是否必需
hoststring服务注册表中服务的名称。从平台的服务注册表(如 Kubernetes servicesConsul services)以及 ServiceEntry 声明的主机中查找服务名称。转发到两个目的地中都未找到的流量将被丢弃
subsetstring服务中子集的名称,仅适用于网格内的服务。该子集必须在相应的 DestinationRule 中定义
portPortSelector指定要寻址的 host 上的端口。如果服务仅公开单个端口,则不需要显式选择端口

HTTPFaultInjection

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

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

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

字段类型描述是否必需
delayDelay在转发之前延迟请求,模拟各种故障,如网络问题、上游服务过载等
abortAbort中止 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 字段只能用于中止一定百分比的请求,如果未指定,则中止所有请求。

字段类型描述是否必需
httpStatusint32 (oneof)用于中止 HTTP 请求的 HTTP 状态码
percentagePercent通过提供的错误代码去中止请求的百分比
percentint32使用提供的错误代码(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 字段只能用于延迟一定百分比的请求,如果未指定,则延迟所有请求。

字段类型描述是否必需
httpStatusDuration (oneof)在转发请求之前添加固定的延迟。格式:1h1m1s1ms。必须 >= 1ms
percentagePercent通过提供的错误代码去延迟请求的百分比
percentint32使用提供的错误代码(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 字段不能为空。

字段类型描述是否必需
namestring分配给匹配项的名称。匹配的名称将与父路由的名称连接,并将被记录在访问日志中,用于匹配该路由的请求
uriStringMatch区分大小写匹配 uri,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配。注意:不区分大小写的匹配可以通过 ignore_uri_case 启用
schemeStringMatch区分大小写匹配 schema,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配
methodStringMatch区分大小写匹配 HTTP Method,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配
authorityStringMatch区分大小写匹配 HTTP Authority,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配
headersmap<string, StringMatch>headers 的 key 必须是小写字母,并使用 - 作为分隔符,如 x-request-idheaders 的 value 区分大小写,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配。注意:key 为 urischememethodauthority 时将被忽略
portuint32指定要寻址的 host 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口
sourceLabelsmap<string, StringMatch>一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 VirtualService 有一个顶部指定的 gateway 列表,它必须包含保留的 gateway mesh 以使此字段可用
queryParamsmap<string, StringMatch>查询参数以进行匹配。例如:对于 ?key=true 这样的查询参数,映射键将为 key,字符串匹配项可定义为 exact: "true";对于 ?key 这样的查询参数,映射键将为 key,字符串匹配项可定义为 exact: "";对于 ?key=123 这样的查询参数,映射键将为 key,字符串匹配项可定义为 regex: "\d+$",此配置将仅匹配 123 这样的值,而不匹配 a123123a 这样的值。注意:目前 prefix 不支持匹配
ignoreUriCasebool指定 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
  ...
字段类型描述是否必需
uristringredirect 上,使用此值覆盖 URL 的 Path 部分。无论将请求 uri 匹配为 exact 还是 prefix,都将替换整个路径
authoritystringredirect 上,使用此值覆盖 URL 的 Authority/Host 部分
redirectCodeuint32redirect 上,指定要在重定向响应中使用的 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
字段类型描述是否必需
attemptsint32给定请求的重试次数。重试之间的时间间隔将自动确定(25ms 以上),尝试重试的实际次数取决于 httpReqTimeout
perTryTimeoutDuration给定请求的每次重试尝试超时。格式:1h1m1s1ms。必须 >= 1ms
retryOnstring指定发生重试的条件。可以使用 , 分隔列表指定一个或多个策略

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

HTTPRoute

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

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

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
字段类型描述是否必需
destinationDestination目标唯一地标识请求/连接应转发到的服务实例
weightint32要转发到服务版本的流量比例(0-100)。各个目标之间的权重总和是 100。如果规则中只有一个目标,则权重值将视为 100
headersHeadersheader 操作规则
removeResponseHeadersstring[]remove_response_header 已过时,建议改用 headers 字段
appendResponseHeadersmap<string, string>append_response_headers 已过时,建议改用 headers 字段
removeRequestHeadersstring[]remove_request_headers 已过时,建议改用 headers 字段
appendRequestHeadersmap<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
字段类型描述是否必需
requestHeaderOperations在将请求转发到目标服务之前应用的 header 操作规则
responseHeaderOperations在向调用者返回响应之前应用的 header 操作规则

Headers.HeaderOperations

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

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

L4MatchAttributes

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

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

Percent

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

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

PortSelector

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

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

RouteDestination

L4 路由规则加权目的地。

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

StringMatch

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

字段类型描述是否必需
exactstring (oneof)字符串完全匹配
prefixstring (oneof)基于前缀匹配
regexstring (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
字段类型描述是否必需
matchL4MatchAttributes[]匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配该规则
routeRouteDestination[]连接应转发到的目的地

TLSMatchAttributes

TLS 连接匹配属性。

字段类型描述是否必需
sniHostsstring[]匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配该规则
destinationSubnetsstring[]有可选子网的目标 IPv4 或 IPv6 地址。如 a.b.c.d/xxa.b.c.d 形式
portuint32指定要寻址的 host 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口
sourceLabelsmap<string, string>一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 VirtualService 有一个顶部指定的 gateway 列表,它必须包含保留的 gateway mesh 以使此字段可用
gatewaysstring[]规则应应用到的 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
字段类型描述是否必需
matchTLSMatchAttributes[]匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 AND 语义,而匹配块列表具有 OR 语义。如果任何一个匹配块成功,则匹配该规则
routeRouteDestination[]连接应转发到的目的地

VirtualService

影响流量路由的配置。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值