介绍

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

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

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

健康与不健康目标

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

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

  • 如果返回的状态码是配置为“健康”的状态码,将增加目标的“success”计数器,并清除其所有其他计数器;
  • 如果连接失败,则增加目标的“TCP failure”计数器,清除“success”计数器;
  • 如果超时,将增加目标的“超时”计数器,清除“成功”计数器;
  • 如果返回的状态代码被配置为“不健康”,它将增加目标的“HTTP故障”计数器,并清除“成功”计数器。

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

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

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。

注意:

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

Types of health checks

Active health checks

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

活动健康检查的周期可以针对目标的健康或不健康情况单独配置。如果任意一个的间隔值设置为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中的所有计数器阈值和间隔默认为零,这意味着在新创建的上行流中,默认情况下完全禁用健康检查。

Kong(V1.0.2) Health Checks and Circuit Breakers Reference的更多相关文章

  1. Kong(v1.0.2)代理参考

    介绍 在本文中,我们将通过详细解释Kong的路由功能和内部工作原理来介绍它的代理功能. Kong公开了几个接口,可以通过两个配置属性进行调整: proxy_listen,它定义了一个地址/端口列表,K ...

  2. Kong(V1.0.2) Clustering Reference

    介绍 Kong集群允许您通过添加更多的机器来处理更多的传入请求来水平扩展系统.它们将共享相同的配置,因为它们指向相同的数据库.指向相同数据存储的Kong节点将是相同Kong集群的一部分. 您需要在Ko ...

  3. Kong(V1.0.2)loadbalancing

    介绍 Kong为多个后端服务提供了多种负载平衡请求的方法:一种简单的基于DNS-based的方法,以及一种更动态的环形负载均衡器ring-balancer,它还允许在不需要DNS服务器的情况下使用se ...

  4. Kong(v1.0.2)认证

    介绍 上游服务(api或微服务)的流量通常由各种Kong的authentication plugins的应用程序和配置控制.由于Kong的服务实体表示您自己的上游服务的一对一映射,所以最简单的场景是在 ...

  5. kubernetes系列:(一)、kubeadm搭建kubernetes(v1.13.1)单节点集群

    kubeadm是Kubernetes官方提供的用于快速部署Kubernetes集群的工具,本篇文章使用kubeadm搭建一个单master节点的k8s集群. 节点部署信息 节点主机名 节点IP 节点角 ...

  6. SharePoint Claim base authentication EnsureUser 不带claim(i:0#.w|)user Failed

    环境信息: 带有Form base authentication(FBA).Active Directory Federation Services(ADFS).以及windows Authentic ...

  7. POJ 3286 How many 0's?(几多0?)

    POJ 3286 How many 0's?(几多0?) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A Benedi ...

  8. Win7 下用 VS2015 编译最新 openssl(1.0.2j)包含32、64位debug和release版本的dll、lib(8个版本)

    Win7 64位系统下通过VS2015编译好的最新的OpenSSL(1.0.2j)所有八个版本的链接库, 包含以下八个版本: 1.32位.debug版LIB: 2.32位.release版LIB: 3 ...

  9. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)

    http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...

随机推荐

  1. 蓝牙协议分析(12)_LQ和RSSI的原理及应用场景

    在蓝牙协议栈的物理层,有这样两个比较有用的参数:LQI和RSSI.它们都是通过接收端,判断当前无线环境的质量(链路质量),以指导后续的动作.但这两个数值的计算原理和使用场景又有很大的差别. LQI ( ...

  2. Mac pip install mysql-python

    首次在mac os 下,用pip install MySQL-Python时经常出现如下错误: sh: mysql_config: command not foundTraceback (most r ...

  3. sqlalchemy执行sql语句

    #删除user表中的所有数据,表中的自增字段又从默认值开始 session.execute("truncate table user")

  4. Unity攻略

    Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  5. PHP常用函数(一):数组常用函数

    1.list() list() 和 array() 一样,不是一个函数,而是一个语言结构,作用是为一组变量赋值.  PHP手册中的介绍 使用详情 <?php //假设现在想为$a $b $c三个 ...

  6. ArcGIS中的坐标系:基本概念和常用操作(二)

    关于坐标系,上次的内容还没有结束. 上次已经解释清楚关于投影坐标系和地理坐标系的区别了,它们在实际应用上也有诸多不同. 下面这张图应该比较清晰 我们经常能发现,当计算面积时,提示面积已禁用,原因就在于 ...

  7. .NET数据采集

    public string GetHttpData(string Url) { string sException = null; string sRslt = null; WebResponse o ...

  8. 使用数据泵expdp、impdp备份和还原oracle数据库

    前面我已经整理过EXP 和 IMP备份和还原Oracle数据库的方法 今天我们只讲使用数据泵 expdp 和impdp的方法,有的同学会问他们有什么差别呢? EXP和IMP是客户端工具程序,它们既可以 ...

  9. mysql Incorrect usage of UNION and ORDER BY 错误备忘

    出现这个错误的语句是酱紫的 select xxx from aaa order by xxx union all select yyy from bbb order by yyy 错误原因居然是,如果 ...

  10. JavaScript线程(第八天)

    js是单线程的: js中的线程分为三种 1.页面渲染 2.主代码逻辑 3.事件触发: 下面我们来看一段代码 <script> setTimeout(function(){    conso ...