一文读懂 Kubernetes Ingress Controller 选型实践

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Hello folks,众所周知,Ingress 对于任何成功的 Kubernetes 集群部署拓扑架构都至关重要,尤其是在自建的容器云平台。 Ingress 允许我们在实际的业务场景中能够基于当前的网络环境定义外部(或内部)流量以及其如何路由至集群内的服务。


    Hello folks,众所周知,Ingress 对于任何成功的 Kubernetes 集群部署拓扑架构都至关重要,尤其是在自建的容器云平台。 Ingress 允许我们在实际的业务场景中能够基于当前的网络环境定义外部(或内部)流量以及其如何路由至集群内的服务。  

   


    在 Kubernetes 官方文档中针对 Ingress 的定义及定位:

    “可以将 Ingress 配置为向服务提供外部可访问的 URL、负载均衡流量、终止 SSL / TLS 并提供基于名称的虚拟主机。”

    然而,Ingress 本身并没有做任何事情——它们只是元数据。繁重的工作则由 Ingress Controller 即“入口控制器”执行,这也意味着缺少 Ingress Controller 的入口是无法完成任何事情。

    当然,除此之外,我们还面临一个问题:虽然有许多系统控制器(如 ReplicaSet 控制器、端点控制器、命名空间控制器等)由 Kubernetes 控制平面管理,但 Ingress Controller 并不会因容器集群的状态而自动存在。因此,我们需要在特定的环境中安装、配置和管理自己的 Ingress Controller

    通常,在实际的业务环境中,在同一个集群中也可以存在多个 Ingress Controller。我们可以基于 Ingress 类注释来划分路由空间,以便每个 Ingress 知道应该由哪个 Ingress Controller 来处理其流经的请求。最终还可能会针对同一集群中的不同业务场景使用 Ingress Controller 组合以实现业务架构需要。例如,在某一特定的场景中,可能存在一个入口控制器用于处理流经集群的外部流量,包括与 SSL 证书的绑定等等,而另一个没有 SSL 绑定的内部入口控制器则用来处理集群内流量。

    截目前基于不同的业务场景和技术架构,业界活跃着多种风格的 Ingress Controller 可供选择。Kubernetes 官方文档在也列出了常见的 Ingress 控制器,具体可参考链接所示:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#additional-controllers

    上述这些 Controller 往往具有不同的功能集以及不同级别的社区、平台或商业支持。有些是粹的边缘路由器,而另一些则具有更类似于服务网格的功能特性。

