据我所知,Istio Destination Rules可以定义负载平衡策略来访问服务的子集,例如基于不同版本服务的子集。因此,目的地规则是负载平衡的第一级。
请求最终将到达K8s服务,该服务通常由kube代理实现。Kube代理与后端的pod进行简单的负载平衡。这是负载平衡的第二个级别。
有没有办法卸下第二个负载平衡器?例如,我们是否可以创建许多提供相同服务的服务实例,这些服务实例可以通过Destination Rules进行负载平衡,然后每个服务实例只有一个pod,这样kube proxy就不会应用负载平衡?
根据istio文档:
Istio的流量路由规则使您可以轻松控制服务之间的流量和API调用。Istio简化了断路器、超时和重试等服务级别属性的配置,并可以轻松设置重要任务,如A/B测试、金丝雀式推出和基于百分比的流量拆分的分阶段推出。它还提供了开箱即用的故障恢复功能,有助于使您的应用程序在依赖服务或网络故障时更加强健。
Istio的流量管理模型依赖于与您的服务一起部署的Envoy代理。您的网格服务发送和接收的所有流量(数据平面流量(都是通过Envoy代理的,因此无需对您的服务进行任何更改即可轻松引导和控制网格周围的流量。
如果您对本指南中描述的功能如何工作的细节感兴趣,您可以在架构概述中找到更多关于Istio流量管理实现的信息。本指南的其余部分介绍了Istio的流量管理功能。
这意味着istio服务网格通过特使代理进行通信,而特使代理又依赖于kubernetes网络。
我们可以举一个例子,其中使用istio-ingress网关的VirtualService
基于标签平衡其到两个不同服务的流量。然后这些服务可以有多个pod。
在这种情况下,Istio负载平衡只在(第7层(上工作,这导致了到特定端点(其中一个服务(的路由,并依赖于kubernetes来处理连接,其余部分包括在多个pod的情况下的服务循环负载平衡(第4层(。
具有多个pod的单个服务的优点显然是更易于配置和管理。在每个服务有一个pod的情况下,每个服务都需要单独重新配置,并且失去了扩展功能的所有能力。
Youtube上有一个很棒的视频,部分涵盖了这个主题:Matt Turner的《通过Istio的包的生活》。
我强烈建议大家看一下istio是如何在基本层面上工作的。