upstream概念及作用
upstream是指位于Kong网关之后的上游API/service,即客户端请求被Kong网关转发到的目标地址。在Kong网关中,upstream表示虚拟主机名,可用于:
- 健康检查
- 熔断
- 负载均衡。
在实际生产环境中,upstream可以指向部署在不同ip和端口的服务(target),在Kong网关的service中代替具体的单个target的配置,结构图如下:
负载均衡器以轮询等方式对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。