Istio通过流量管理API配置流量。使用Kubernetes的CRDs(自定义资源定义)来声明流量管理API。在本节中,我们将了解在前两节中配置请求路由时使用的两种API资源:VirtualService和DestinationRule。
虚拟服务虚拟服务使用虚拟服务为一个或多个主机名指定流量行为。在虚拟机服务中使用路由规则来告诉Envoy如何将虚拟服务的流量发送到适当的目的地。路由的目的地可以是同一服务的不同版本,也可以是完全不同的服务。
下面是一个典型的用例,它将流量发送到被指定为服务子集的不同版本。客户机将虚拟服务视为单个实体,并将请求发送给虚拟服务评审。然后Envoy根据虚拟服务规则将流量路由到不同的版本,25%的流量调用会到达reviews服务的v2版本。这是Canary发布的一个场景,它逐渐增加了发送到新版本服务的流量百分比。
API version:networking . istio . io/v1 alpha 3kind:virtual servicemetadata:name:reviewsspec:-reviewshttp:-route:-destination:host:reviewssubset:v1weight:75-destination:host
虚拟服务有以下两种使用场景:
让我们看看在“基于用户身份的请求路由”的例子中创建的VirtualService虚拟服务。它将根据请求是否来自特定用户,将请求路由到服务的不同版本:
API version:networking . istio . io/v1 alpha 3kind:virtual servicemetadata:name:reviewsspec:-reviewshttp:-match:-headers:end-user:exact:Jasonroute:-destination:host:reviews
hosts字段指定虚拟服务的主机,它是路由规则的应用程序目标,以及客户端在向服务发送请求时使用的一个或多个地址。这里只有一张照片。虚拟服务的主机可以是IP地址、DNS名称或一个短名称,这取决于平台(例如,Kubernetes服务的短名称),它隐式或显式地指向一个完全合格的域名(FQDN)。您还可以使用通配符*前缀创建一组匹配所有服务的路由规则。服务的虚拟主机字段实际上不必是istio服务注册的一部分,它只是一个虚拟目标地址,这样就可以对没有路由到网格内部的虚拟主机进行建模。
Http字段包含虚拟服务的路由规则,用于描述匹配条件和路由行为。通过路由规则将流量(如HTTP1.1、HTTP2和gRPC)发送到主机字段中指定的目的地。路由规则有0个或多个匹配条件,并且包含指定请求要到达的目标地址。示例中的第一个路由规则有一个匹配条件,它以match字段开始,并通过使用headers、end-user、exact和其他字段将请求与请求头end-user=jason进行匹配。路由部分中的目的地字段指定满足此条件的流量的实际目的地地址。与虚拟机服务的主机字段不同,目的地的主机字段必须是isito服务注册表中存在的实际目的地地址,否则Envoy不知道将请求发送到哪里。在本例中,host是Kubernetes中reviews服务的名称(这里使用的是Kubernetes服务的简称设置)。目的地片段还指定了评论,这是Kubernetes服务的一个子集。
匹配时从上到下选择规则。因此,通常建议提供一个默认的“无条件”或基于权重的规则作为每个虚拟服务的最后一个路由规则,以确保流经虚拟服务的流量可以匹配至少一个路由规则。
路由规则是将特定流量子集路由到指定目的地址的强大工具。您可以在流量端口、报头字段、URIs等方面设置匹配条件。例如,以下虚拟服务允许用户向两个独立的服务发送请求:评级和评论,就好像它们是http://bookinfo.com/.更大的虚拟服务的一部分。虚拟服务规则根据请求的URI和指向适当服务的请求来匹配流量。
API version:networking . istio . io/v1 alpha 3kind:virtual servicemetadata:name:bookinfospec:-bookinfo . comhttp:-match:-uri:prefix:/reviewsroute:-destination:host:reviews...http:-match:source labels:app:点评路线:
路由规则的配置非常灵活。除了上述示例之外,您还可以使用路由规则对流量执行一些操作,例如添加和删除报头、重写URL、为调用该目标地址的请求设置重试策略等等。关于VirtualService的更多信息,请查阅官方配置手册https://istio . io/latest/zh/docs/reference/config/networking/virtual-service。
DestinationRule虚拟服务用于配置如何将流量路由到目标地址,而目标规则用于配置流量的实际目标地址。您可以使用目标规则来指定命名的服务子集,例如按版本对给定服务的所有实例进行分组,然后您可以在虚拟服务的路由规则中使用这些服务子集来控制到不同服务实例的流量。当调用此目标服务或特定子集时,目标规则还可用于自定义Envoy的流量策略,如负载平衡策略、TLS安全模式或保险丝设置。
默认情况下,Istio使用ROUND_ROBIN负载平衡策略,实例池中的每个实例依次获得请求。Istio还支持以下负载平衡模型,可以在DestinationRule中为流向特定服务或服务子集的流量指定这些模型。
在以下示例中,目标规则为my-svc目标服务的三个子集配置负载平衡策略,v1、v3是随机的,v2是ROUND_ROBIN:
API version:networking . istio . io/v1 alpha 3kind:destination rulemetadata:name:my-destination-rulespec:host:my-SVCtraffic policy:simple:RANDOMsubsets:-name:v1labels:version:v1-name:v2
每个子集基于一个或多个标签来定义。在Kubernetes中,它是一个附属于像Pod这样的对象的键/值对。这些标签应用于Kubernetes服务的部署,并用作元数据来标识不同的版本。