Ingress Controller 选型要素分析

    那么如何选择合适的 Ingress Controller(入口控制器)呢?在前期的技术规划以及选型时往往有几个重要的核心参考标准需要关注。在本文中,我不打算在特定的 Ingress Controller 类型之间进行功能比较,毕竟,目前互联网上已经有很多相关文章对其进行直接比较,而且 Ingress Controller 种类也比较多。相反,我将讨论在选择 Ingress Controller 时应该权衡哪些关键特性,以支撑现有的业务发展。

    1、 流量协议

   基于特定的业务场景,我们首先需要明确所定义的技术架构,以及基于架构所选取的技术框架。比如,我们是否需要路由 HTTP(S)、HTTP/2 还是 Websockets?技术实现是否支持路由 TCP/UDP 还是 gRPC?

    在实际的业务场景中,并非所有 Ingress Controller 都支持所选这些协议,因此,我们需要定义并检查所选Ingress Controller 支持哪些协议。基于当前的 Ingress,无论是  Kubernetes Ingress、Nginx Ingress、Kong Ingress、Traefik Ingress、APISIX Ingress 甚至 Ambassador Ingress,其基本的协议均得以支持,比如,HTTP(S)、HTTP/2、TCP、UDP 以及 gRPC 等。故此,在满足基础的协议功能外,我们还需要依据实际的业务场景去对其他层面进行对比。

    2、动态配置更新

    是否存在这样一种场景:为使我们的业务能够持续性正常提供服务,往往需要零停机时间的配置更新——通常,也称为“无中断重新加载”或“热加载”。

    在实际的业务场景中,我们需要对某一组件进行配置更新,往往需要进行人工重启以使其生效,例如,传统的 Nginx 组件需要停机才能更新配置,而其他 Ingress Controller 则无需停机即可动态更新。例如,Traefik Ingress 。其动态配置由 Provider 自己提供,这里包含了定义系统如何处理请求的所有内容,此配置可以被无缝热加载,无需外界干预,没有任何请求中断或连接损耗,以实现组件配置的自定义更新。

    3、 可扩展性

    在日常的项目维护过程中,我们是否需要在边缘进行速率限制、重试或断路器,或者是否有必要将此功能内置到我们的服务中?其实,在某些特定的场景中,一些 Ingress Controller 可支持这些功能,这意味着我们不必自己投入过多的时间花费在编写代码之上。

    除此之外,我们是否与外部托管的基于云的负载均衡器集成?确保所选择的 Ingress Controller 能够与外部负载均衡器很好地集成,以减少我们的网络团队的工作和管理。

    最后,也是至关重要的一项,我们所选用的 Ingress Controller 能否进行动态的二次开发以适应不同的协议、平台及环境诉求。

    4、服务网格

    Ingress Controller 可以配置为处理外部流量(源自集群外部的流量)、内部流量或两者兼而有之。如果我们需要观测或跟踪内部流量,可能需要一种特殊的入口控制器——服务网格。Kubernetes 通过 SMI 规范为服务网格提供互操作性标准。

    基于实际的业务场景,我们如果确实需要服务网格,那么则需要确保为正确的工作选择正确的工具。毕竟,Ingress Controller 和 Service Mesh 两者不是相互排斥的。


    5、API 网关

    在实际的业务场景中,我们到底是需要 Ingress Controller 或 API 网关,还是两者兼而有之?这个是我们需要关注的地方。就使用规范及用途而言,API 网关通常集成业务逻辑,而边缘路由器通常则与业务无关。例如,API 网关能够帮助我们监控每个客户的流量,或衡量交易以进行计费。如果我们需要边缘的业务逻辑,可能应该查看 API 网关而不是 Ingress 控制器。就像服务网格一样,入口控制器和 API 网关并不是相互排斥的。


   

    其实,在实际的技术选型或微服务上云容器化场景中,我们可以根据当前的系统架构进行适应性网络拓扑改造,可能在传统的网络拓扑架构中,我们的接入层和网关层隶属于不同的技术体系,选用不同的组件去实现。

    然而,随着微服务架构的成熟化,传统的接入层和网关层可使用同一个云原生组件去实现,例如 Traefik 组件,其不仅支持接入层所具备的流量接入、路由转发功能,同时,基于其 Middleware 框架实现网关层相关功能,例如,访问控制、认证鉴权等。在某些特定的业务场景中,其不仅优化网络拓扑,而且能够做到一举双得之效。

    6、 高可用性

    当服务器因计划内或计划外维护而重新启动时,我们的业务能否承受停机以及停机时长?除此之外,随着业务量的增长,当前的接入层架构能否得住所涌入的流量请求而造成单点故障,导致业务受损?若基于此种场景,那么,我们需要为 Ingress 控制器提供高可用性,以满足其因外界导致的业务异常情况。

    基于当前市面上所提供的解决方案,并非所有的 Ingress Controller 都支持高可用性。因此,我们往往需要基于当前的数据中心需求建设而进行方案决策,以满足实际的业务要求。

    7、负载均衡算法

    Load Balancing 用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到资源使用最优化、吞吐率最大化、响应时间最小化以及同时避免过载的目的。用于解决互联网架构中的高并发和高可用的问题。

   对于负载均衡我们往往有多种选择,从传统的 Round-Robin 到非传统的 Rdp-Cookie 以及 Sticky Sessions(粘滞会话)在这里也很常见。我们需要哪种基于算法的路由?大多数的 Ingress Controller 都支持循环,但如果我们想要最少的连接以考虑服务负载,那么将需要一个支持更高级负载均衡算法的 Ingress Controller

    毕竟,负载均衡有时往往不能简单通过请求的负载来作为负载均衡的唯一依据。其需要结合服务的当前连接数量、最近响应时间等维度进行总体均衡,总而言之,就是为了达到资源使用的负载均衡,以获取最大的效益。

    8、 发布策略

    在我们所应用的容器云平台,我们是否需要执行金丝雀发布(将一定比例的流量转移到不同的服务以进行渐进式升级)?是否执行灰度发布、滚动发布?以及是否执行蓝绿发布?负载均衡允许分散服务的负载,但并非所有负载均衡器都可以使用更复杂的规则进行流量拆分。如果使用金丝雀测试等技术在生产环境中进行测试,那么我们则需要确保所选择的 Ingress Controller 能够支持流量转移。



    9、 技术支撑度

    在进行技术选型过程中,我们往往需要问下自己、团队,需要其他企业、社区支持吗?我们是否有足够的能力去应付此组件所发生的潜在风险?毕竟,开源的 Ingress Controller 很容易部署实施及落地应用,然而,当我们面对未知的异常或错误以及当我们在后半夜需要技术支撑时会发生什么情况?自我研究?求助社区?当然,一些开源 Ingress 控制器也提供企业支持计划,我们可以基于此种服务进行技术求助,从而获得相关解决方案。

    10、 生态拥抱性

   最后一个便是生态成熟度,毕竟,随着技术的革新、周边衍生平台的崛起,我们所选择的组件,如 Ingress Controller 是否能够在 Kubernetes 合作伙伴生态系统中得到进一步的支持与扩展,毕竟,任何产品都是有生命周期。

    11、其他关联属性

    除了上述核心特性外,一些关联属性也需要值得斟酌,就集群中的资源而言,我们所采用的技术框架是否对成本敏感?公司团队规模如何?是否有强大的技术团队去支撑?从本质而言,Ingress Controller 可能是资源密集型的,因此如果我们对成本比较敏感,那么使用轻量级的 Ingress Controller 或许会更好。毕竟,一些 Ingress Controller 支持向上和向下扩展,而另一些则不支持。

    针对资源监控层面而言,是否需要与现有的指标和日志收集系统集成?一些 Ingress Controller 提供有限的监控和日志记录,可能不支持当前系统架构所选用的特定监控和日志记录工具。除此之外,针对路由匹配、全链路追踪也需要应给予合理的决策。

