部署模型

在配置 Istio 的生产部署时,您需要回答一些问题。网格是否会局限于单个集群或分布在多个集群中?所有服务是否都位于单个完全连接的网络中,还是需要网关来连接跨多个网络的服务?是否只有一个控制平面,可能在多个集群之间共享,或者是否部署了多个控制平面以确保高可用性(HA)?所有集群是否将被连接到单个多集群服务网格,还是会将它们联合到一个多网格部署?

所有这些问题(以及其他问题)都代表了 Istio 部署配置的独立维度。

  1. 单个或多个集群
  2. 单个或多个网络
  3. 单个或多个控制平面
  4. 单个或多个网格

在涉及多个集群的生产环境中,您可以使用混合部署模型。例如,对于 HA,建议拥有多个控制平面,但您可以通过将两个集群部署在一个共享的控制平面中,然后在另一个网络中添加第三个集群及其第二个控制平面,来实现此目标。然后,可以将所有三个集群配置为共享这两个控制平面,以便所有集群都具有两个控制源以确保 HA。

选择正确的部署模型取决于用例的隔离、性能和 HA 需求。本指南描述了配置 Istio 部署时的各种选项和注意事项。

集群模型

应用程序的工作负载实例在单个或多个集群中运行。为了隔离、性能和高可用性,您可以将集群限制在可用区和区域中。

生产系统(根据其需求)可以在跨越多个区域或区域的多个集群中运行,利用云负载均衡器来处理诸如位置感知、区域或区域故障转移之类的事情。

在大多数情况下,集群代表配置和端点发现的边界。例如,每个 Kubernetes 集群都有一个 API 服务器,它管理集群的配置,并为服务端点信息提供服务,因为 pod 会启动或停止。由于 Kubernetes 在每个集群的基础上配置此行为,因此这种方法有助于限制由于错误配置造成的潜在问题。

在 Istio 中,您可以配置一个跨越任意数量的集群的单一服务网格。

单集群

在最简单的情况下,您可以将 Istio 网格限制在单个集群中。集群通常在单个网络上运行,但它在基础设施提供商之间有所不同。单个集群和单个网络模型包括一个控制平面,这将导致最简单的 Istio 部署。

A service mesh with a single cluster
具有单个集群的服务网格

单集群部署提供了简单性,但缺乏其他功能,例如故障隔离和故障转移。如果您需要更高的可用性,您应该使用多个集群。

多个集群

您可以配置单个网格以包含多个集群。在单个网格中使用多集群部署除了单集群部署之外还提供了以下功能

  • 故障隔离和故障转移:cluster-1 出现故障,故障转移到 cluster-2
  • 位置感知路由和故障转移:将请求发送到最近的服务。
  • 各种控制平面模型:支持不同级别的可用性。
  • 团队或项目隔离:每个团队运行其自己的集群集。
A service mesh with multiple clusters
具有多个集群的服务网格

多集群部署为您提供了更高程度的隔离和可用性,但增加了复杂性。如果您的系统具有高可用性要求,您可能需要跨多个区域和区域的集群。您可以在单个集群中对配置更改或新的二进制版本进行金丝雀测试,其中配置更改仅影响一小部分用户流量。此外,如果集群出现问题,您可以将流量暂时路由到附近的集群,直到解决问题。

您可以根据网络和云提供商支持的选项来配置跨集群通信。例如,如果两个集群位于相同的底层网络上,您可以通过简单地配置防火墙规则来启用跨集群通信。

在多集群网格中,所有服务默认情况下都是共享的,根据命名空间相同性的概念。 流量管理规则提供对多集群流量行为的细粒度控制。

使用多个集群的 DNS

当客户端应用程序向某个主机发出请求时,它必须首先执行对主机名的 DNS 查找以获取 IP 地址,然后才能继续进行请求。在 Kubernetes 中,驻留在集群内的 DNS 服务器通常会处理此 DNS 查找,基于配置的 服务定义。

