使用 Istio

学习目标

  • 描述如何使用 Istio 执行流量管理以控制和路由流量

  • 说明如何保护服务间通信

  • 描述 Istio 的可观测性功能

  • 说明 Istio 如何集成到 SAP BTP, Kyma runtime 中

使用 Istio 进行流量管理:使用场景

你已经使用 APIRule 将服务公开给外部世界。为了保护和连接服务并对其进行监控,你希望使用 Istio 并进一步了解其功能和机制。

使用 Istio 进行流量管理

简而言之,流量管理是指控制服务网格中流量流向的能力。如果没有流量管理,请求会被路由到任何可用的服务实例。在许多情况下,这并不可取。例如,你希望基于规则重定向流量,比如仅将一定比例的流量转发到服务的新版本(即金丝雀部署)。或者,在你让客户使用服务的新版本之前,你希望先在内部对其进行测试。因此,你可以只将流量路由到最新服务版本以供内部用户使用(即内部试用,dogfooding)。流量管理使你能够实现这些场景。

流量管理图表的详细信息将在后续文本中说明。

该图描绘了一个场景:你只将一小部分流量路由到后端服务的新版本。流量在服务的先前版本和新版本之间分配。通过这样的设置,你可以在生产环境中仅针对一部分用户测试服务的新版本,并在出现问题时快速回滚。

如果服务的新版本按预期工作,你可以提高路由到服务新版本的流量比例。

但这是如何实现的呢?Istio 有一组 CustomResourceDefinitions(CRD),你可以使用它们来定义流量规则。

在 Istio 中,你可以使用多种资源进行流量管理:

Gateway

它是在网格边缘运行的负载均衡器。Gateway 处理传入或传出的 HTTP/TCP 连接。

VirtualService

描述影响流量路由的配置。你可以使用它在一个入口点(Gateway)后面公开多个服务。

DestinationRule

指定在路由之后应用于目标服务的流量的规则。

有关 Istio 流量管理资源的完整列表,请参见 Traffic Management

该图展示了 Istio Ingress Gateway 的设置,其中 Gateway、VirtualService 和 DestinationRule 将流量路由到 Service S,该 Service 有两个 Pod 子集(v1 和 v2)。

Gateway

在 Kubernetes 上安装 Istio 时,默认会安装一个 Ingress Gateway。该 Gateway 通过集群的外部 IP 地址公开。

你可以配置默认的 Istio Ingress Gateway,以使用自定义域名公开你的服务。你还可以配置多个 Gateway 资源,以通过不同域公开你的服务。在 Kyma 中,API Gateway 模块配置 Gateway kyma-gateway,该 Gateway 默认启用。

Gateway 资源如下所示:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: foo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*.foo.com"

VirtualService

你可以使用 VirtualService 资源,基于 HTTP 请求路径、标头或查询参数为你的服务定义路由规则。

VirtualService 资源如下所示:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: shop-route
spec:
gateways:
- foo-namespace/foo-gateway
hosts:
- shop.foo.com
http:
- route:
- destination:
host: shop
subset: v1
weight: 90
- destination:
host: shop
subset: v2
weight: 10

此 VirtualService 资源为 shop 服务定义了一条路由规则。该规则将 90% 的流量路由到服务的 v1 版本,将 10% 路由到 v2 版本。

Istio 支持更多用于定义路由规则的功能。你可以在 VirtualService 文档中找到更多相关信息。

DestinationRule

你可以使用 DestinationRule 按子集对 Kubernetes Service 进行分组,并为每个子集定义规则。

DestinationRule 资源如下所示:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: shop-route
spec:
host: shop
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2

在上面的示例中,shop 服务根据版本被分为两个子集。

要了解更多信息,请参见 DestinationRule 文档

Istio 的安全性

Istio 的安全功能允许你控制服务网格的安全性。使用 Istio,你无需自己实现流量加密等安全功能。Istio 通过加密流量,使你能够保护服务网格中服务间的通信。这些安全功能对于防御中间人攻击以及通过验证调用方身份来防止对服务的未授权访问至关重要。

保护集群中服务之间的通信是 Istio 的主要用例之一。Istio 通过双向 TLS(mTLS)提供流量加密,并允许你验证调用方的身份。双向 TLS 是一种允许客户端和服务器相互验证身份的协议。双向 TLS 是一种允许客户端和服务器相互验证身份的协议。与仅允许服务器验证客户端的 TLS 不同,mTLS 是一种通过相互出示证书来实现双向身份验证的协议。

要了解有关 Istio 安全功能的更多信息,请参见 Security

使用 Istio 实现可观测性

由于 Istio 会拦截服务网格中的所有流量,因此它可以为你提供所有服务通信的详细遥测数据。这些遥测数据提供了对服务网格的可观测性。为了基于收集到的遥测数据提供可观测性,Istio 提供以下类型:

指标

指标是用于跟踪系统状态的数值测量值。Istio 提供了一组指标,用于监控网格的运行状况,例如延迟、流量、错误等。

分布式追踪

在云原生微服务架构中,一个用户请求通常会流经数十个不同的微服务。借助分布式追踪,你可以追踪请求在整个服务网格中的路径。分布式追踪使你能够监控服务的性能并识别瓶颈。

访问日志

Istio 还可以为你提供流经服务网格的所有流量的访问日志。访问日志提供有关流量的详细信息,例如请求的源和目标或响应代码。

该图比较了没有分布式追踪(左)和有分布式追踪(右)的服务间连接,后者以蓝色突出显示各个请求路径。

Istio 在 SAP BTP, Kyma Runtime 中的集成

在 SAP BTP, Kyma runtime 中,Telemetry 模块提供了可观测性功能,可帮助你收集 Kyma 集群中的所有相关数据,例如由 Istio 服务网格提供的数据。Telemetry 模块还会丰富这些数据,并将其发送到后端以进行进一步分析。要了解更多信息,请参见 Describing Observability in Kyma

小结

Istio 提供了可用于管理流量并将其重定向到你的 Service 的 CRD,例如 Gateway、VirtualService 和 DestinationRule。此外,它还增强了服务间通信的安全性,并提供 mTLS 流量加密。Istio 还会为 Istio 服务网格内的所有服务通信生成遥测数据,例如指标、分布式追踪和访问日志。如果你想进一步分析这些数据,可以使用 Kyma 的 Telemetry 模块提供的功能。

延伸阅读

  • 可观测性

  • Istio 的流量管理功能

  • Istio 的安全功能

  • Istio 的可观测性功能