什么是Service Mesh

中文名:服务网格,是一种用于管理和协调服务之间通信的基础设施层。在现代的分布式应用程序中,由于服务的数量庞大且相互之间的依赖关系复杂,管理服务之间的通信和网络流量成为一项具有挑战性的任务。服务网格通过在应用程序的网络层引入一个透明的代理层来解决这个问题。

服务网格通常由一组专门设计的代理组成,这些代理与应用程序中的每个服务实例一起部署,并负责处理诸如服务发现、负载均衡、安全认证、故障恢复等通信方面的功能。通过将这些功能从应用程序代码中分离出来,服务网格提供了一种集中式的方式来管理和控制服务之间的通信。

服务网格还提供了一些附加功能,例如流量控制、可观察性和监控、故障注入和熔断等。这些功能可以帮助开发人员和运维团队更好地理解和管理分布式应用程序的行为,并提供了一些强大的工具来应对故障和问题。

常见的服务网格实现包括Istio、Linkerd和Consul等。这些实现通常基于开放的标准和协议,如Envoy代理和Service Mesh Interface(SMI)规范,以确保它们的兼容性和互操作性。

总之,服务网格是一种为复杂的分布式应用程序提供通信管理和控制的基础设施层,它通过引入专门设计的代理来简化和增强服务之间的通信,同时提供了一些附加功能来提高应用程序的可观察性和可靠性。

什么是Istio

参考官网: https://istio.io/latest/zh/about/service-mesh/

官网一句话介绍:Simplify observability, traffic management, security, and policy with the leading service mesh.

翻译过来,就是:通过领先的服务网格简化可观测性,流量管理,安全及策略。

Istio-1

Istio 是一个开源服务网格,它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码。它强大的控制平面带来了重要的特点,包括:

  • 使用 TLS 加密、强身份认证和授权的集群内服务到服务的安全通信
  • 自动负载均衡的 HTTP, gRPC, WebSocket,和 TCP 流量
  • 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制
  • 一个可插入的策略层和配置 API,支持访问控制、速率限制和配额
  • 对集群内的所有流量(包括集群入口和出口)进行自动度量、日志和跟踪

Istio 是为可扩展性而设计的,可以处理不同范围的部署需求。Istio 的控制平面运行在 Kubernetes 上,您可以将部署在该集群中的应用程序添加到您的网格中,将网格扩展到其他集群,甚至连接 VM 或运行在 Kubernetes 之外的其他端点。

Istio 由两个部分组成:控制平面和数据平面。

  • 数据平面是业务之间的通信平面。如果没有一个服务网格,网络就无法理解正在发送的流量,也无法根据它是哪种类型的流量,或者它从谁那里来,到谁那里去做出任何决定。服务网格使用代理拦截所有的网络流量,允许根据您设置的配置提供广泛的应用程序感知功能。代理与您在集群中启动的每个服务一起部署,或者与运行在虚拟机上的服务一起运行。
  • 控制平面获取您所需的配置和服务视图,并动态地对代理服务器进行编程,随着规则或环境的变化更新它们。

Istio-2

Istio相关概念

1、流量管理

Istio 的流量路由规则可以让您轻松地控制服务之间的流量和 API 调用。 Istio 简化了服务级别属性(如断路器、超时和重试)的配置,并使设置重要任务(如 A/B 测试、canary 部署和基于百分比的流量分割的分阶段部署)变得容易。 它还提供了开箱即用的故障恢复特性,帮助您的应用程序更健壮地应对依赖服务或网络的故障。

2、可观测性

Istio 为服务网格内的所有通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观测性,使运营商能够排除故障、维护和优化其应用。 更好的是,它不会给服务开发人员带来任何额外的负担。通过 Istio,操作人员可以全面了解被监视的服务如何与其他服务以及 Istio 组件本身交互。

Istio 的遥测技术包括详细的指标、分布式跟踪和完整的访问日志。有了 Istio,您就可以得到全面全面的服务网格可观察性。

3、安全性能

微服务有特殊的安全需求,包括防止中间人攻击、灵活的访问控制、审计工具和相互的 TLS。 Istio 包括一个全面的安全解决方案,使运营商能够解决所有这些问题。 它提供了强大的身份、强大的策略、透明的 TLS 加密,以及验证、授权和审计(AAA)工具来保护您的服务和数据。

Istio 的安全模型是基于默认安全的,旨在提供深度防御,允许您部署安全的应用程序,甚至跨不可信的网络。

Istio架构

1、Istio逻辑划分

Istio 服务网格从逻辑上分为数据平面和控制平面。

  • 数据平面 由一组智能代理(Envoy)组成, 被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信。 它们还收集和报告所有网格流量的遥测数据。
  • 控制平面 管理并配置代理来进行流量路由。

下图展示了组成每个平面的不同组件:

arch

2、核心组件

Envoy(数据面)

Istio 使用 Envoy 代理的扩展版本。Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。

Envoy 代理被部署为服务的 Sidecar,在逻辑上为服务增加了 Envoy 的许多内置特性,例如:

  • 动态服务发现
  • 负载均衡
  • TLS 终端
  • HTTP/2 与 gRPC 代理
  • 熔断器
  • 健康检查
  • 基于百分比流量分割的分阶段发布
  • 故障注入
  • 丰富的指标

