入口控制器可能看起来只是Kubernetes领域中的一个小部件。许多人认为它们是低价值的商品,但实际上它们可以成为你堆栈中的一个强大工具。正确部署和配置后,入口控制器可以从根本上简化Kubernetes集群的运维,同时增强安全性并提高性能和弹性。
入口控制器通过其他工具或解决方案提供的许多功能来实现这一点。由于入口控制器是专门为Kubernetes设计的,因此它们可以更轻松地承担这些功能,而不是试图将现有的技术结构(如负载均衡器、API网关和应用程序交付控制器(ADC))调整到Kubernetes的奇特世界。入口控制器的多功能性是其如此强大的部分原因。
为什么需要入口控制器?
入口控制器对于定义和管理Kubernetes中的入口(南北)流量至关重要,Kubernetes是一个比非Kubernetes应用程序更复杂的入口环境。
默认情况下,外部网络和流量无法访问Kubernetes pod(和容器)中运行的应用程序。Kubernetes内部的pod只能在它们之间进行交流。Kubernetes确实有一个用于HTTP(第7层)负载均衡的内置配置对象,称为入口。此对象定义Kubernetes集群之外的实体如何连接到标有一个或多个Kubernetes服务的pod。当需要提供对Kubernetes服务的外部访问时,可以创建入口资源来定义连接规则。这包括URI路径、支持服务名称和其他信息。然而,入口资源本身不做任何事情。必须部署和配置入口控制器应用程序(使用Kubernetes API)以实现入口资源中定义的规则。
换句话说,你确实需要部署一个入口控制器来利用Kubernetes的现有资源和对象结构。不这样做意味着要更加努力地使用服务对象和外部设备的组合来创建更详细的规则。无入口控制器方法不可扩展,成本昂贵,需要大量时间。
入口控制器如何使用(或替代)负载均衡器
入口控制器可以独立工作以均衡和控制流量,也可以与负载均衡器一起工作以释放Kubernetes的强大功能并提供更好的应用程序性能。
需要注意的是:“LoadBalancer”服务与专用负载均衡器不同。
入口控制器有时被描述为Kubernetes的“专用负载均衡器”。这就引出了一个问题:你需要负载均衡器和入口控制器吗?答案是:视情况而定。有时你需要根据使用该工具的用户和部署位置进行一些功能复制。
对于许多用例,特别是当要扩展Kubernetes或在高合规性环境中时,组织同时部署入口控制器和负载均衡器。尽管它们部署在不同的地方,用于不同的目的,由不同的团队管理。
负载均衡器(或ADC):
管理人:NetOps(或SecOps)团队
部署:在Kubernetes之外,作为向集群之外的用户提供的服务和应用程序的唯一面向公众的端点。用作更通用的设备,旨在促进安全性并提供更高级别的网络管理。
入口控制器:
管理人:平台运维或DevOps团队
部署:在Kubernetes内部实现细粒度南北负载均衡功能(HTTP2、HTTP/HTTPS、SSL/TLS终端、TCP/UDP、WebSocket、gRPC)。让应用程序团队配置的某些方面,如URI或路径,以及高级反向代理或API网关功能。
在这个图中,负载均衡器处理多个集群之间的流量分布,而集群具有入口控制器,以确保服务的平均分布。
入口控制器=安全工具
入口控制器可以为应用程序安全提供一个粒度和集成的层,用于“左移”安全状态,并更好地与应用程序团队(而不是NetOps或全球安全团队)使用的低级安全工具集成。
入口控制器可以成为安全武库中的关键工具,帮助你将安全性转移到左侧,更好地满足微服务和现代应用程序的需求和风险。入口控制器的一些关键安全优势包括:
阻止通过配置不当的负载均衡器直接访问pod——入口控制器充当第二层访问控制,以防全局负载均衡器配置漂移到不安全的设置。
强制执行MTL——由于入口控制器设计为在节点和pod级别运行,并且是运行在服务之上的控制回路,因此它们是实施加密行为的最佳位置,最接近实际应用程序。
异常检测和执行——入口控制器使处理异常(可能是不良行为的指示)的逻辑规则变得更容易。在全球层面上,这些异常现象可能难以理解或衡量。尽管对于管理微服务的小型团队来说,生成这种逻辑的最佳场所是DevOps和服务开发人员自己;他们知道自己的流量应该是什么样子,应该应用什么规则。
与WAFs的更紧密集成——在大多数情况下,任何在Kubernetes部署生产应用程序的人都需要使用web应用程序防火墙(WAF)来保护应用程序和集群。WAFs可以过滤坏流量并保护暴露的应用程序。这就是说,与异常检测一样,配置为在企业环境的全局级别进行保护的WAF就像钝的工具,不适合在应用层实现更细粒度的安全性。因此,许多团队现在在入口层的Kubernetes内部运行自己的WAF,并与全局WAF分开管理。这些特定于应用程序的WAF更易于在入口控制器级别进行管理、集成和配置,了解该应用程序的团队可以在该级别设置入口/出口和安全策略。
入口控制器=API网关
入口控制器以Kubernetes原生方式结合了大多数API网关功能,在提高性能的同时降低了复杂性和成本。
采用入口控制器的最佳原因之一是成本节约和简单。因为入口控制器是一个专门的代理,它有可能满足更多传统代理(负载均衡器/反向代理或ADC)可以实现的许多相同的用例。这包括许多负载均衡和API网关功能,例如:TLS/SSL终端、客户端身份验证、速率限制、重新启动和超时、细粒度访问控制、第4层和第7层的按请求路由、蓝/绿和金丝雀部署、传统协议(UDP、TCP)的路由、新协议的路由(gRPC)、标题和请求/响应操作、SNI路由、基于高级服务/pod健康规则的路由。
注意:“API网关”经常被当作一个独特的产品来讨论。事实上,这是一组可以通过代理完成的用例。通常,负载均衡器、ADC或反向代理被实现为API网关。然而,在NGINX,我们越来越多地看到入口控制器和服务网格被用于API网关功能。
你不必在入口控制器和标记为API网关的工具之间找到功能奇偶性,这没关系。在Kubernetes中,你实际上并不需要所有这些额外的功能,尝试实现它们可能会带来麻烦。Kubernetes中两个最适用的API网关用例是流量管理(协议、整形、拆分)和安全性(身份验证、端到端加密)。考虑到这一点,你需要一个入口控制器来处理以下事项:
方法级路由/匹配;
身份验证/授权卸载;
基于授权的路由;
协议兼容性(HTTP、HTTP/2、HTTP/3、WebSocket、gRPC)。
开发人员会感谢你,因为入口控制器允许他们以Kubernetes原生方式(声明式/命令式YAML)定义API网关或负载均衡器函数,这很容易适应他们的工作流。法律和财务团队也会感谢您,因为成本更低,要跟踪的许可更少。最后,客户和用户可以获得更好的体验,因为从流量路径中删除额外的控制元素必然会带来更好的性能。
入口控制器=可观察性和监控性
入口控制器监控所有进出的流量,这意味着入口控制器有可能提供一个轻量级、集成且易于管理的监控和可观察层。
因为它位于集群前面,控制L4-L7流量和传统或非HTTP协议流量,所以入口控制器有权查看应用程序和基础设施的运行状况。这是强大和有用的。你可以轻松地将流量监控从现有的数据和控制平面扩展到可观测工具,如Prometheus。事实上,大多数入口控制器都与著名的CNCF监控和可观测工具(如Prometheus和Grafana)进行了原生集成。你可以使用入口控制器解决两个用例:
慢速应用程序:如果你的应用程序速度慢或崩溃,具有实时监控功能的入口控制器可以帮助准确定位问题所在。每秒请求数低可能表示配置错误,而响应时间延迟可能表示上游应用程序存在问题。
HTTP错误:如果集群或平台资源不足,你可以使用入口控制器中的历史数据来查找趋势。这就是Grafana这样的工具对于可视化数据特别有用的地方。
对于一些服务网格、负载均衡器和其他Kubernetes风格的网络工具,创建监控和可观察性会增加负载和延迟。此外,它们无法以与入口控制器相同的粒度级别解析流量。由于入口控制器不需要向配置文件和Kubernetes堆栈添加额外的CRD或对象,因此可以避免不必要的复杂性和延迟。毕竟,部署的CRD越多,Kubernetes就越复杂。
结论:入口控制器不仅仅控制入口
希望现在你能更了解为什么入口控制器是Kubernetes网络的无名英雄,不使用它是一个错误。以下是一些注意事项:
并非所有的入口控制器都能够服务于本文讨论的各种用例。NGINX博客系列“入口控制器选择指南”可以帮助你确定需求、避免风险、经得起未来考验并在复杂的入口控制器环境中自如。
如果你的入口规则设计不好,并且pod资源不足,那么入口控制器可能会减慢应用程序的速度。但是,如果设计好了规则,那么在集群边缘安装入口控制器的名义成本将只是在性能方面所能实现的改进的一小部分。
入口控制器仍在不断改进和添加功能——事实上,网关API的发布是社区对入口控制器投资的一个很好的例子。
对入口控制器的押注就是对Kubernetes未来的押注。由于构建现代应用程序的目的是构建松耦合的服务,并使开发人员能够更加独立,因此部署入口控制器可以加快应用程序开发并加快迭代。Kubernetes网络工具的瑞士军刀正是普通开发人员或DevOps团队所需要的,即智能、高效和安全地移动应用程序之间的流量。
原文链接:
https://thenewstack.io/ingress-controllers-the-swiss-army-knife-of-kubernetes/
《Docker中Image、Container与Volume的迁移》
免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!
原文始发于微信公众号(Docker中文社区):入口控制器:Kubernetes的瑞士军刀
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论