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


trafficPolicy:loadBalancer:consistentHash:httpCookie:name: locationttl: 4s4.2.2 连接池配置这些设置可以在 TCP 和 HTTP 层面应用于上游服务的每个主机,我们可以用它们来控制连接量 。
下面是一个片段,显示了我们如何设置对服务的并发请求的限制 。
spec:host: myredissrv.prod.svc.cluster.localtrafficPolicy:connectionPool:http:http2MaxRequests: 504.2.3 异常点检测异常点检测是一个断路器的实现,它跟踪上游服务中每个主机(Pod)的状态 。如果一个主机开始返回 5xx HTTP 错误,它就会在预定的时间内被从负载均衡池中弹出 。对于 TCP 服务,Envoy 将连接超时或失败计算为错误 。
下面是一个例子,它设置了 500 个并发的 HTTP2 请求(http2MaxRequests)的限制,每个连接不超过 10 个请求(maxRequestsPerConnection)到该服务 。每 5 分钟扫描一次上游主机(Pod)(interval),如果其中任何一个主机连续失败 10 次(contracticalErrors),Envoy 会将其弹出 10 分钟(baseEjectionTime) 。
trafficPolicy:connectionPool:http:http2MaxRequests: 500maxRequestsPerConnection: 10outlierDetection:consecutiveErrors: 10interval: 5mbaseEjectionTime: 10m4.2.4 客户端 TLS 设置包含任何与上游服务连接的 TLS 相关设置 。下面是一个使用提供的证书配置 mTLS 的例子 。
trafficPolicy:tls:mode: MUTUALclientCertificate: /etc/certs/cert.pemprivateKey: /etc/certs/key.pemcaCertificates: /etc/certs/ca.pem其他支持的 TLS 模式有 DISABLE(没有 TLS 连接),SIMPLE(在上游端点发起 TLS 连接),以及 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) 。上述每个属性都可以用这些方法中的一种进行匹配: