istio110学习笔记05流量管理API资源对象虚拟服务和目标规则

Istio通过流量管理API进行流量配置。流量管理API使用Kubernetes的CRDs(自定义资源定义)来声明。 本节学习在前面2节配置请求路由中用过的两个API资源:虚拟服务VirtualService和目标路由DestinationRule。虚拟服务VirtualService使用虚拟服务可以为一个或多个主机名(hostnames)指定流量行为。在虚拟机服务中使用路由规则(route)告诉Envoy如何发送虚拟服务的流量到适当的目标(destination)。 路由(route)的目标(desti

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

虚拟服务有以下两种使用场景:

  • 通过单个虚拟服务处理多个应用服务,例如,配置一个虚拟服务来处理Kubernetes特定名称空中的所有服务。将单个虚拟服务映射到多个“真实”服务,可以将单个应用转化为由微服务构建的复合应用系统,而不需要客户适应这种转化。
  • 网关集成并配置流量规则来控制传入和传出流量。
  • 让我们看看在“基于用户身份的请求路由”的例子中创建的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中为流向特定服务或服务子集的流量指定这些模型。

  • RANDOM:请求以随机方式访问池中的一个实例。
  • 权重:请求根据指定的百分比发送到实例。
  • 最少请求(LEAST_CONN):请求被转移到最少访问的实例。
  • 在以下示例中,目标规则为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服务的部署,并用作元数据来标识不同的版本。

    本节总结了Isito流量管理API的两个资源对象:VirtualService和DestinationRule。虚拟服务用于配置如何将流量路由到目的地址。虚拟服务的路由规则可以在流量端口、报头字段、URIs等方面设置匹配条件。,并将流量路由到适当的目的地。同时,路由规则可用于对流量执行一些操作,如添加和删除报头、重写URL、为调用此目的地址的请求设置重试策略等。目标规则是应用于目标地址的规则。当调用此目标服务或特定子集时,目标规则可用于定制Envoy的流量策略,如负载平衡策略、TLS安全模式或保险丝设置。

    参考https://istio.io/latest/zh/docs/concepts/traffic-management

  • https://istio . io/latest/zh/docs/reference/config/networking/virtual-service
  • https://istio . io/latest/zh/docs/reference/config/networking/destination-rule/