Dawn's Blogs

分享技术 记录成长

0%

Istio学习笔记 (2) 流量管理

Istio 的流量管理提供了以下功能:

  • 路由规则:Istio 提供流量路由规则,可以控制服务之间的流量和 API 调用。
  • 简化服务级别属性的配置:提供熔断器、超时、重试机制,透明的为服务增加弹性
  • 可设置重要任务:可以进行 A/B 测试、canary 部署和基于百分比流量分割的分阶段部署。
  • 开箱即用的故障恢复:使得应用更健壮地应对网络或者服务故障。

虚拟服务和目标规则

虚拟服务(Virtual Service)和目标规则(Destination Rule)是 Istio 流量路由功能的核心构建模块

虚拟服务

VirtualService 旨在解耦客户端请求的地址与响应请求的目标工作负载。使用虚拟服务,可以为一个或者多个主机名(host)制定流量行为,可以使用路由规则,配置路由目标地址。

如何理解客户的请求地址与实际响应的目标工作负载的解耦

客户端将虚拟服务视为一个单一实体,将请求发送至虚拟服务(这个过程中,客户的并不知道具体如何进行路由,它只知道一个虚拟服务的地址), 然后 Envoy 根据虚拟服务规则把流量路由到不同的版本。

在虚拟服务中,包括:

  • hosts 配置:虚拟服务应用的请求 host。
  • 路由规则:可以配置 HTTP 路由规则、TCP 路由规则等。一个路由规则包含零个或者多个匹配条件(从上到下进行匹配),以及对应的 Destination 目标地址(可以指定 DestinationRule 定义的子集)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http: # HTTP路由规则
- match: # 匹配条件
- headers:
end-user:
exact: jason
route:
- destination: # 目标
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3

除了进行路由之外,还可以:

  • 根据百分比分发请求。
  • 添加或者删除 header。
  • 重写 URL。
  • 为调用这一目标地址的请求设置重试策略。

目标规则

可以将虚拟服务视为将流量如何路由到给定目标地址, 然后使用 DestinationRule 来配置该目标的流量

目标规则可以对所有的实例进行分组,来控制到服务不同实例的流量。可以为目标规则,以及目标规则的某个子集来配置负载均衡、TLS 安全模式、熔断器配置等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-svc
trafficPolicy: # 总体的负载均衡策略
loadBalancer:
simple: RANDOM
subsets:
- name: v1 # 子集名称
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy: # 为子集配置特殊的负载均衡策略
loadBalancer:
simple: ROUND_ROBIN
- name: v3
labels:
version: v3

外部流量

Istio 还可以管理和控制外部流量,组件有网关和服务入口。

网关

Istio 使用网关来管理网格的出站和入站流量,网关配置被用于运行在网格边缘的独立 Envoy 代理, 而不是与服务工作负载一起运行的 Sidecar Envoy 代理。

Istio Gateway 可以配置 4-6 层的流量控制机制,如对外暴露的借口、TLS 设置、4-6 层的负载均衡等。但是无需配置 7 层路由,而是把 虚拟服务绑定到网关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ext-host-gwy
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- ext-host.example.com
tls:
mode: SIMPLE
credentialName: ext-host-cert

虚拟服务中绑定网关:

1
2
3
4
5
6
7
8
9
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtual-svc
spec:
hosts:
- ext-host.example.com
gateways:
- ext-host-gwy

服务入口

服务入口将一个外部目标添加到 Istio 内部的注册中心,添加了服务入口后,Envoy 代理可以向服务发送流量, 就好像它是网格内部的服务一样。配置服务入口允许管理运行在网格外的服务的流量(通过虚拟服务,或者目标规则中的 host 字段,进行管理):

  • 为外部目标重定向和转发请求。
  • 为外部目标定义重试、超时、故障注入策略。
  • 添加一个运行在虚拟机的服务,用于扩展网络。

弹性和测试

Istio 通过超时、重试、熔断器保证服务网格的弹性,通过故障注入测试应用的故障恢复能力。

弹性

Istio 通过超时、重试、熔断器保证服务网格的弹性。

  • 超时:Istio 可以在虚拟服务中配置超时,HTTP 请求的默认超时时间是 15 秒。
  • 重试:Istio 可以在虚拟服务中配置重试,Istio 默认的 HTTP 重试行为是 2 次重试,时间间隔是可变的,由 Istio 自动确定。
  • 熔断器:目标规则中配置熔断器。

测试

可以使用 Istio 的故障注入机制来为整个应用程序测试故障恢复能力,故障注入是一种将错误引入系统以确保系统能够承受并从错误条件中恢复的测试方法

与其他错误注入机制(如延迟数据包或在网络层杀掉 Pod)不同,Istio 允许在应用层注入错误。 因此可以注入更多相关的故障,例如 HTTP 错误码,以获得更多相关的结果。

可以注入两种故障,它们都使用虚拟服务配置:

  • 延迟:延迟是时间故障。它们模拟增加的网络延迟或一个超载的上游服务
  • 终止:终止是崩溃失败。他们模仿上游服务的失败。终止通常以 HTTP 错误码或 TCP 连接失败的形式出现。