服务网格的作用域划定

为了编程服务网格,Istio 控制平面(Istiod)会读取各种配置,包括核心 Kubernetes 类型如 ServiceNode,以及 Istio 自身的类型如 Gateway。这些配置随后会发送到数据平面(更多信息请参见架构)。

默认情况下,控制平面会读取所有命名空间中的所有配置。每个代理实例也会接收所有命名空间的配置。这包括未加入网格的工作负载的信息。

该默认设置确保开箱即用的正确行为,但会带来可扩展性成本。每条配置都需要消耗一定的资源(主要是 CPU 和内存)来维护和保持最新。在大规模环境中,限制配置的作用域以避免过度资源消耗是至关重要的。

作用域控制机制

Istio 提供了一些工具来帮助控制配置的作用域,以满足不同的使用场景。根据需求,这些工具可以单独使用,也可以组合使用。

  • Sidecar 提供了一种机制,使特定工作负载能够导入一组配置
  • exportTo 提供了一种机制,将配置导出到一组工作负载
  • discoverySelectors 提供了一种机制,使 Istio 完全忽略一组配置

常见问题解答

如果我连接到作用域之外的服务,会发生什么?

当连接到通过某种作用域控制机制被排除的服务时,数据平面将不会知道该目标的任何信息,因此它会被视为未匹配流量

Gateway 呢?

虽然Gateways 会遵守 exportTodiscoverySelectors,但 Sidecar 对象不会影响 Gateways。然而,与 sidecar 不同,gateway 默认并不拥有整个集群的配置。相反,每条配置都是显式附加到 gateway 上的,这在很大程度上避免了该问题。

不过,目前数据平面配置中的一部分(在 Envoy 术语中称为“cluster”)总是会发送整个集群的配置,即使它没有被显式引用。