Istio中单独的VirtualService和DestinationRule配置的必要性

时间:2018-08-09 17:28:27

标签: kubernetes istio

在Istio中,我想知道为什么将VirtualService和DestinationRule分为两个单独的配置文件?在AFAICT中,DestinationRule定义了子集,并提供了指向该子集的VirtualService路由。显然,它们都不仅限于此,但我的问题是,将两者分开背后的设计思想可能是什么。为什么我们不能在VirtualService yaml本身中定义子集?

一个后续问题是:为什么在目标规则中配置断路器规则,而在VirtualService中配置超时和重试?再次,我想我无法理解这个设计决定背后的原因。如果很清楚,则可以同时回答两个问题。从概念上理解这一点的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我的猜测不过是一种直觉,是这种分离一方面反映了结构定义,另一方面反映了行为定义。

因此,DestinationRule不太可能更改(除非您要引入新版本),而VirtualServices则更可能进行调整和微调。

还可以通过将这两种方式解耦,以仅保留1个DestinationRule配置,但可以同时使用多个VirtualServices配置。

我想相同的原因可以回答您的第二个问题,因为定义超时和重试更像是微调。

也许还有一些我不知道的技术原因...

答案 1 :(得分:1)

它们旨在将路由与路由后行为明确分开。

VirtualService用于描述从一个或多个用户可寻址目标(主机)到网格内部实际目标工作负载(服务)的映射(路由规则)。

然后,DestainationRule定义在发生VirtualService路由后要应用于请求的策略集。它们旨在由服务所有者编写,描述断路器,负载均衡器设置,TLS设置等。

here是它们工作方式的概述。

答案 2 :(得分:0)

虚拟服务就像传统代理应用程序(例如nginx)中的虚拟主机一样。另一方面,目标规则就像集群定义一样,sucn作为nginx中的上游服务器。断路器旨在保护上游服务器,但是重试和超时是对报告客户端错误的响应。