Kong网关upstream健康检查机制

时间:2024-03-19 15:41:53

upstream概念及作用

upstream是指位于Kong网关之后的上游API/service,即客户端请求被Kong网关转发到的目标地址。在Kong网关中,upstream表示虚拟主机名,可用于:

  • 健康检查
  • 熔断
  • 负载均衡。

在实际生产环境中,upstream可以指向部署在不同ip和端口的服务(target),在Kong网关的service中代替具体的单个target的配置,结构图如下:

Kong网关upstream健康检查机制

负载均衡器以轮询等方式对upstream中配置的target进行负载,并对target进行健康检查,Kong仅将流量路由到健康的target。

 

健康检查

健康检查方式

健康检查的目的是动态地将target标记为健康或不健康的状态。每个Kong服务节点分别确定target的运行状况,而不会在集群范围内同步target的健康信息。因为其中的一个Kong服务节点可能成功连接到target,而另一个Kong节点则无法连接到target,第一个Kong服务节点将target标记为健康,第二个Kong节点将target标记为不健康,并将流量路由到其它target。

 Kong支持两种健康检查,可以单独使用或结合使用:

主动检查(active checks):定期请求目标中特定的HTTP或HTTPS的endpoint,根据其响应确定目标的运行状况;

被动检查(passive checks):也被称为断路器,该模式下Kong通过分析代理的实时流量,根据其响应的状态确定目标的运行状况。

 

判定target是否健康

两种检查方式都会产生用于判断target是否健康的数据,一次客户端调用可能会产生TCP错误、超时或产生特定的HTTP状态码,根据这些信息,健康检查程序会更新其内部的相关计数器:

  • 如果target返回的状态码为“健康”状态,将增加target的“成功”计数器,并清除所有其他计数器;
  • 如果Kong和target连接失败,将增加target的“TCP失败”计数器,并清除“成功”计数器;
  • 如果Kong获取target的响应超时,将增加目标的“超时”计数器,并清除“成功”计数器;
  • 如果target返回“不健康”的状态码,将增加目标的“HTTP失败”的计数器,并清除“成功”计数器

如果“TCP失败”、“HTTP失败”或“超时”计数器中的任意一个达到配置的阈值,target将被标记为不健康状态。

如果“成功”计数器达到配置的阈值,则target将被标记为正常。

配置HTTP状态代码为“健康”或“不健康”,以及这些计数器中每个计数器的各自阈值都可在upstream上进行配置。

如果upstream整体处于“不健康”状态(可用容量百分比小于配置的阈值),则Kong对客户端返回503 Service Unavailable。

注意:

  • 健康检查仅对活动的target进行操作,而不会在Kong数据库中修改target的活动状态;
  • 不健康的target不会从loadbalancer中删除,因此在使用散列算法时不会对负载均衡器的布局产生任何影响(不健康的target将被跳过)。
  • DNS警告和负载均衡警告也适用于健康检查。如果target使用是hostname,应该确保DNS服务器总是返回hostname的完整IP地址集,并且不限制响应,否则,可能会导致不执行运行状况检查。(没搞明白什么意思)

判定Upstreams是否健康

除了针对单个target的健康检查之外,upstream也具有运行健康概念。 upstream的运行状况取决于其target的状态。

upstream通过healthchecks.threshold属性来进行健康状态的配置,即upstream最小可用target的“权重”(容量)百分比,健康target/总target数。

例如:

upstream配置了healthchecks.threshold属性为55

有5个target,每个target的权重= 100,因此ring-balancer的总权重为500。

当故障发生,第一个target被标记为“不健康”状态。 此时在ring-balancer中,有20%的target不健康,该值高于55的阈值,因此其余target将继续提供服务。

若有三个target都为“不健康”的状态,则只有40%的可用target,低于55%的阈值,upstream的状态为“不健康”。

upstream一旦进入“不健康”状态,Kong将不再转发请求,直接向客户端返回错误,使服务有时间可以从级联故障中恢复。

一旦target恢复“健康”状态,且target可用容量超过阈值,环形负载均衡器的健康状态也会自动被更新。

 

主动健康检查会主动探测target的健康状态。 在upstream中启用主动健康检查后,Kong会定期向上游的每个target配置的路径发出HTTP或HTTPS请求。 这样,Kong可以根据探测结果自动启用和禁用负载均衡中的target。