Kong(V1.0.2) Health Checks and Circuit Breakers Reference

介绍

您可让Kong代理的API使用ring-balancer,经过添加包含一个或多个目标实体的 upstream 实体进行配置,每一个 target指向不一样的IP地址(或主机名)和端口。ring-balancer将在各类目标之间负载,并基于上游对目标执行健康检查,使它们不管是否响应都是健康的或不健康的。而后,ring-balancer 只会将流量路由到健康的目标。算法

Kong有两种健康检查方法,可分别或同时使用:数据库

  • active checks主动检查,其中按期请求目标中的特定HTTP或HTTPS端点,并根据其响应肯定目标的健康状态;
  • passive checks被动检查(也称为断路器),Kong在其中分析正在代理的流量,并根据目标的行为响应请求来肯定目标的健康情况。

健康与不健康目标

健康检查功能的目标是为给定的Kong节点动态地将目标标记为健康或不健康。没有集群范围内的健康信息同步:每一个Kong节点分别决定其目标的健康。这是可取的,由于某个Kong节点能够链接到一个目标,但另外一个Kong节点未必能链接该目标:第一个节点将考虑它健康,而另外一个将其标记为不健康的,将请求路由到其余目标(健康)。json

主动探测(在主动健康检查上)或代理请求(在被动健康检查上)都会生成用于肯定目标是否健康的数据。请求可能会产生TCP错误、超时或HTTP状态代码。基于此信息,健康检查器更新一系列内部计数器:api

  • 若是返回的状态码是配置为“健康”的状态码,将增长目标的“success”计数器,并清除其全部其余计数器;
  • 若是链接失败,则增长目标的“TCP failure”计数器,清除“success”计数器;
  • 若是超时,将增长目标的“超时”计数器,清除“成功”计数器;
  • 若是返回的状态代码被配置为“不健康”,它将增长目标的“HTTP故障”计数器,并清除“成功”计数器。

若是任何“TCP失败”、“HTTP失败”或“超时”计数器达到其配置的阈值,目标将被标记为不健康。bash

若是“成功”计数器达到其配置的阈值,则将目标标记为健康。服务器

HTTP状态码为“健康”或“不健康”的列表,而且每一个计数器的独立阈值能够在每一个上游的基础上进行配置。下面,咱们有一个上游实体的配置示例,展现了用于配置健康检查的各类字段的默认值。每一个字段的描述包含在Admin API 参考文档中。并发

{ "name": "service.v1.xyz", "healthchecks": { "active": { "concurrency": 10, "healthy": { "http_statuses": [ 200, 302 ], "interval": 0, "successes": 0 }, "http_path": "/", "timeout": 1, "unhealthy": { "http_failures": 0, "http_statuses": [ 429, 404, 500, 501, 502, 503, 504, 505 ], "interval": 0, "tcp_failures": 0, "timeouts": 0 } }, "passive": { "healthy": { "http_statuses": [ 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 306, 307, 308 ], "successes": 0 }, "unhealthy": { "http_failures": 0, "http_statuses": [ 429, 500, 503 ], "tcp_failures": 0, "timeouts": 0 } } }, "slots": 10 }

若是上游的全部目标都不健康,Kong将返回503 Service Unavailable。负载均衡

注意:curl

  1. 健康检查仅对活动目标进行操做,不修改Kong数据库中目标的活动状态。
  2. 不健康的目标不会从负载均衡器中删除,所以在使用哈希算法时不会对均衡器布局产生任何影响(它们将被跳过)。
  3. DNS caveats and balancer caveats也适用于健康检查。若是对目标使用主机名,那么请确保DNS服务器始终返回名称的完整IP地址集,而且不限制响应。若是不这样作,可能会致使不执行健康检查。

Types of health checks

Active health checks

正如其名称所暗示的那样,主动健康检查会主动探测其健康的目标。当上游实体中启用活动健康状态检查时,Kong将按期向上游每一个目标的配置路径发出HTTP或HTTPS请求。这容许Kong根据探测结果probe results自动启用和禁用均衡器中的目标。tcp

活动健康检查的周期能够针对目标的健康或不健康状况单独配置。若是任意一个的间隔值设置为0,则在相应的场景中禁用检查。当二者都为零时,活动健康检查将彻底禁用。

注意:活动健康检查目前只支持HTTP/HTTPS目标。它们不适用于将协议属性设置为“tcp”或“tls”的服务的上行流。

Passive health checks (circuit breakers)

被动健康检查,也称为断路器,是根据Kong代理的请求(HTTP/HTTPS/TCP)执行的检查,不生成额外的流量。当目标变得无响应时,被动健康检查器将检测到该状况并将该目标标记为不健康。戒指均衡器将开始跳过这个目标,因此不会有更多的流量被路由到它。

一旦目标的问题获得解决,并准备再次接收流量,Kong管理员能够经过Admin API 端点手动通知健康检查程序应该再次启用目标,以下:

curl -i -X POST http://localhost:8001/upstreams/my_upstream/targets/10.1.2.3:1234/healthy
HTTP/1.1 204 No Content

此命令将广播一个集群范围的消息,以便将“健康”状态传播到整个Kong集群。这将致使Kong节点重置在Kong节点的全部worker中运行的health checkers的健康计数器,从而容许ring-balancer再次将流量路由到目标。

被动健康检查的优势是不会产生额外的流量,可是它们没法自动将目标再次标记为健康:“circuit is broken”,须要系统管理员从新启用目标。