Istio 使用 DNS 查找返回的虚拟 IP 来在请求服务的活动端点列表中进行负载均衡,同时考虑任何 Istio 配置的路由规则。Istio 使用 Kubernetes 服务/端点或 Istio 服务条目来配置其 hostname 到工作负载 IP 地址的内部映射。

当您拥有多个集群时,这种两级命名系统会变得更加复杂。Istio 本身是多集群感知的,但 Kubernetes 不是(目前)。因此,客户端集群必须具有服务的 DNS 条目,以便 DNS 查找成功,并且请求能够成功发送。即使客户端集群中没有运行该服务的 pod 实例,也是如此。

为了确保 DNS 查找成功,您必须将 Kubernetes 服务部署到使用该服务的每个集群。这确保了无论请求来自哪里,它都将通过 DNS 查找并传递给 Istio 以进行正确的路由。这也可以通过 Istio 服务条目而不是 Kubernetes 服务来实现。但是,服务条目不会配置 Kubernetes DNS 服务器。这意味着 DNS 需要手动配置或使用自动化工具(如地址自动分配功能的Istio DNS 代理)进行配置。

网络模型

Istio 使用基于一般连接性的网络的简化定义来引用具有直接可达性的工作负载实例。例如,默认情况下,单个集群中的所有工作负载实例都在同一网络中。

许多生产系统需要多个网络或子网来进行隔离和高可用性。Istio 支持在各种网络拓扑中跨越服务网格。这种方法允许您选择适合您现有网络拓扑的网络模型。

单个网络

在最简单的情况下,服务网格在单个完全连接的网络上运行。在单网络模型中,所有 工作负载实例 可以直接相互访问,无需 Istio 网关。

单网络允许 Istio 以统一的方式在整个网格中配置服务消费者,并能够直接寻址工作负载实例。但是请注意,对于跨多个集群的单网络,服务和端点不能具有重叠的 IP 地址。

A service mesh with a single network
具有单网络的服务网格

多个网络

您可以跨多个网络扩展单个服务网格;这种配置称为 **多网络**。

多网络除了单网络的功能外,还提供了以下功能

  • **服务端点** 的重叠 IP 或 VIP 范围
  • 跨越管理边界
  • 容错
  • 网络地址的扩展
  • 符合需要网络分段的标准

在此模型中,不同网络中的工作负载实例只能通过一个或多个 Istio 网关 相互访问。Istio 使用 **分区服务发现** 为消费者提供不同的 服务端点 视图。该视图取决于消费者的网络。

A service mesh with multiple networks
具有多个网络的服务网格

此解决方案需要通过网关公开所有服务(或子集)。云供应商可能会提供不需要在公共互联网上公开服务的选项。如果该选项存在并满足您的要求,那么它很可能是最佳选择。

控制平面模型

Istio 网格使用 控制平面 来配置网格内工作负载实例之间的所有通信。工作负载实例连接到控制平面实例以获取其配置。

在最简单的情况下,您可以在单个集群上运行网格,其中包含控制平面。

A single cluster with a control plane
具有控制平面的单个集群

这样的集群及其自己的本地控制平面被称为 主集群

多集群部署也可以共享控制平面实例。在这种情况下,控制平面实例可以驻留在一个或多个主集群中。没有自己控制平面的集群被称为 远程集群

A service mesh with a primary and a remote cluster
具有主集群和远程集群的服务网格

为了在多集群网格中支持远程集群,主集群中的控制平面必须通过稳定的 IP(例如,集群 IP)访问。对于跨网络的集群,可以通过 Istio 网关公开控制平面来实现这一点。云供应商可能会提供一些选项(例如内部负载均衡器),用于提供此功能而无需在公共互联网上公开控制平面。如果该选项存在并满足您的要求,那么它很可能是最佳选择。

在具有多个主集群的多集群部署中,每个主集群都从驻留在同一集群中的 Kubernetes API 服务器接收其配置(即 ServiceServiceEntryDestinationRule 等)。因此,每个主集群都有一个独立的配置源。跨主集群的此配置重复确实需要在推出更改时执行额外的步骤。大型生产系统可能会使用 CI/CD 系统等工具来自动化此过程,以管理配置推出。

