编辑– 这篇文章是10 篇系列文章的一部分:
您还可以下载完整的博客作为免费的电子书 -将 Kubernetes 从测试带到生产。
当组织首次开始尝试使用 Kubernetes 时,他们通常不会花太多心思考虑Ingress 控制器的选择。 他们可能认为所有的 Ingress 控制器都是一样的,为了快速启动和运行,最简单的方法是坚持使用他们选择的 Kubernetes 框架的默认 Ingress 控制器。 事实上,几乎任何 Ingress 控制器都适用于测试或小批量生产环境。 但随着规模的扩大,Ingress 控制器的选择变得更加重要。 这是因为 Ingress 控制器可以提供的不仅仅是将流量从 A 点移动到 B 点的基本功能。
从高级流量管理到可视性再到内置安全性,Ingress 控制器可以成为 Kubernetes 堆栈中最强大的工具之一。 事实上,在 F5 NGINX 我们认为它是任何生产级 Kubernetes部署的基础。 但是许多开发人员和平台运营团队并没有意识到 Ingress 控制器的全部功能,或者选择一个无法扩展的控制器的后果。 选择不能很好扩展或保护复杂环境的 Ingress 控制器可能会阻止 Kubernetes 脱离测试并投入生产。 在这个博客系列中,我们旨在让您了解 Ingress 控制器的基础知识,以及如何做出明智的选择,提供您现在和将来所需的功能和安全性。
Ingress 控制器是一种专门的负载均衡器,用于管理进入 Kubernetes 集群的第 4 层和第 7 层流量,以及可能离开集群的流量。 为了让我们达成共识,以下是我们在 NGINX 使用的术语(并且它们在整个行业中大致相同):
默认情况下,Kubernetes pod(容器)中运行的应用无法从外部网络访问,而只能从 Kubernetes 集群内的其他 pod 访问。 Kubernetes 有一个用于 HTTP 负载均衡的内置配置对象,称为Ingress ,它定义了 Kubernetes 集群之外的实体如何连接到一个或多个 Kubernetes 服务所代表的 pod。
当你需要为你的 Kubernetes 服务提供外部访问时,你可以创建一个Ingress 资源来定义连接规则,包括 URI 路径、支持服务名称和其他信息。 然而,Ingress 资源本身并不执行任何操作。 您必须部署和配置 Ingress 控制器应用(使用 Kubernetes API)来实现 Ingress 资源中定义的规则。
kube-proxy
流量分配模型,为您提供了额外的控制,类似于应用交付控制器 (ADC) 和反向代理在非 Kubernetes 环境中提供的控制。在选择 Ingress 控制器时,您可能很想从功能列表开始,但最终可能会选择具有出色功能但不能满足您的业务需求的 Ingress 控制器。 相反,一定要探索影响 Ingress 控制器为您的团队和应用程序运行效果的两个因素:用例(它将解决哪些问题)和资源(您将如何“支付”它)。 我们将在本博客的其余部分讨论这两个主题。
Ingress 控制器的核心用例是流量管理,因此您可能希望 Ingress 控制器处理以下一个或多个常见用例:
但没有理由满足于“一招鲜”——大多数 Ingress 控制器能做的不仅仅是管理流量。 通过使用 Ingress 控制器解决多个问题,您不仅可以减少堆栈的大小和复杂性,还可以将非功能性需求从应用程序转移到 Ingress 控制器。 让我们看一下四种非传统 Ingress 控制器用例,它们可以帮助您的 Kubernetes 部署更加安全、灵活、可扩展,同时更有效地利用您的资源。
缺乏对 Kubernetes 集群的可见性是生产环境中最大的挑战之一,导致故障排除和恢复能力困难。 由于 Ingress 控制器在 Kubernetes 集群的边缘运行并接触每一点流量,因此它们可以很好地提供数据来帮助您解决(甚至避免)两个常见问题:应用程序运行缓慢和 Kubernetes 集群或平台中的资源耗尽。 为了使 Ingress 控制器提高可见性,它需要:
除非您希望在 Kubernetes 中执行请求响应操作,否则 Ingress 控制器很可能可以兼作您的 API 网关。 根据其功能集,Ingress 控制器可能能够提供核心 API 网关功能,包括 TLS 终止、客户端身份验证、速率限制、细粒度访问控制以及第 4 层到第 7 层的请求路由。
将登录凭据从 Kubernetes 服务卸载到 Ingress 控制器可以解决两个问题。
并不是说 Ingress 控制器可以充当 Web应用防火墙 (WAF),而是 WAF 可以与 Ingress 控制器合并。 尽管 WAF 可以在 Kubernetes 内部和外部的许多地方部署,但对于大多数组织而言,最有效的位置是与 Ingress 控制器位于同一 pod 中。 当安全策略受 SecOps 或 DevSecOps 指导,并且需要细粒度、每个服务或每个 URI 的方法时,此用例是完美的。 这意味着您可以使用 Kubernetes API 来定义策略并将其与服务关联。 此外,Ingress 控制器的基于角色的访问控制 (RBAC) 功能可以使 SecOps 按照侦听器强制执行策略,而 DevOps 用户则按照 Ingress 资源设置策略。
每个 Ingress 控制器都是有成本的...即使是免费和开源的控制器(也许你听过“像小狗一样免费”这句话)。 一些成本可以分配为预算中的可预测金额,而其他成本则取决于您的团队需要花费多少时间来处理选择哪种 Ingress 控制器所带来的后果(复杂性增加、缺乏可移植性等)。 让我们看看在为 Ingress 控制器制定预算时需要考虑的成本——时间和金钱。
编制员工预算比编制固定成本项目预算要困难得多,尤其是当您试图在陌生的领域为项目提供资源时。 你需要问以下问题:
我们观察到业界有一种趋势,即将工具和所有权整合到 NetOps 团队的管辖范围内。 虽然这在很大程度上可以简化您的堆栈并提高安全性,但我们主张根据团队目标深思熟虑地复制工具。 让 NetOps 团队管理外围工具(如外部负载均衡器)是有意义的,因为他们专注于更广泛的平台,但 DevOps 团队最关心部署在应用程序代码附近的服务,并且需要比 NetOps 工具更高的灵活性和更细粒度的控制。 Kubernetes 工具(包括 Ingress 控制器)在被 DevOps 选中时最有可能获得成功。 这并不是说您必须授予开发人员完全的选择工具的自由! Kubernetes中一些工具的严格标准化仍然是一种最佳实践。
当组织首次尝试使用 Kubernetes 时,他们通常不会在工具或支持上投入太多预算。 如果您拥有人力资源来真正支持需要更多“手动指导”的 Ingress 控制器,那么一开始不需要任何资金预算也是可以的。 但是随着您对 Kubernetes 的投资增加,您可能会发现自己受到该工具功能的限制,或者希望让您的团队专注于其他优先事项。 这时候,人们就会倾向于购买更易于使用、更稳定、具有企业功能和支持的工具。
当您准备购买 Ingress 控制器时,请注意许可模式很重要。 根据 Kubernetes 之外的传统定价模型,Ingress 控制器的定价通常是“按实例”或“按 Ingress 代理”。 虽然在 Kubernetes 中这仍然有意义,但以“每个集群”为基础许可 Ingress 控制器意味着您根据应用租户而不是“代理数量”付费。
以下是我们针对不同场景的建议:
现在您已经了解了您的需求,下一步是作为一个团队决定您对 Ingress 控制器可能引入的风险的容忍度,并确定随着 Kubernetes 部署的扩大,您需要如何扩展 Ingress 控制器。 我们将在第二部分讨论这些主题。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”