概述
虚拟服务(VirtualService)是服务网格的关键资源。虚拟服务定义了一组路由规则,并与请求匹配,根据匹配的结果将流量路由到响应的目标服务。本文介绍虚拟服务的基本管理以及CRD说明。
创建虚拟服务
- 进入网格实例页,选择菜单栏 流量管理中心 -> 虚拟服务。
- 确认虚拟服务所在命名空间,选择 使用yaml创建。
- 当前已经定义了一些路由模板,可以选择对应模板,按照自己的路由需求进行修改,然后提交。
修改虚拟服务
- 进入服务网格实例页,选择菜单栏 流量管理中心 -> 虚拟服务。
- 选择相应的命名空间,列表页会展示当前命名空间下所有的虚拟服务定义。
- 选择操作栏下的编辑选项,可以对已经创建的虚拟服务进行编辑修改。
删除虚拟服务
- 进入服务网格实例页,选择菜单栏 流量管理中心 -> 虚拟服务。
- 选择相应的命名空间,列表页会展示当前命名空间下所有的虚拟服务定义。
- 选择操作栏下的删除选项,可以删除已经创建的虚拟服务。
虚拟服务配置资源配置示例及关键字段说明
下面的虚拟服务配置将对reviews服务的访问默认转发到reviews服务的v1版本,如果uri匹配到/test前缀,则将请求转发到reviews服务的v2版本,reviews服务的两个版本使用另外一个目标规则定义。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
reviews.prod.svc.cluster.local
http:
- name:
"reviews-v2-routes"
match:
- uri:
prefix: "/test"
route:
- destination:
host:
reviews.prod.svc.cluster.local
subset: v2
- name:
"reviews-v1-route"
route:
- destination:
host:
reviews.prod.svc.cluster.local
subset: v1
关联的目标规则配置中定义了reviews服务的两个子集,分别对应v1和v2版本:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews-destination
spec:
host:
reviews.prod.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
VirtualService字段说明:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
hosts | string | 否 | 流量转发规则匹配的主机名称,可以是DNS域名(支持前缀通配匹配)、ip或者在K8s里可以是服务的名称(推荐使用FQDN)。 Hosts字段适用于tcp和http流量路由规则,对于引用网格内部服务的规则,hosts字段必须是域名的形式,ip形式的hosts只能用到Gateway资源对象中。 |
gateways | string | 否 | 当前路由规则绑定的Gateway对象列表,可以是gateway-ns/gateway-name的形式,如果不加命名空间前缀,默认引用当前命名空间下的网关。 |
http | HTTPRoute | 否 | 针对http流量的路由规则列表,适用于HTTP/HTTP2/GRPC协议。 |
tls | TLSRoute | 否 | 针对TLS和HTTPS协议的路由规则列表,通常基于TLS连接过程中的sni信息进行路由。 |
tcp | TCPRoute | 否 | 针对非HTTP和TLS协议的所有请求的路由规则。 |
exportTo | string | 否 | 定义了当前虚拟服务对哪些命名空间暴露,用于实现可见性控制;不定义的话默认对所有命名空间可见。 |
HTTPRoute定义了对HTTP1.1 、HTTP2 、gRPC的路由规则,字段说明如下:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
name | string | No | 路由名称,会被记录到访问日志中,主要用于定位问题用。 |
match | HTTPMatchRequest | No | 路由匹配规则列表,一个match下面的多个匹配规则之间是and关系,必须同时满足;match之间是or的关系。 |
route | HTTPRouteDestination | No | 路由配置,可以直接返回结果、重定向请求或者将请求转发到其他服务。 |
redirect | HTTPRedirect | No | 用于返回301重定向。 |
directResponse | HTTPDirectResponse | No | 用于返回固定的响应,在route和redirect为空的时候可以配置该字段。 |
delegate | Delegate | No | 指定用于委托HTTPRoute的虚拟服务,当route和redirect为空时可以设置,委托的虚拟服务会和当前规则合并。 注意: 1.当前只支持一层委托。 2.委托的HTTPMatchRequest必须是根的严格子集,否则会有冲突,HTTPRoute将不会生效。 |
rewrite | HTTPRewrite | No | 重写uri或者authority头部,不能与redirect一起使用;重写发生在转发请求之前。 |
timeout | Duration | No | http请求的超时时间。 |
retries | HTTPRetry | No | http请求重试策略。 |
fault | HTTPFaultInjection | No | 客户端的故障注入策略(重试和超时策略将不生效)。 |
mirror | Destination | No | 将流量镜像一份转发到指定的目标服务;该行为遵循尽最大努力原则,sidecar将不等待镜像结果返回。 |
mirrorPercentage | Percent | No | 和mirror字段配合使用,定义镜像流量比例,默认为100%。 |
corsPolicy | CorsPolicy | No | 跨域策略配置。 |
headers | Headers | No | Header操作策略。 |
TLSRoute定义了对TLS和HTTPS流量的路由规则,主要基于SNI路由,配置参数:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
match | TLSMatchAttributes | Yes | TLS匹配规则,一个match内的多个规则是and关系,多个match之间是or的关系。 |
route | RouteDestination | No | 流量转发目标。 |
TCPRoute描述了对TCP流量的匹配和转发规则,主要是基于端口的流量转发,配置字段包括:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
match | L4MatchAttributes | Yes | TCP流量匹配规则,一个match内的多个规则是and关系,多个match之间是or的关系。 |
route | RouteDestination | No | 流量转发目标。 |
HTTPMatchRequest配置定义了对http请求的一系列的匹配规则,具体字段如下:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
name | string | No | 标识一个匹配规则,会被记录到访问日志中,主要用于debug。 |
uri | StringMatch | No | Uri的匹配规则,当前支持三种匹配,分别是精确匹配、前缀匹配和正则匹配; uri匹配支持大小写敏感或不敏感匹配,可以通过ignore_uri_case字段配置。 |
scheme | StringMatch | No | Uri的scheme匹配,支持精确、前缀和正则匹配;大小写敏感。 |
method | StringMatch | No | HTTP方法匹配,支持精确、前缀和正则匹配;大小写敏感。 |
authority | StringMatch | No | HTTP Authority匹配,支持精确、前缀和正则匹配;大小写敏感。 |
headers | map<string, StringMatch> | No | HTTP头部匹配,针对每个头部支持定义匹配规则,支持精确、前缀和正则匹配;大小写敏感; uri, scheme, method, authority几个头部的匹配会被忽略。 |
port | uint32 | No | 目标主机的服务端口。 |
sourceLabels | map<string, string> | No | 请求源工作负载应当具备的标签。 |
gateways | string | No | 当前匹配规则适用的网关列表,会覆盖虚拟服务级别的网关列表。 |
queryParams | map<string, StringMatch> | No | 请求参数匹配,针对每个头部支持定义匹配规则,支持精确、前缀和正则匹配;大小写敏感。 |
ignoreUriCase | bool | No | Uri匹配是否需要大小写敏感。 |
withoutHeaders | map<string, StringMatch> | No | 和headers一样是对头部的匹配,匹配的效果刚好相反:如果header匹配了,则该请求不会应用该规则的处理。 |
sourceNamespace | string | No | 限制请求源工作负载所在的命名空间。 |
statPrefix | string | No | 相关监控指标的前缀。 |
HTTPRouteDestination定义了HTTP路由转发规则的目标服务
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
destination | Destination | Yes | 要转发的目标服务信息。 |
weight | int32 | No | 当前目标服务的权重。 |
headers | Headers | No | 头部操作规则。 |
RouteDestination定义了四层转发的目标服务
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
destination | Destination | Yes | 要转发的目标服务信息。 |
weight | int32 | No | 当前目标服务的权重。 |