概述
虚拟服务(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 |
当前目标服务的权重 |