VirtualService
影响流量路由的配置。以下是一些术语,可在流量路由的上下文中进行定义。
Service
通常是绑定到服务注册表中唯一名称的应用程序行为的单元。服务包含多个网络 Endpoints
,这些 EndPoints
由 Pod
、容器、VM 等上运行的工作负载实例实现。
Service Version
即服务的版本。每个服务都有一个包含其所有实例的默认版本。在连续部署中,对于给定的服务,可能存在运行应用程序二进制文件的不同变体的实例的不同子集。这些变体不一定是不同的 API 版本,它们可能是对同一服务的迭代更改,部署在不同的环境(产品,阶段,开发等)中。发生这种情况的常见方案包括 A/B 测试、金丝雀发布等,可以根据各种标准(headers
,URL
等)和 /
或通过分配给每个版本的权重来决定特定版本的选择。
Source 资源,即调用 Service 的下游客户端
Host 客户端尝试连接 Service 时使用的地址
Access model 应用程序仅寻址目标服务(主机),而无需了解各个服务版本(子集)。版本的实际选择由 proxy/sidecar 决定,从而使应用程序代码能够与依赖服务解耦
VirtualService 定义了一组寻址主机时应用的流量路由规则。每个路由规则都为特定协议的流量定义了匹配条件,如果流量匹配,则将其发送到注册表中定义的命名目标服务(或其子集/版本)
在路由规则中也可以匹配流量的来源,允许为特定的客户端上下文自定义路由。
下面的示例中,默认情况下将所有 HTTP 流量路由到带有标签 version: v1
的 reviews
服务的 Pod
。此外,路径以 /wpcatalog/
或 /consumercatalog/
开头的 HTTP 请求将被重写为 /newcatalog
,并发送到标签为 version: v2
的 reviews
服务的 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 services
、Consul services
)以及通过 ServiceEntry
资源声明的服务组成。
Kubernetes 需要注意:当使用短名称(如使用 reviews
而不是 reviews.default.svc.cluster.local
)时,Istio 将根据规则的命名空间而不是服务的命名空间来解析短名称。包含 reviews
主机的 default
命名空间中的规则将被解析为 reviews.default.svc.cluster.local
,而与 reviews
服务的实际命名空间无关。为避免潜在的错误配置,建议使用完全限定的域名而不是短名称。
下面的 Kubernetes 示例中,默认将所有流量路由到版本 v1
的 reviews
服务的 Pod
,以及将某些流量路由到版本 v2
的 reviews
服务的 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
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
host |
string |
服务注册表中服务的名称。从平台的服务注册表(如 Kubernetes services 、Consul 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: prod
的 v1
版本的 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) |
在转发请求之前添加固定的延迟。格式:1h 、1m 、1s 、1ms 。必须 >= 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-id 。headers 的 value 区分大小写,格式:exact: "value" 精确字符串匹配;prefix: "value" 基于前缀匹配;regex: "value" 基于正则匹配。注意:key 为 uri 、scheme 、method 、authority 时将被忽略 |
否 |
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 这样的值,而不匹配 a123 或 123a 这样的值。注意:目前 prefix 不支持匹配 |
否 |
ignoreUriCase |
bool |
指定 uri 匹配是否不区分大小写。注意:仅当 uri 匹配是 exact 和 prefix 时,才会忽略大小写 |
否 |
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 |
给定请求的每次重试尝试超时。格式:1h 、1m 、1s 、1ms 。必须 >= 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/redirect 。redirect 可用于将 HTTP 301 重定向发送到不同的 URI/Authority |
否 |
rewrite |
HTTPRewrite |
重写 HTTP URI/Authority headers 。rewrite 不能与 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
服务目标的请求添加一个值为 true
的 test 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/xx 或 a.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/xx 或 a.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[] |
应用这些路由的 gateways 和 sidecars 的名称。单个 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 路由将被应用到任何不是 HTTP 或 TLS 端口的端口。使用与传入请求匹配的第一条规则 |
否 |
exportTo |
string[] |
VirtualService 暴露到的命名空间的列表。暴露 VirtualService 允许其被其他命名空间中定义的 sidecars 和 gateways 使用。此功能可以控制 VirtualService 跨命名空间边界的可见性。如果未指定命名空间,则默认情况下会将 VirtualService 暴露到所有命名空间。. 作为保留,表示暴露 VirtualService 到声明它的同一命名空间。类似的,* 作为保留,表示暴露到所有命名空间。注意:在当前版本中,该 exportTo 值限制为 . 或 * (即当前命名空间或所有命名空间) |
否 |