结论

    如上述所述,在为容器集群选择正确的 Ingress Controller 之前,往往需要考虑诸多因素。不能仅选择一个以“炒作驱动”为聚焦点的流行选项,毕竟,所有的选型都是为业务服务,故此,我们需要仔细斟酌我们的业务诉求,然后根据上面列出的参考标准进行评估。若基于此种规范或标准,我们则能够将对基础架构的一个清晰的认识以及对核心环节做出明智的决策。

    对于大规模部署微服务架构的企业来说,强大的网络解决方案是必不可少的。无论是传统的 F5 厂商,还是国内外各大容器云厂商,其均能够提供基于各自平台的 Ingress Controller 组件。

    Traefik Enterprise 将 API 管理、入口控制和服务网格组合在一个简单的控制平面中。它与生态系统无关、高度可用、高度自动化,并提供专门的技术支持。因此,如果大家正在评估 Ingress Controller 的话,不妨可以尝试一下 Traefik Ingress 。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
16天前
|
Kubernetes 持续交付 开发者
探索并实践Kubernetes集群管理与自动化部署
探索并实践Kubernetes集群管理与自动化部署
41 4
|
9天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
4天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
5天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
阿里云ACK容器服务生产级可观测体系建设实践
|
9天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
29 4
|
23天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
92 3
|
1月前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
2月前
|
运维 Kubernetes 监控
自动化运维:使用Python脚本实现系统监控云原生技术实践:Kubernetes在现代应用部署中的角色
【8月更文挑战第31天】在现代IT运维管理中,自动化已成为提高效率和准确性的关键。本文将通过一个Python脚本示例,展示如何实现对服务器的自动监控,包括CPU使用率、内存占用以及磁盘空间的实时监测。这不仅帮助运维人员快速定位问题,也减轻了日常监控工作的负担。文章以通俗易懂的语言,逐步引导读者理解并实践自动化监控的设置过程。 【8月更文挑战第31天】本文旨在探索云原生技术的核心—Kubernetes,如何革新现代应用的开发与部署。通过浅显易懂的语言和实例,我们将一窥Kubernetes的强大功能及其对DevOps文化的影响。你将学会如何利用Kubernetes进行容器编排,以及它如何帮助你的
|
2月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
65 0
|
2月前
|
运维 Kubernetes Cloud Native
拥抱云原生:Kubernetes 在现代应用部署中的实践
【8月更文挑战第31天】在数字化转型的浪潮中,云原生技术成为推动企业创新和效率提升的关键力量。本文将深入探讨如何利用 Kubernetes,这一强大的容器编排工具,来部署和管理现代应用。我们将从基础架构搭建开始,一步步引导您配置集群,并通过实际代码示例演示如何部署一个简单的应用。无论您是云原生新手还是希望深化理解,这篇文章都将为您提供实操经验和理论知识的融合之旅。
下一篇
无影云桌面