在Istio中,我想知道为什么将VirtualService和DestinationRule分为两个单独的配置文件?在AFAICT中,DestinationRule定义了子集,并提供了指向该子集的VirtualService路由。显然,它们都不仅限于此,但我的问题是,将两者分开背后的设计思想可能是什么。为什么我们不能在VirtualService yaml本身中定义子集?
一个后续问题是:为什么在目标规则中配置断路器规则,而在VirtualService中配置超时和重试?再次,我想我无法理解这个设计决定背后的原因。如果很清楚,则可以同时回答两个问题。从概念上理解这一点的任何帮助将不胜感激。
答案 0 :(得分:2)
我的猜测不过是一种直觉,是这种分离一方面反映了结构定义,另一方面反映了行为定义。
因此,DestinationRule
不太可能更改(除非您要引入新版本),而VirtualServices
则更可能进行调整和微调。
还可以通过将这两种方式解耦,以仅保留1个DestinationRule
配置,但可以同时使用多个VirtualServices
配置。
我想相同的原因可以回答您的第二个问题,因为定义超时和重试更像是微调。
也许还有一些我不知道的技术原因...
答案 1 :(得分:1)
它们旨在将路由与路由后行为明确分开。
VirtualService用于描述从一个或多个用户可寻址目标(主机)到网格内部实际目标工作负载(服务)的映射(路由规则)。
然后,DestainationRule定义在发生VirtualService路由后要应用于请求的策略集。它们旨在由服务所有者编写,描述断路器,负载均衡器设置,TLS设置等。
here是它们工作方式的概述。
答案 2 :(得分:0)
虚拟服务就像传统代理应用程序(例如nginx)中的虚拟主机一样。另一方面,目标规则就像集群定义一样,sucn作为nginx中的上游服务器。断路器旨在保护上游服务器,但是重试和超时是对报告客户端错误的响应。