与在网格内的主集群中运行控制平面相比,完全由远程集群组成的服务网格可以由 外部控制平面 控制。这提供了隔离的管理,并将控制平面部署与构成网格的数据平面服务完全分离。

A single cluster with an external control plane
具有外部控制平面的单个集群

云供应商的 托管控制平面 是外部控制平面的典型示例。

为了实现高可用性,您应该跨集群、区域或地域部署多个控制平面。

A service mesh with control plane instances for each region
每个区域都具有控制平面实例的服务网格

此模型提供了以下优势

  • 提高可用性:如果控制平面不可用,则中断范围仅限于由该控制平面管理的集群中的工作负载。

  • 配置隔离:您可以在一个集群、区域或地域进行配置更改,而不会影响其他集群、区域或地域。

  • 受控推出:您可以更精细地控制配置推出(例如,一次一个集群)。您也可以在由给定主集群控制的网格的子部分中对配置更改进行金丝雀测试。

  • 选择性服务可见性:您可以将服务可见性限制在网格的一部分,帮助建立服务级隔离。例如,管理员可以选择将 HelloWorld 服务部署到集群 A,但不会部署到集群 B。任何尝试从集群 B 调用 HelloWorld 的尝试都将导致 DNS 查找失败。

以下列表按可用性对控制平面部署示例进行排名

  • 每个区域一个集群(**可用性最低**)
  • 每个区域多个集群
  • 每个区域一个集群
  • 每个区域多个集群
  • 每个集群(**可用性最高**)

使用多个控制平面的端点发现

Istio 控制平面通过为每个代理提供服务端点列表来管理网格内的流量。为了在多集群场景中实现这一点,每个控制平面都必须观察来自每个集群中的 API 服务器的端点。

为了启用集群的端点发现,管理员会生成 remote secret 并将其部署到网格中的每个主集群。remote secret 包含凭据,授予对集群中 API 服务器的访问权限。然后,控制平面将连接并发现集群的服务端点,从而为这些服务启用跨集群负载均衡。

Primary clusters with endpoint discovery
具有端点发现的主集群

默认情况下,Istio 会在每个集群中的端点之间平均负载均衡请求。在跨越地理区域的大型系统中,使用 区域负载均衡 来优先将流量保留在同一区域或地域可能更可取。

在一些高级场景中,可能不希望跨集群进行负载均衡。例如,在蓝绿部署中,您可能会将系统的不同版本部署到不同的集群。在这种情况下,每个集群实际上都是作为一个独立的网格运行。这种行为可以通过以下几种方法实现

  • 不要在集群之间交换远程机密。这提供了集群之间最强的隔离。

  • 使用 VirtualServiceDestinationRule 禁止在服务的两个版本之间进行路由。

在这两种情况下,都会阻止跨集群负载均衡。可以使用外部负载均衡器将外部流量路由到一个集群或另一个集群。

身份和信任模型

当在服务网格中创建工作负载实例时,Istio 会为该工作负载分配一个 身份

证书颁发机构 (CA) 创建并签署用于验证网格中使用的身份的证书。可以使用创建并签署该身份证书的 CA 的公钥验证消息发送者的身份。信任捆绑是指 Istio 网格使用的所有 CA 公钥的集合。使用网格的信任捆绑,任何人都可以验证来自该网格的任何消息的发送者。

网格内的信任

在单个 Istio 网格中,Istio 确保每个工作负载实例都拥有代表其自身身份的适当证书,以及识别网格内所有身份和任何联合网格所需的信任捆绑。CA 创建并签署这些身份的证书。此模型允许网格中的工作负载实例在通信时相互验证身份。

A service mesh with a common certificate authority
具有公共证书颁发机构的服务网格

网格之间的信任

要启用具有不同 CA 的两个网格之间的通信,必须交换网格的信任捆绑。Istio 不提供任何跨网格交换信任捆绑的工具。可以使用手动或自动方式交换信任捆绑,可以使用 SPIFFE 信任域联合 等协议。

