通过upstream实体可用高级负载均衡算法。
使用这些负载均衡器时,后端服务的添加和删除将由Kong处理,不需要进行DNS更新。Kong将充当服务注册表的角色。
通过上游和目标实体进行负载均衡器的配置。
- upstream:一个“虚拟主机名”,可以在服务主机字段中使用,例如,一个名为weather.v2.service的upstream将接收来自host=weather.v2.service的所有请求。upstream包含确定负载均衡行为(以及健康检查和熔断器配置)的属性。
- target:一个IP地址或带有端口号的主机名,用于指示后端服务所在的位置,例如“192.168.100.12:80”。每个target都有一个额外的权重,用于表示相对负载。IP地址可以是IPv4和IPv6格式。
Upstream
每个upstream可以有许多与之关联的target条目,对“虚拟主机名”进行代理的请求将在target之间进行负载均衡。
通过对Admin API进行简单的HTTP请求,可以添加和删除target。此操作相对廉价。但如果更改upstream本身(例如,插槽数量发生变化),则成本会更高,因为需要重新构建负载均衡器。
Target
一个Target(目标) 是一个具有端口的IP地址/主机名,用于标识后端服务的实例。每个upstream 可以有多个target 。
当有10倍于活动条目数量的非活动条目时,target 将被自动清理。清理将涉及重建负载均衡器,因此比仅添加目标条目更耗费资源。
Target还可以使用主机名而不是IP地址。在这种情况下,将解析该名称,并将找到的所有条目分别添加到环形负载均衡器中。例如,添加具有权重为100的api.host.com:123。名称“api.host.com”解析为具有2个IP地址的A记录。然后,这两个IP地址将被添加为target ,每个target 的权重都为100,端口为123。注意:权重是用于单个条目而不是整体!
如果解析到SRV记录,那么DNS记录中的端口和权重字段将被使用,将覆盖提供的端口123和权重100。
注意:与基于DNS的负载均衡类似,只有SRV记录中最高优先级的条目(最低值)将被使用。
负载均衡器将遵循DNS记录的TTL设置,在过期后会查询域名服务器并更新负载均衡器。
例外情况:当DNS记录的TTL为0时,主机名将被添加为单个目标,具有指定的权重。对于每个代理请求到该目标,它将再次查询域名服务器。
抗击负载均衡器
如在目标段落中描述的那样,目标可以指定为主机名。在像k8s或docker-compose这样的编排环境中,IP地址和端口大多是临时的,必须使用SRV记录来找到适当的后端,并保持更新。
在DNS级别上,许多基础设施工具也可以提供类似负载均衡的功能。这些工具大多是服务发现工具,它们具有自己的健康检查并对DNS记录进行随机化或仅返回一小部分可用的对等节点。
Kong负载均衡器和基于DNS的工具经常相互竞争。域名服务器将尽可能少地提供信息,以迫使客户端遵循其方案,而Kong则尽力确保所有后端正确设置其负载均衡器和健康检查。
在您的环境中,请确保:
- 当域名服务器无法将所有记录放入UDP响应中时,设置截断标志。这将强制Kong使用TCP进行重试。
- 允许在域名服务器上进行TCP查询。