流量管理

Istio的流量路由规则可以轻松控制服务之间的流量和API调用。Istio简化了断路器、超时和重试等服务级属性的配置,并使设置A/B测试、金丝雀发布和基于百分比的分阶段发布等重要任务变得容易。它还提供了开箱即用的可靠性功能,帮助应用程序更好地应对依赖服务或网络故障。

Istio的流量管理模型依赖于与服务一起部署的Envoy代理。网格服务发送和接收的所有流量(数据平面流量)都通过Envoy代理,因此可以在不对服务进行任何更改的情况下,轻松地在网格中引导和控制流量。

虚拟服务

虚拟服务目标规则是Istio流量路由功能的关键构建块。通过虚拟服务配置请求如何在Istio服务网格内路由到某个服务。每个虚拟服务包含一组按顺序评估的路由规则,通过这些规则,Istio将每个到虚拟服务的请求匹配到特定真实的目标地址。

虚拟服务示例

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v3

host字段

hosts字段列出了虚拟服务的主机,也就是说,这些路由规则适用的用户可访问的目标。这是客户端在向服务发送请求时使用的地址

虚拟服务主机名可以是IP地址、DNS名称或者Kubernetes服务名。也可以使用通配符("*")前缀,为所有匹配的服务创建一组路由规则。虚拟服务主机不必是Istio服务注册表的一部分,它们只是虚拟的目标地址。

路由规则

http部分包含虚拟服务的路由规则,描述了匹配条件和路由行为,将HTTP/1.1、HTTP2和gRPC流量路由到hosts字段中指定的目标地址。路由规则由流量到达的目标地址和零个或多个匹配条件组成,具体取决于具体的使用情况。

路由规则按顺序从上到下进行评估,虚拟服务定义中的第一条规则具有最高优先级。建议在每个虚拟服务的最后一条规则中提供一个默认的“无条件”或基于权重的规则,以确保流向虚拟服务的流量始终至少有一条匹配的路由。

目标规则

与虚拟服务一样,目标规则也是Istio流量路由功能的关键部分。你可以将虚拟服务视为如何将流量路由到给定目标地址,然后使用目标规则来配置该目标的流量。在评估虚拟服务路由规则之后,目标规则将应用于流量的“真实”目标地址。

特别是,可以使用目标规则来指定命名的服务子集,例如按版本为所有给定服务的实例分组。然后可以在虚拟服务的路由规则中使用这些服务子集来控制到服务不同实例的流量。

目标规则还允许你在调用整个目标服务或特定服务子集时自定义Envoy的流量策略,例如负载均衡、TLS安全模式或断路器设置。

负载均衡选项

默认情况下,Istio使用最少请求负载均衡策略,其中请求分配给请求数量最少的实例。Istio还支持以下模型:

  • 随机:请求随机转发到池中的实例。

  • 加权:请求根据特定百分比转发到池中的实例。

  • 轮询:请求按顺序转发到每个实例。

目标规则示例

在下面的示例中,目标规则为my-svc目标服务配置了3个具有不同负载均衡策略的子集:

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

每个子集都是基于一个或多个标签定义的,在Kubernetes中,标签是附加到对象(如Pod)的键/值对。这些标签在Kubernetes服务的部署中作为元数据应用,以识别不同的版本。

除了定义子集外,该目标规则还为此目标中的所有子集设置了一个默认流量策略,并为特定子集设置了一个覆盖默认策略的子集特定策略。默认策略定义在subsets字段之上,为v1和v3子集设置了一个简单的随机负载均衡器。在v2策略中,在相应的子集字段中指定了一个轮询负载均衡器。

最后更新于