五 Istio:使用服务网格Istio进行流量路由( 三 )

ISTIO_MUTUAL(与 MUTUAL 类似,使用 Istio 的 mTLS 证书) 。
4.2.5 端口流量策略注释:LEAST_CONN表示最少连接,ROUND_ROBIN表示轮询 , 轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同 。这有个前提 , 就是每个请求所占用的后端时间要差不多,如果有些请求占用的时间很长,会导致其所在的后端负载较高 。在这种场景下,把请求转发给连接数较少的后端,能够达到更好的负载均衡效果,这就是least_conn算法 。least_conn算法很简单,首选遍历后端集群 , 比较每个后端的conns/weight,选取该值最小的后端 。如果有多个后端的conns/weight值同为最小的 , 那么对它们采用加权轮询算法 。
使用 portLevelSettings 字段,我们可以将流量策略应用于单个端口 。比如说:
trafficPolicy:portLevelSettings:- port:number: 80loadBalancer:simple: LEAST_CONN- port:number: 8000loadBalancer:simple: ROUND_ROBIN五.高级路由5.1 高级路由在前面,我们了解了如何利用流量的比例(weight 字段)在多个子集之间进行流量路由 。在某些情况下,纯粹的基于权重的流量路由或分割已经足够了 。然而,在有些场景和情况下 , 我们可能需要对流量如何被分割和转发到目标服务进行更细化的控制 。
Istio 允许我们使用传入请求的一部分,并将其与定义的值相匹配 。例如,我们可以匹配传入请求的 URI 前缀,并基于此路由流量 。
属性描述uri将请求 URI 与指定值相匹配schema匹配请求的 schema(HTTP、HTTPS...)method匹配请求的 method(GET、POST...)authority匹配请求 authority 头headers匹配请求头 。头信息必须是小写的,并以连字符分隔(例如:x-my-request-id) 。注意,如果我们使用头信息进行匹配,其他属性将被忽略(urischemamethodauthority) 。上述每个属性都可以用这些方法中的一种进行匹配:

  • 精确匹配:例如,exact: "value" 匹配精确的字符串
  • 前缀匹配:例如,prefix: "value" 只匹配前缀
  • 正则匹配:例如,regex:"value" 根据 ECMAscript 风格的正则进行匹配
例如,假设请求的 URI 看起来像这样:https://dev.example.com/v1/api 。为了匹配该请求的 URI,我们会这样写:
http: - match:- uri:prefix: /v1上述片段将匹配传入的请求,并且请求将被路由到该路由中定义的目的地 。
另一个例子是使用正则并在头上进行匹配 。
http: - match:- headers:user-agent:regex: '.*Firefox.*'上述匹配将匹配任何用户代理头与 Regex 匹配的请求 。
5.2 重定向和重写请求在头信息和其他请求属性上进行匹配是有用的,但有时我们可能需要通过请求 URI 中的值来匹配请求 。
例如,让我们考虑这样一种情况:传入的请求使用 /v1/api 路径,而我们想把请求路由到 /v2/api 端点 。
这样做的方法是重写所有传入的请求和与 /v1/api 匹配的 authority/host headers 到 /v2/api
例如:
... http:- match:- uri:prefix: /v1/apirewrite:uri: /v2/apiroute:- destination:host: customers.default.svc.cluster.local ...即使目标服务不在 /v1/api 端点上监听,Envoy 也会将请求重写到 /v2/api
我们还可以选择将请求重定向或转发到一个完全不同的服务 。下面是我们如何在头信息上进行匹配,然后将请求重定向到另一个服务:
... http:- match:- headers:my-header:exact: helloredirect:uri: /helloauthority: my-service.default.svc.cluster.local:8000 ...redirectdestination 字段是相互排斥的 。如果我们使用 redirect,就不需要设置 destination
5.3 AND 和 OR 语义在进行匹配时 , 我们可以使用 AND 和 OR 两种语义 。让我们看一下下面的片段:
... http:- match:- uri:prefix: /v1headers:my-header:exact: hello ...上面的片段使用的是 AND 语义 。这意味着 URI 前缀需要与 /v1 相匹配,并且头信息 my-header 有一个确切的值 hello
要使用 OR 语义,我们可以添加另一个 match 项 , 像这样:
... http:- match:- uri:prefix: /v1...- match:- headers:my-header:exact: hello ...在上面的例子中,将首先对 URI 前缀进行匹配,如果匹配 , 请求将被路由到目的地 。如果第一个不匹配,算法会转移到第二个,并尝试匹配头 。如果我们省略路由上的匹配字段,它将总是评估为

推荐阅读