在Route中最重要的字段是条件字段Match,为一个MatchRequest类型的数组,表示请求满足条件,支持将HTTP属性如uri、scheme、method、authority、port等作为条件来匹配请求。
一个URL的完整格式是:URI=scheme:[//authority]path[?query][#fragment]
实际上authority的标准定义是:authority=[userinfo@]host[:port]
## authority
1. uri、scheme、method、authority:4个字段都是StringMatch类型,在匹配请求时都支持exact、prefix和regex三种模式的匹配
2. headers:匹配请求中的Header,是一个map类型。map的key是字符串类型,value是StringMatch类型。即对于每一个Header的值,都可以使用精确、前缀和正则三种方式进行匹配。
3. port:表示请求服务的端口。大部分服务只开放一个端口,这也是在微服务中推荐的做法,在这种场景下可以不指定port。
4. sourceLabels:是一个map类型的键值对,表示请求来源负载匹配标签。这在很多情况有用,可以对一组服务都打一个相同的标签,然后使用sourceLabels字段对这些服务实施相同的流量规则。在Kubernetes平台上,这里的Label就是Pod上的标签。
5. gateway:表示规则应用的Gateway名称,语义同VirtualService 上面的gateway定义,是一个更细的Match条件,会覆盖在VirtualService上配置的gateway。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: web-vs
namespace: demo
spec:
hosts:
- "*"
gateways:
- web-gateway
http:
- match:
- headers:
location:
exact: hongkong
uri:
prefix: /test
- uri:
prefix: /api/health
route:
- destination:
host: httpd-service
# 匹配到header的location是hongkong并且请求 /test,或者uri 为 /api/health 开头的请求