Summary of pros and cons

  • 主动健康检查能够自动从新启用ring-balancer中的目标,只要它再次健康。被动的健康检查不能。
  • 被动健康检查不会给目标带来额外的流量。而主动健康检查会产生。
  • 主动健康检查程序要求将目标中具备可靠状态响应的已知URL配置为探测端点(能够简单到“/”)。被动健康检查不须要这样的配置。
  • 经过为主动健康检查器提供自定义探针端点,应用程序能够肯定本身的健康指标,并生成供Kong使用的状态代码。即便目标继续为在被动健康检查器看来健康的流量提供服务,它也可以以失败状态响应主动探测,本质上是请求从接受新流量中解脱出来。

把这两种模式结合起来是可能的。例如,能够启用被动健康检查,仅根据其流量监视目标健康情况,并在目标不健康时才使用主动健康检查,以便自动从新启用它。

Enabling and disabling health checks启用和禁用健康检查

Enabling active health checks启用积极的健康检查

要启用活动健康检查,须要指定healthchecks.active下的配置项,该配置项在Upstream object中处于活动状态。您须要指定必要的信息,以便Kong可以对目标执行按期探测,以及如何解释结果信息。

你可使用healthchecks.active.type属性以指定是执行HTTP仍是HTTPS探测(将其设置为“HTTP”或“HTTPS”),还能够经过简单的测试可否链接给定主机和端口的(将其设置为“tcp”)来指定。

要配置探测,您须要指定:

  • healthchecks.active.http_path - 向目标发出HTTP GET请求时应该使用的路径。默认值是“/”。
  • healthchecks.active.timeout -  探测的HTTP GET请求的链接超时限制。默认值是1秒。
  • healthchecks.active.concurrency - 在活动健康检查中要并发检查的目标数量。

您还须要为运行探测的间隔指定正值:

  • healthchecks.active.healthy.interval -对健康目标的活动健康检查之间的间隔(以秒为单位)。值为0表示不该该对健康目标执行主动探测。
  • healthchecks.active.unhealthy.interval - 活动健康检查不健康目标之间的间隔(秒)。值为0表示不该该对不健康的目标执行活动探测。

这容许您调整活动健康检查的行为,不管您但愿健康和不健康目标的探测以相同的间隔运行,仍是但愿一个比另外一个更频繁。

若是使用HTTPS healthcheck,还能够指定如下字段:

  • healthchecks.active.https_verify_certificate - 在使用HTTPS执行活动健康检查时,是否检查远程主机的SSL证书的有效性。
  • healthchecks.active.https_sni - 使用HTTPS执行活动健康状态检查时用做SNI(服务器名标识)的主机名。当使用IPs配置目标时,这尤为有用,这样目标主机的证书就能够用适当的SNI进行验证。

注意,失败的TLS验证将增长“TCP失败”计数器;“HTTP失败”仅指HTTP状态代码,不管探测是经过HTTP仍是HTTPS完成的。

最后,您须要配置Kong应该如何解释探测,方法是在health counters上设置各类阈值,一旦达到阈值将触发状态更改。反阈值字段为:

  • healthchecks.active.healthy.successes - 活动探测(由healthcheck .active.health .http_statuses定义)中考虑目标是否健康的成功次数。
  • healthchecks.active.unhealthy.tcp_failures - 活动探测中认为目标不健康的TCP失败或TLS验证失败的次数。
  • healthchecks.active.unhealthy.timeouts - 活动探测中认为目标不健康的超时次数。
  • healthchecks.active.unhealthy.http_failures - 活动探测(由healthcheck .active.unhealth .http_statuses定义)中考虑目标不健康的HTTP失败次数。

Enabling passive health checks

被动健康检查没有探测功能,由于它们经过分析来自目标流量来工做。这意味着,要启用被动检查,您只须要配置其计数器阈值:

  • healthchecks.passive.healthy.successes - 代理流量中的成功次数(由healthcheck .passive.health .http_statuses定义),以考虑目标的健康,如被动健康检查所观察到的。当启用被动检查时,这须要为正数,以便正常的流量重置不健康的计数器。
  • healthchecks.passive.unhealthy.tcp_failures - 被动健康检查所观察到的,代理流量中认为目标不健康的TCP失败次数。
  • healthchecks.passive.unhealthy.timeouts -经过被动健康检查观察到,代理通讯流中认为目标不健康的超时次数。
  • healthchecks.passive.unhealthy.http_failures -代理的流量(由healthchecks.passive.unhealthy.http_statuses定义)中HTTP失败的数量,以考虑目标不健康,如被动健康检查所观察到的。

Disabling health checks

在healthcheck配置中指定的全部计数器阈值和间隔中,将值设置为0意味着禁用该字段所表示的功能。将探测间隔设置为0将禁用探测。一样,您能够经过将某些类型的检查的计数器阈值设置为零来禁用它们。例如,要在执行healthcheck时不考虑超时,能够将两个超时字段(用于主动和被动检查)都设置为零。这为您提供了对健康检查器行为的细粒度控制。

总之,要彻底禁用上游的活动健康检查,您须要将healthcheck .active.health .interval和healthcheck .active.unhealth .interval都设置为0。

要彻底禁用被动健康检查,须要在healthcheck下设置全部计数器阈值。被动使其各类计数器为零。

healthcheck中的全部计数器阈值和间隔默认为零,这意味着在新建立的上行流中,默认状况下彻底禁用健康检查。

相关文章
相关标签/搜索