流量管理
通过配置路由调整服务之间的流量,支持AB测试,金丝雀测试和流量百分比分发,支持断路器,超时和重试。
流量管理 的API 资源包括:
- virtual service 虚拟服务
- Destination rules
- gateway
- service entries
- sidecars
1.1 virtual service
virtual service 和 Destination rules 是Istio 流量路由功能的关键构件。它基于istio平台的连接和发现,通过virtual service配置如何将请求路由到 Istio 服务网格中的微服务。
如果没有它,默认使用Envoy的轮循模型在每个服务的负载平衡池中分配流量,即轮流向每个池成员发送请求。这种分发方式,缺少一定灵活性,比如无法实现AB测试的百分比流量分发。
VS,使得请求和工作负载强分离。并处于二者之间的中间地位,实现请求到后端的流量控制。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService #api的资源类型
metadata:
name: reviews #虚拟服务的名称
spec:
hosts: # 虚拟服务的主机
- reviews
http: # HTTP 流量路由规则的有序列表,支持http1.1 http2,grpc
- match: # 匹配条件
- headers: #匹配指定header字段值的请求量,支持前缀匹配,精确匹配和正则表达式匹配
end-user:
exact: jason
route: # 路由规则
- destination: # 目的地的主机必须是 Istio 服务注册中心中的真实目的地
host: reviews
subset: v2
- uri: # 基于uri的匹配请求
prefix: /reviews #前缀匹配
route: # 匹配的uri请求转发目的地
- destination:
host: reviews
- route: # 默认转发
- destination:
host: reviews
subset: v3
基于百分比的分发
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 75 # reviews:v1承载75%的流量
- destination:
host: reviews
subset: v2
weight: 25 # reviews:v2承载25%的流量
路由规则按从上到下的顺序进行计算,逐个匹配,第一个匹配则终止。如果没有匹配规则,则转发到默认规则上,否则丢弃。
VS支持http,tls,tcp的流量控制。同时通过exportto配置支持跨命名空间边界的虚拟服务的可见性。如果没有指定名称空间,则默认情况下将虚拟服务导出到所有名称空间。目前只支持当前和所有。可以配置指定应用这些路由的网关和边车的名称。
一个配置示例(只做示例,配置不一定合理):
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews.prod.svc.cluster.local
http: #http/grpc流量
- timeout: 5s # Envoy等待服务的答复的时间,默认15s
- name: reviews-v2-routes
match:
- sourceLabels:
env: prod
- headers:
end-user:
exact: jason
- uri: