服务网格用来描述组成应用程序的微服务网络以及它们之间的交互。随着服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理。
其需求包括服务发现、负载均衡、故障恢复、度量和监控等。服务网格通常还有更复杂的运维需求,比如 A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证。
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、日志、监控、配额、审查等解决方案集成。
数据平面 由一组智能代理(Envoy)组成,被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信。它们还收集和报告所有网格流量的遥测数据。
控制平面 管理并配置代理来进行流量路由。
Istio 使用 Envoy 代理的扩展版本。Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。
Envoy在Service Mesh世界中被广泛运用,除了Istio外,VMware Tanzu Service Mesh和AWS的App Mesh也使用它作为Sidecar组件。
Envoy 代理被部署为服务的 Sidecar,在逻辑上为服务增加了 Envoy 的许多内置特性,例如:
由 Envoy 代理启用的一些 Istio 的功能和任务包括:
Istiod 提供服务发现、配置和证书管理。
Istiod 将控制流量行为的高级路由规则转换为 Envoy 特定的配置,并在运行时将其传播给 Sidecar。Pilot 提取了特定平台的服务发现机制,并将其综合为一种标准格式。
Istiod 安全通过内置的身份和凭证管理,实现了强大的服务对服务和终端用户认证。
Istiod 充当证书授权(CA),并生成证书以允许在数据平面中进行安全的 mTLS 通信。
Istio 部署的独立配置维度:
在涉及多个集群的生产环境部署中,部署可能使用多种模式。
例如,基于 3 个集群实现多控制平面的高可用部署,可以通过使用单一控制平面部署 2 个集群,然后再添加第 3 个集群和 第 2 个控制平面来实现这一点,最后,再将所有 3 个集群配置为共享 2 个控制平面,以确保所有集群都有 2 个控制源来确保 HA。
应用程序的工作负载实例运行在一个或多个集群中。 针对隔离性、性能和高可用的需求,也可以将集群限制在可用区和地域中。
根据需求,生产系统可以跨多个集群(基于多可用区、多地域)运行, 借助云负载均衡器来处理诸如本地、区域或地域性故障转移之类的问题。
大多数情况下,集群代表着配置和端点发现的边界。
单一集群和单一网络模型包括一个控制平面,这是最简单的 Istio 部署。
可以将单个网格配置为包括多集群。 在单一网格中使用多集群部署,与单一集群部署相比其具备以下更多能力:
如果系统具有高可用性要求,则可能需要集群跨多个可用区和地域。
对于应用变更或新的版本,可以在一个集群中配置金丝雀发布,这有助于把对用户的影响降到最低。
此外,如果某个集群有问题,可以暂时将流量路由到附近的集群,直到解决该问题为止。
许多生产系统需要多个网络或子网来实现隔离和高可用性。 Istio 支持跨多种网络拓扑扩展服务网格。
在最简单的情况下,服务网格在单个完全连接的网络上运行。 在单一网络模型中,工作负载实例 都可以直接相互访问,而无需 Istio 网关。
如下图非阴影部分,服务流量见红色连接
配置单个服务网格跨多个网络,这样的配置称为多网络。
多网络模型提供了单一网络之外的以下功能:
在此模型中,不同网络中的工作负载实例只能通过一个或多个 Istio 网关(黄底)相互访问。在单一网络内的服务流量可以直接访问。
Istio 网格使用控制平面来配置网格内工作负载实例之间的所有通信。
该模型具有以下优点:
可以通过故障转移来提高控制平面的可用性。当控制平面实例不可用时,工作负载实例可以连接到另一个可用的控制平面实例。 故障转移可能发生在集群、区域或地域之间。
可用性对控制平面部署进行了排名:
每个地域一个集群(最低可用性)
每个地域多个集群
每个区域一个集群
每个区域多个集群
每个集群(最高可用性)
最简单的 Istio 部署是单一网格。
网格内,服务名称是唯一的。例如,在命名空间 foo 中只能存在一个名为 mysvc 的服务。 此外,工作负载实例具有相同的标识,因为服务帐户名称在命名空间中也是唯一的,就像服务名称一样。
单一网格可以跨越一个或多个集群和一个或多个网络。
网格内部,命名空间用于多租户。
多网格具备以下更多功能:
组织边界:业务范围
服务名称或命名空间复用:比如 default 的使用
加强隔离:将测试工作负载与生产工作负载隔离
为避免服务命名冲突,可以为每个网格赋予全局唯一的 mesh ID,以确保每个服务的完全限定域名(FQDN)是不同的。
联合两个不共享同一信任域的网格时,必须 联合身份标识和它们之间的 trust bundles。