Istio的流量路由规则可让您轻松控制服务之间的流量和API调用。 Istio简化了诸如断路器,超时和重试之类的服务级别属性的配置,并使其易于设置重要任务(如A / B测试,canary部署和基于百分比的流量拆分的分段部署)。它还提供了开箱即用的故障恢复功能,有助于使您的应用程序更强大,以防止相关服务或网络的故障。

Istio整个流量控制模型,通过以下几个自定义资源实现:

GatewayServiceEntry以及Sidecars我们已经在之前的文章中讲述过。本文重点讲述VirtualService和DestinationRule。

VirtualService

VirtualService是Istio提供的自定义资源定义(CRD)。 VirtualService以及DestinationRule是Istio流量路由功能的关键组成部分。VirtualService使您可以在Istio和您的平台提供的基本连接和发现的基础上,配置如何将请求路由到Istio服务网格中的服务。每个VirtualService由一组路由规则组成,这些路由规则按顺序进行评估,从而使Istio将对VirtualService的每个给定请求匹配到网格内特定的实际目的地。

示例

我们接下来分析一个最简单的VirtualService,如下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - route:
    - destination:
        host: httpbin

hosts列出VirtualService的主机名--换句话说,这些路由规则适用于用户可寻址的目的地。这是客户端向服务发送请求时使用的地址。

VirtualService主机名可以是IP地址,DNS名称,也可以是短名称(例如Kubernetes服务短名称),具体取决于平台,该名称隐式或显式地解析为完全限定的域名(FQDN)。

然后,我们通过配置http属性来创建规则来定向与指定主机名匹配的所有HTTP通信。在该属性下,我们将destination设置为另一个称为httpbin的Service资源的路由规则。

通过这个简单的示例,我们可以看出,VirtualService 由主机名路由规则组成。

VirtualService资源除了路由匹配,并提供许多附加功能来治理流量。

路由匹配

VirtualService资源可以根据HTTP主机,路径(具有完整的正则表达式支持),方法,Header,端口,查询参数等来匹配流量。

例如:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
    - bookinfo.com
  http:
  - match:
    - uri:
        prefix: /reviews
    route:
    - destination:
        host: reviews
  - match:
    - uri:
        prefix: /ratings
    route:
    - destination:
        host: ratings

流量治理

此外VirtualService资源可以通过允许重试请求,注入错误或测试延迟,重写或重定向请求来智能地管理其匹配的流量。在基础结构层中实现此功能消除了每个单独的应用程序自己实现和管理它的需求,从而提供了更加一致的网络体验。

网络故障注入

向请求中注入错误是测试应用程序如何响应失败请求的好方法。下面是已配置为注入随机网络故障的VirtualService资源的YAML:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - route:
    - destination:
        host: httpbin
    fault:
      abort:
        percentage:
          value: 50
        httpStatus: 400 

%50的网络请求会被Istio中止。

网络延迟注入

网络调用的响应可被人为延迟,使您有机会测试不良的网络或无响应的应用程序如何影响您的代码。下面的VirtualService资源已配置为向网络请求添加随机延迟:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - route:
    - destination:
        host: httpbin
    fault:
      delay:
        percentage:
          value: 50
        fixedDelay: 5s 

配置为50%的网络请求添加5秒的延迟。

重定向请求

可以重定向HTTP请求(即,通过返回HTTP 301响应代码),以将客户端定向到新位置。下面的VirtualService资源将对一个Service资源的根路径的请求重定向到新Service资源上的新路径:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - match:
    - uri:
        exact: "/"
    redirect:
      uri: /redirected
      authority: httpbin1

重写请求

重写请求很像重定向请求,只有路由已在服务器端完成,并且客户端不知道请求已更改为新路径。下面的VirtualService资源将对一个Service资源的根路径的请求重写,并将其路由到新Service资源上的新路径:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - route:
    - destination:
        host: httpbin1
    match:
    - uri:
        exact: "/"
    rewrite:
      uri: /rewritten

我们使用与根路径完全匹配的请求将请求重写为http://httpbin1/rewrite

重试

重试失败的请求是处理网络错误或应用程序无响应的常见策略。下面的VirtualService资源将重试失败的请求:

piVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - route:
    - destination:
        host: httpbin
        subset: v1    
    retries:
      attempts: 3
      retryOn: "5xx" 

在这里,我们将VirtualService资源配置为重试任何导致500错误代码的请求,最多3次。

超时

超时是指Envoy代理应等待来自给定服务的响应的时间,以确保服务不会无限期地等待响应,并确保调用在可预测的时间内成功或失败。下面的VirtualService资源将请求超时时间设置为10s:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - route:
    - destination:
        host: httpbin    
    timeout: "10s" 

DestinationRule

除VirtualService外,DestinationRule也是Istio流量路由功能的关键部分。您可以将VirtualService视为如何将流量路由到给定的目的地,然后使用DestinationRule来配置该目的地的流量。在评估VirtualService路由规则之后,将应用DestinationRule,因此它们将应用于流量的“真实”目标。

特别是,您可以使用DestinationRule来指定命名的服务子集,例如按版本对所有给定服务的实例进行分组。然后,您可以在VirtualService的路由规则中使用这些服务子集,以控制流向服务的不同实例的流量。

例如:

这是将流量引导到名为v1的子集的VirtualService资源:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: helloworld
spec:
  hosts:
  - helloworld
  http:
  - route:
    - destination:
        host: helloworld
        # Route traffic to the Pods that match the labels defined in the DestinationRule v1 subset
        subset: v1 

这是定义v1和v2子集的DestinationRule资源:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: helloworld
spec:
  host: helloworld
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

DestinationRule主要包含负载均衡策略,安全配置和连接池设置三个方面。

负载均衡策略

Istio提供了多种不同的负载平衡算法来分配流量。缺省值为round-robin算法,该算法逐一循环遍历可用目标:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: helloworld
spec:
  host: helloworld
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

此外还支持以下负载均衡算法:

  • Random: 请求被随机转发到池中的实例。
  • Weighted: 根据特定百分比将请求转发到池中的实例。
  • Least requests: 请求将转发到请求数量最少的实例。

安全配置

Istio可以配置TLS设置,以确保通过双向TLS(mtls)对Pod资源之间的通信进行加密。
这些选项的效果对我们的应用程序是透明的,但是如果Pod资源要在节点之间进行通信,则可以防止窥探流量:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: helloworld
spec:
  host: helloworld
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

连接池设置

可以为服务资源定义网络设置,例如链接超时,保持活动状态,连接数等。
与安全设置一样,这些值对我们的应用程序是透明的,但可能会提高高流量负载的部署的性能:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: helloworld
spec:
  host: helloworld
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
        connectTimeout: 30ms
        tcpKeepalive:
          time: 7200s
          interval: 75s
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

总结

本文主要阐述了Istio流量控制模型中VirtualService和DestinationRule两种核心资源。因为所有的规则,最终都会转化为Envoy的配置。VirtualService实际上是对路由的抽象,而DestinationRule是对集群的抽象。


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。