服务网格
服务网格用来描述组成应用程序的微服务网络以及它们之间的交互。随着服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理。
其需求包括服务发现、负载均衡、故障恢复、度量和监控等。服务网格通常还有更复杂的运维需求,比如 A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证。
Istio 是什么
Istio 提供了对整个服务网格的行为洞察和操作控制的能力,以及一个完整的满足微服务应用各种需求的解决方案。
通过负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。
通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制平面的功能来配置和管理 Istio。
核心特性
流量管理
Istio 简单的规则配置和流量路由允许您控制服务之间的流量和 API 调用过程。Istio 简化了服务级属性(如熔断器、超时和重试)的配置,并且让它轻而易举的执行重要的任务(如 A/B 测试、金丝雀发布和按流量百分比划分的分阶段发布)。
安全
Istio 的安全特性解放了开发人员,使其只需要专注于应用程序级别的安全。Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。
可观察性
Istio 健壮的追踪、监控和日志特性让您能够深入的了解服务网格部署。通过 Istio 的监控能力,可以真正的了解到服务的性能是如何影响上游和下游的;而它的定制 Dashboard 提供了对所有服务性能的可视化能力,并让您看到它如何影响其他进程。
Istio 的 Mixer 组件负责策略控制和遥测数据收集。它提供了后端抽象和中介,将一部分 Istio 与后端的基础设施实现细节隔离开来,并为运维人员提供了对网格与后端基础实施之间交互的细粒度控制。
所有这些特性都使您能够更有效地设置、监控和加强服务的 SLO。
平台支持
Istio 独立于平台,被设计为可以在各种环境中运行,包括跨云、内部环境、Kubernetes、Mesos 等等。可以在 Kubernetes 或是装有 Consul 的 Nomad 环境上部署 Istio。
Istio 目前支持:
-
Kubernetes 上的服务部署
-
基于 Consul 的服务注册
-
服务运行在独立的虚拟机上
整合和定制
Istio 的策略实施组件可以扩展和定制,与现有的 ACL、日志、监控、配额、审查等解决方案集成。
架构
Istio 服务网格从逻辑上分为数据平面和控制平面。
-
数据平面 由一组智能代理(Envoy)组成,被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信。它们还收集和报告所有网格流量的遥测数据。
-
控制平面 管理并配置代理来进行流量路由。
组件
Envoy
Istio 使用 Envoy 代理的扩展版本。Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。
Envoy在Service Mesh世界中被广泛运用,除了Istio外,VMware Tanzu Service Mesh和AWS的App Mesh也使用它作为Sidecar组件。
Envoy 代理被部署为服务的 Sidecar,在逻辑上为服务增加了 Envoy 的许多内置特性,例如:
- 动态服务发现
- 负载均衡
- TLS 终端
- HTTP/2 与 gRPC 代理
- 熔断器
- 健康检查
- 基于百分比流量分割的分阶段发布
- 故障注入
- 丰富的指标
由 Envoy 代理启用的一些 Istio 的功能和任务包括:
- 流量控制功能:通过丰富的 HTTP、gRPC、WebSocket 和 TCP 流量路由规则来执行细粒度的流量控制。
- 网络弹性特性:重试设置、故障转移、熔断器和故障注入。
- 安全性和身份认证特性:执行安全性策略,并强制实行通过配置 API 定义的访问控制和速率限制。
- 基于 WebAssembly 的可插拔扩展模型,允许通过自定义策略执行和生成网格流量的遥测。
Istiod
Istiod 提供服务发现、配置和证书管理。
-
Istiod 将控制流量行为的高级路由规则转换为 Envoy 特定的配置,并在运行时将其传播给 Sidecar。Pilot 提取了特定平台的服务发现机制,并将其综合为一种标准格式。
-
Istiod 安全通过内置的身份和凭证管理,实现了强大的服务对服务和终端用户认证。
-
Istiod 充当证书授权(CA),并生成证书以允许在数据平面中进行安全的 mTLS 通信。
部署模型
Istio 部署的独立配置维度:
- 单一或多个集群
- 单一或多个网络
- 单一或多控制平面
- 单一或多个网格
在涉及多个集群的生产环境部署中,部署可能使用多种模式。
例如,基于 3 个集群实现多控制平面的高可用部署,可以通过使用单一控制平面部署 2 个集群,然后再添加第 3 个集群和 第 2 个控制平面来实现这一点,最后,再将所有 3 个集群配置为共享 2 个控制平面,以确保所有集群都有 2 个控制源来确保 HA。
集群模型
应用程序的工作负载实例运行在一个或多个集群中。 针对隔离性、性能和高可用的需求,也可以将集群限制在可用区和地域中。
根据需求,生产系统可以跨多个集群(基于多可用区、多地域)运行, 借助云负载均衡器来处理诸如本地、区域或地域性故障转移之类的问题。
大多数情况下,集群代表着配置和端点发现的边界。
单一集群
单一集群和单一网络模型包括一个控制平面,这是最简单的 Istio 部署。
多集群
可以将单个网格配置为包括多集群。 在单一网格中使用多集群部署,与单一集群部署相比其具备以下更多能力:
- 故障隔离和故障转移:当 cluster-1 下线,业务将转移至 cluster-2。
- 位置感知路由和故障转移:将请求发送到最近的服务。
- 多种控制平面模型:支持不同级别的可用性。
- 团队或项目隔离:每个团队仅运行自己的集群。
如上图中的Cluster01A/02A和01B。
多集群部署可为您提供更大程度的隔离和可用性,但会增加复杂性。
如果系统具有高可用性要求,则可能需要集群跨多个可用区和地域。
对于应用变更或新的版本,可以在一个集群中配置金丝雀发布,这有助于把对用户的影响降到最低。
此外,如果某个集群有问题,可以暂时将流量路由到附近的集群,直到解决该问题为止。
网络模型
许多生产系统需要多个网络或子网来实现隔离和高可用性。 Istio 支持跨多种网络拓扑扩展服务网格。
单一网络
在最简单的情况下,服务网格在单个完全连接的网络上运行。 在单一网络模型中,工作负载实例 都可以直接相互访问,而无需 Istio 网关。
如下图非阴影部分,服务流量见红色连接
多网络
配置单个服务网格跨多个网络,这样的配置称为多网络。
多网络模型提供了单一网络之外的以下功能:
- 服务端点范围的 IP 或 VIP 重叠
- 跨越管理边界
- 容错能力
- 网络地址扩展
- 符合网络分段要求的标准
在此模型中,不同网络中的工作负载实例只能通过一个或多个 Istio 网关(黄底)相互访问。在单一网络内的服务流量可以直接访问。
控制平面模型
Istio 网格使用控制平面来配置网格内工作负载实例之间的所有通信。
单一控制平面服务网格
在最简单的情况下,可以在单一集群上使用控制平面运行网格。
多集群部署共享控制平面实例
在这种情况下,控制平面实例可以驻留在一个或多个集群中。
多个集群、区或地域之间部署控制平面
该模型具有以下优点:
-
更强的可用性:如果控制平面不可用,则不可用范围仅限于该控制平面。
-
配置隔离:您可以在一个集群、区域或地域中进行配置更改,而不会影响其他集群、区或或地域。
可以通过故障转移来提高控制平面的可用性。当控制平面实例不可用时,工作负载实例可以连接到另一个可用的控制平面实例。 故障转移可能发生在集群、区域或地域之间。
可用性对控制平面部署进行了排名:
每个地域一个集群(最低可用性)
每个地域多个集群
每个区域一个集群
每个区域多个集群
每个集群(最高可用性)
网格模型
单一网格
最简单的 Istio 部署是单一网格。
网格内,服务名称是唯一的。例如,在命名空间 foo 中只能存在一个名为 mysvc 的服务。 此外,工作负载实例具有相同的标识,因为服务帐户名称在命名空间中也是唯一的,就像服务名称一样。
单一网格可以跨越一个或多个集群和一个或多个网络。
网格内部,命名空间用于多租户。
多网格
- 网格联邦是在网格之间公开服务的一种行为,并且能跨越网格边界进行通信。每一个网格或许会公开其一部分的服务,使一个或多个其他网格使用此公开的服务。 可以使用网格联邦来启用网格之间的通信。
- 通过网格联邦可以实现多网格部署。
多网格具备以下更多功能:
组织边界:业务范围
服务名称或命名空间复用:比如 default 的使用
加强隔离:将测试工作负载与生产工作负载隔离
为避免服务命名冲突,可以为每个网格赋予全局唯一的 mesh ID,以确保每个服务的完全限定域名(FQDN)是不同的。
联合两个不共享同一信任域的网格时,必须 联合身份标识和它们之间的 trust bundles。