应用服务网格

虚拟服务

2025-08-13 09:20:48

虚拟服务(VirtualService)是服务网格的关键资源;虚拟服务定义了一组路由规则,并与请求匹配,根据匹配的结果将流量路由到响应的目标服务。本文介绍虚拟服务的基本管理以及CRD说明。 

创建虚拟服务 

1.进入网格实例页,选择菜单栏 流量管理中心 -> 虚拟服务 

2.确认虚拟服务所在命名空间,选择 使用yaml创建 

3.当前已经定义了一些路由模板,可以选择对应模板,按照自己的路由需求进行修改,然后提交

修改虚拟服务 

1.进入服务网格实例页,选择菜单栏 流量管理中心 -> 虚拟服务 

2.选择相应的命名空间,列表页会展示当前命名空间下所有的虚拟服务定义 

3.选择操作栏下的编辑选项,可以对已经创建的虚拟服务进行编辑修改

删除虚拟服务 

1.进入服务网格实例页,选择菜单栏 流量管理中心 -> 虚拟服务 

2.选择相应的命名空间,列表页会展示当前命名空间下所有的虚拟服务定义 

3.选择操作栏下的删除选项,可以删除已经创建的虚拟服务

虚拟服务配置资源配置示例及关键字段说明

下面的虚拟服务配置将对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服务的两个子集,分别对应v1v2版本:

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

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

当前目标服务的权重

 

ForJ0ypJ9XpG