官方文档
Envoy的服务发现并未采用完全一致的机制,而是假设主机以最终一致的方式加入或离开网格,它结合主动健康状态检查机制来判定集群的健康状态;
- 健康与否的决策机制以完全分布式的方式进行,因此可以很好地应对网络分区;
- 为集群启用主机健康状态检查机制后,Envoy基于如下方式判定是否路由请求到一个主机;
- 发现失败,单健康检查正常,此时,无法添加新主机,但现有主机将继续正常运行。
Discovery Status | Health Check OK | Health Check Failed |
---|---|---|
Discovered | Route | Dont’t Route |
Absent | Route | Don’t Route / Delete |
故障处理机制
Envoy提供了一系列开箱即用的故障处理机制:
- 超时(timeout)
- 有限次数的重试,并支持可变的重试延迟
- 主动健康检查与异常探测
- 连接池
- 断路器
所有这些特性,都可以在运行时动态配置;结合流量管理机制,用户可为每个服务/版本定制所需的故障恢复机制;
健康状态监测
健康状态检测用于确保代理服务器不会将下游客户端的请求代理至工作异常的上游主机;
Envoy支持两种类型的健康状态检测,二者均基于集群进行定义:
主动检测(Active Health Checking):Envoy周期性地发送探测报文至上游主机,并根据其响应判断其健康状态;Envoy目前支持三种类型的主动检测:
- HTTP:向上游主机发送HTTP请求报文
- L3/L4:向上游主机发送L3/L4请求报文,基于响应的结果判定其健康状态,或仅通过连接状态进行判定;
- Redis:向上游的redis服务器发送Redis PING;
被动检测(Passive Health Checking):Envoy通过异常检测(Outlier Detection)机制进行被动模式的健康状态检测;
目前,仅htp router、tcp proxy和redis proxy三个过滤器支持异常值检测;
Envoy支持以下类型的异常检测:
- 连续5XX:意指所有类型的错误,非htp router过滤器生成的错误也会在内部映射为5xx错误代码;
- 连续网关故障:连续5XX的子集,单纯用于http的502、503或504错误,即网关故障;
- 连续的本地原因故障:Envoy无法连接到上游主机或与上游主机的通信被反复中断;
- 成功率:主机的聚合成功率数据阀值;
主动健康状态监测
集群的主机健康状态检测机制需要显式定义,否则,发现的所有上游主机即被视为可用;
定义语法
|
|
主动健康监测:TCP
tcp类型监测
|
|
空负载的tcp检测意味着仅通过连接状态判定其检测结果;
非空负载的cp检测可以使用send和receive来分别指定请求负荷及于响应报文中期望模糊匹配的结果;
主动健康监测:HTTP
http类型的检测可以自定义使用的 path
、host
和期望的响应码等,并能够在必要时修改(添加/删除)请求报文的标头
具体配置语法如下
|
|
配置示例
|
|
|
|
|
|
异常主机驱逐机制
确定主机异常一>若尚未驱逐主机,且已驱逐的数量低于允许的阀值,则已经驱逐主机一>主机处于驱逐状态一定时长一>超出时长后自动恢复服务。
异常探测通过outlier_dection字段定义在集群上下文中
|
|
同主动健康检查一样,异常检测也要配置在集群级别;下面的示例用于配置在返回3个连续5xx错误时将主机弹出30秒;
|
|
在新服务上启用异常检测时应该从不太严格的规则集开始,以便仅弹出具有网关连接错误的主机(HTTP503),并且仅在10%的时间内弹出它们;
|
|
同时,高流量、稳定的服务可以使用统计信息来弹出频繁异常容的主机;下面的配置示例将弹出错误率低于群集平均值1个标准差的任何端点,统计信息每10秒进行一次评估,并且算法不会针对任何在10秒内少于500个请求的主机运行
|
|
离群值检测:HTTP
docker-compose
|
|