本文转自 Rancher Labs
在 Kubernetes 中,Ingress 对象定义了一些路由规则,这些规则规定如何将一个客户端请求路由到指定服务,该服务运行在你的集群中。这些规则可以考虑到输入的 HTTP 消息的独特方面,包括其 Host 请求头和 URL 路径,这将允许你在请求中使用数据发现将流量从一个服务发送到另一个服务。那意味着你能够使用 Ingress 对象来为许多不同的应用程序定义路由。
虽然 Ingress 对象定义路由,但 Ingress Controller 是驱动它们的引擎。Ingress Controller 是一个位于客户端和服务之间的代理,其作用是正确地传递消息。目前市面上已经有几个项目实现了 Ingress Controller 规范,每个项目都有其优势。Rancher 提供了一个基于 NGINX 的默认 controller,但你并不需要局限于此。Rancher 已经和 HAProxy 达成合作,因此你也可以选择使用 HAProxy Ingress Controller。我们倾向于把 HAProxy Ingress Controller 看作是一个完美的 Kubernetes 的涡轮增压引擎,能够充分提升 Kubernetes 的使用效率。
HAProxy Ingress Controller 的特性
你可以在 Rancher 应用商店中找到 HAProxy,此外你还可以在 HAProxy 的官方文档(https://www.haproxy.com/docum…)中找到 HAProxy 的安装细节。设置完成之后,HAProxy 将会自动监听和实现 Ingress 规则。此时,你可以选择禁用 NGINX Ingress Controller 或保持两个 Ingress controller 都运行并通过名称指定其中一个。
HAProxy 的功能特性包括以下内容:
零宕机重载
包括 NGINX Ingress Controller 在内的许多代理类型,重载都会导致短暂的时间窗口,此时后端服务不可用。在许多情况下,当 HAProxy 需要刷新其配置时,它可以完全避免重新加载。
它的 Runtime API 允许完全在内存中实现更改。然而,由于 HAProxy 的无中断重载,需要重载的更改不会导致停机。这意味着,无论你何时从 Ingress 规则中添加或删除路径、更新 Secret 或更改注释都不会对流量产生影响。
增压性能
由于 HAProxy 对性能的关注,你会发现每秒可处理的请求数会立即受到影响——明显增加。此外,通过弹性二进制树等独特的算法,HAProxy 比其他 controller 使用更少的资源。
可观察性
使用 Stats 页面、Runtime API 和 raw configuration,你可以轻松查看配置好的 Pod 以及相关联的后端和它们的健康状态。默认的 Ingress controller 会要求你安装 krew 以查看这一信息。
HAProxy 提供大量有关流向你的集群的流量指标。在 HAProxy Stats 页面上,你将找到用于跟踪请求率、响应时间、活动连接、成功和错误响应以及通过的数据量的统计数据。这篇文章(https://www.haproxy.com/blog/…)介绍了所有提供的指标,这些指标也是通过 Prometheus 端点暴露的。
HAProxy 会发布详细的日志,其中包含请求时间数据,可以让你精确地指出请求中的慢速,断开代码将显示请求终止的方式和原因,以及显示整个集群中的活跃连接数。
可调整的负载均衡
与其他 Ingress Controller 相比,HAProxy 提供了更多的负载均衡算法,包括轮询法(Round Robin)、最小连接和基于哈希的算法。这种选择很重要,因为不同类型的服务在不同类型的负载分布中表现出色。例如,保持连接时间较长的服务在使用最小连接算法时表现更好,该算法在向服务器发送新客户端之前检查服务器的繁忙程度。你可以在你的 Ingress 对象中通过添加一个名为 haproxy.org/load-balance 的注释来定义,使用均衡文档中列出的值(https://www.haproxy.com/docum…)。
一旦你启用 HTTPS,HAProxy 就会自动启用端到端的 HTTP/2。NGINX 在客户端支持 HTTP/2,同时 HAProxy 也支持通过 HTTP/ 2 连接到你的 pods。此外,HAProxy 还支持 gRPC 服务的端到端 streaming。
增强的安全性
诸如白名单 IP 地址以及强制速率限制等安全功能形成了一个重要的保护层。使用 HAProxy,这些功能都能够立刻实现并且你可以使用注释调整它们。当你的集群托管多个服务时,速率限制是至关重要的,因为你一定不会希望一个服务占用所有的带宽。
过载保护队列
HAProxy 的连接队列提供了对流量峰值的保护。通过在 Kubernetes 服务上设置 pod-maxconn 注释,一组 pod 会获得最大并发连接数限制,额外的连接数会被排队,从而防止 pod 超载。
结 论
本文介绍了 HAProxy 的 6 个主要特性,可以帮助你更清晰地了解 HAProxy Ingress Controller 的优势。如果你还想更深入地了解 HAProxy,你也可以通过 Rancher 应用商店轻松部署它,并根据官方文档(https://www.haproxy.com/docum…)的指引进行尝试才能对其有更深入的了解和体会,也能帮助你选出合适自己的 Ingress Controller。