Multiple service meshes with different certificate authorities
具有不同证书颁发机构的多个服务网格

网格模型

Istio 支持将所有服务放在一个 网格 中,或者将多个网格联合在一起,也称为 多网格

单网格

最简单的 Istio 部署是一个单一网格。在网格中,服务名称是唯一的。例如,在 foo 命名空间中,只有一个服务可以具有名称 mysvc。此外,工作负载实例共享一个共同的身份,因为服务账户名称在命名空间中是唯一的,就像服务名称一样。

一个单一网格可以跨越 一个或多个集群一个或多个网络。在网格中,命名空间 用于 租户

多网格

多个网格部署是通过 网格联合 实现的。

与单一网格相比,多个网格提供了以下功能

  • 组织边界:业务线
  • 服务名称或命名空间重复使用:default 命名空间的多个不同用途
  • 更强的隔离:将测试工作负载与生产工作负载隔离

可以使用 网格联合 启用网格间通信。联合时,每个网格都可以公开一组服务和身份,所有参与网格都可以识别这些服务和身份。

Multiple service meshes
多个服务网格

为了避免服务命名冲突,可以为每个网格指定一个全局唯一的网格 ID,以确保每个服务的完全限定域名 (FQDN) 都是不同的。

当联合两个不共享相同 信任域 的网格时,必须在它们之间联合 身份信任捆绑。有关更多详细信息,请参阅有关 网格之间的信任 的部分。

租户模型

在 Istio 中,租户是指共享一组已部署工作负载的共同访问权限和特权的用户组。租户可以用来在不同团队之间提供隔离级别。

可以配置租户模型以满足以下隔离组织要求

  • 安全
  • 策略
  • 容量
  • 成本
  • 性能

Istio 支持三种类型的租户模型

命名空间租户

一个集群可以跨多个团队共享,每个团队使用不同的命名空间。可以授予团队权限,使其仅将工作负载部署到给定命名空间或一组命名空间中。

默认情况下,来自多个命名空间的服务可以相互通信,但是可以通过选择性地选择要公开给其他命名空间的服务来提高隔离级别。可以为公开的服务配置授权策略,以限制访问仅限于适当的调用者。

A service mesh with two namespaces and an exposed service
具有两个命名空间和一个公开服务的网格

命名空间租户可以扩展到单个集群之外。当使用 多个集群 时,每个集群中共享相同名称的命名空间默认情况下被视为同一命名空间。例如,集群 WestTeam-1 命名空间中的 Service B 和集群 EastTeam-1 命名空间中的 Service B 指的是同一服务,Istio 会为服务发现和负载平衡合并其端点。

A service mesh with two clusters with the same namespace
具有相同命名空间的集群的服务网格

集群租户

Istio 支持使用集群作为租户单位。在这种情况下,可以为每个团队提供专用的集群或一组集群来部署其工作负载。集群的权限通常仅限于拥有该集群的团队成员。可以设置各种角色以实现更细粒度的控制,例如

  • 集群管理员
  • 开发人员

要使用 Istio 的集群租户模式,您需要为每个团队的集群配置独立的 控制平面,使每个团队能够管理自己的配置。或者,您可以使用 Istio 将一组集群作为单个租户来实现,使用 远程集群 或多个同步的 主集群。有关详细信息,请参阅 控制平面模型

网格租户

在使用 网格联合 的多网格部署中,每个网格都可以用作隔离单元。

Two isolated service meshes with two clusters and two namespaces
两个包含两个集群和两个命名空间的隔离服务网格

由于每个网格由不同的团队或组织运行,因此服务命名很少是不同的。例如,集群 Team-1foo 命名空间中的 Service C 和集群 Team-2foo 命名空间中的 Service C 服务不指向同一个服务。最常见的例子是在 Kubernetes 中,许多团队将他们的工作负载部署到 default 命名空间。

当每个团队都有自己的网格时,跨网格通信遵循 多网格 模型中描述的概念。

这些信息对您有帮助吗?
您有什么改进建议吗?

感谢您的反馈!