这种 Sidecar 部署允许 Istio 可以执行策略决策,并提取丰富的遥测数据, 接着将这些数据发送到监视系统以提供有关整个网格行为的信息。

Sidecar 代理模型还允许您向现有的部署添加 Istio 功能,而不需要重新设计架构或重写代码。

由 Envoy 代理启用的一些 Istio 的功能和任务包括:

  • 流量控制功能:通过丰富的 HTTP、gRPC、WebSocket 和 TCP 流量路由规则来执行细粒度的流量控制。
  • 网络弹性特性:重试设置、故障转移、熔断器和故障注入。
  • 安全性和身份认证特性:执行安全性策略,并强制实行通过配置 API 定义的访问控制和速率限制。
  • 基于 WebAssembly 的可插拔扩展模型,允许通过自定义策略执行和生成网格流量的遥测。

Istiod(控制面)

Istiod 提供服务发现、配置和证书管理。

Istiod 将控制流量行为的高级路由规则转换为 Envoy 特定的配置, 并在运行时将其传播给 Sidecar。Pilot 提取了特定平台的服务发现机制, 并将其综合为一种标准格式,任何符合 Envoy API 的 Sidecar 都可以使用。

Istio 可以支持发现多种环境,如 Kubernetes 或 VM。

您可以使用 Istio 流量管理 API 让 Istiod 重新构造 Envoy 的配置,以便对服务网格中的流量进行更精细的控制。

Istiod 安全通过内置的身份和凭证管理, 实现了强大的服务对服务和终端用户认证。您可以使用 Istio 来升级服务网格中未加密的流量。 使用 Istio,运营商可以基于服务身份而不是相对不稳定的第 3 层或第 4 层网络标识符来执行策略。 此外,您可以使用 Istio 的授权功能控制谁可以访问您的服务。

Istiod 充当证书授权(CA),并生成证书以允许在数据平面中进行安全的 mTLS 通信。

说明:在1.15版本之前,控制面并没有istiod这个组件,而是有几个核心组件:Pilot、Galley、Citadel、Mixer等,这几个组件采用微服务模式,组件之间有界限隔离,复杂度很高,配置难度大。1.16版本Istiod官方将控制面直接合成了一个组件istiod,其实功能上还是之前组件的功能。

合并后,优势:

  • 简化安装复杂度
  • 简化配置复杂度
  • 简化控制面维护
  • 问题定位更加容易
  • 提高了效率及相应能力

再来看看这几个核心组件都负责什么呢?

Pilot

Pilot 是Istio实现流量管理的核心组件,它主要的作用是配置和管理Envoy代理。比如可以为代理之间设置特定的流量规则,或者配置超时、重试、熔断这样的弹性能力。Pilot会将控制流量行为的路由规则转换为Envoy的配置,并在运行时将它们广播到Envoy。另外,Pilot还能够把服务发现机制抽象出来并转换成API分发给Envoy,使得后者具有服务发现的能力。

简单来说,Pilot的主要任务有两个:

  • 从平台(如Kubernetes)获取服务信息,完成服务发现。
  • 获取Istio的各项配置,转换成Envoy代理可读的格式并分发。

Citadel

Citadel 用于提供服务间的安全通信和身份验证。

Citadel 是 Istio 的一部分,用于管理和颁发服务之间的安全凭证,以确保安全的服务通信。它的主要功能包括:

  • 证书管理:Citadel 负责生成和管理服务之间的 Transport Layer Security (TLS) 证书。它可以自动为每个服务生成证书,这些证书用于进行服务之间的安全通信。
  • 身份验证:Citadel 实施了服务间的身份验证机制,确保只有经过身份验证的服务能够相互通信。它使用证书对服务进行身份验证,并确保只有具有有效证书的服务才能接收和发送数据。
  • 安全凭证分发:Citadel 为服务提供安全凭证,包括身份验证所需的证书和密钥。这些凭证可以被其他组件使用,例如 Envoy 代理,以确保安全的服务通信。
  • 证书轮换:Citadel 可以自动管理证书的轮换和更新。它能够在证书过期之前为服务自动颁发新的证书,确保服务的持续安全通信。

Galley

Galley负责管理和配置整个 Istio 系统。

Galley 的主要作用包括以下几个方面:

  • 配置管理:Galley 负责收集、验证和分发配置信息给 Istio 系统中的其他组件。它从配置源(例如 Kubernetes ConfigMap 或文件系统)中获取配置,并确保配置的有效性和一致性。
  • 配置校验和转换:Galley 对配置进行校验,确保配置满足 Istio 的要求和规范。它会检查配置的语法、格式和合法性,并在必要时进行转换,以便其他组件能够正确理解和使用配置。
  • 配置分发:Galley 将经过校验和转换的配置信息分发给 Istio 系统中的其他组件,例如 Pilot和 Citadel。这样,每个组件就能够获得其需要的配置信息,并根据配置来完成相应的任务。
  • 事件处理:Galley 监听并处理与配置相关的事件,例如配置的变更或更新。它会及时响应事件,并确保相关组件能够获取最新的配置信息。
  • 一致性保证:Galley 通过验证和分发配置,确保整个 Istio 系统中的各个组件都使用相同、一致的配置。这有助于避免配置不一致性带来的问题,并提供了系统级别的配置管理和控制。