Ingress控制器那么多,到底该选哪一个?

简介: Ingress控制器那么多,到底该选哪一个?

在Kubernetes中,service IP和Pod IP主要供集群内部访问使用,对于集群外部是不可见的。


如果要从集群外部访问,常用是的以下3种方式。


(1)通过NodePort方式


如下图:


640.png


我们忽略具体的实现细节,通过NodePort的方式会在所有的Node节点上映射一个端口,端口范围默认是30000-32767。然后用户通过任意主机+映射端口来访问集群内部。


这种方式的优点是实现方式比较简单,缺点是如果映射的端口太多不好管理,每一个端口只能提供一种服务,还有以此生成的iptables规则也很多。


(2)通过LoadBalancer方式


如下图:


640.png


从图种可以看到Load Balancer服务暴露服务非常直接,直接把服务暴露到Internet,通往指定端口的流量都会被转发到对于的服务,它没有过滤条件、没有规则等。


这种方式最大的缺点就是每个LoadBalancer都需要一个固定的IP,而且更多情况下是需要云产商的支持。


(3)通过Ingress方式


如下图:


640.png


Ingress本身不提供服务,它依赖Ingress Controller,Ingress Controller以Pod的形式部署在Kubernetes集群内,实质上我们无法从外面直接访问,依然要将其暴露出来,暴露方式有几种:


  • 通过NodePort形式暴露,前面需接一个负载均衡
  • 通过LoadBalancer形式暴露,云产商默认就是这种方式
  • 直接在Pod中使用hostport,前面需接一个负载均衡


ingress的实现方式更智能、更友好,相对的配置就略微复杂,它一个IP可以暴露多个应用,支持同域名不同uri,支持证书等功能。


目前Ingress暴露集群内服务的行内公认最好的方式,不过由于其重要地位,世面上有非常多的Ingres Controller,常见的有:


  • Kubernetes Ingress
  • Nginx Ingress
  • Kong Ingress
  • Traefik Ingress
  • HAProxy Ingress
  • Istio Ingress
  • APISIX Ingress


除了上面列举的这些,还有非常多的Ingress Controller,面对如此多的Ingress Controller,我们该如何选择呢?参考的标准是什么?


一般情况下可以从以下几个维度进行判断:


  • 支持的协议:是否支持除HTTP(S)之外的协议
  • 路由的规则:有哪些转发规则,是否支持正则
  • 部署策略:是否支持ab部署、金丝雀部署、蓝绿部署等
  • upstream探针:通过什么机制判定应用程序正常与否,是否有主动和被动检查,重试,熔断器,自定义运行状况检查等解决方案
  • 负载均衡算法:支持哪些负载均衡算法,Hash、会话保持、RR、WRR等
  • 鉴权方式:支持哪些授权方案?基本,摘要,OAuth,外部身份验证等
  • DDoS防护能力:是否支持基本的限速、白名单等
  • 全链路跟踪:能否正常接入全链路监控
  • JWT验证:是否有内置的JSON Web令牌验证,用于对最终应用程序的用户进行验证和验证
  • 图像界面:是否需要图形界面
  • 定制扩展性:是否方便扩展


下面分别对上述的Ingress Controller做简要介绍。


Kubernetes Ingress


github.com/kubernetes/ingress-nginx


Kubernetes Ingress的官方推荐的Ingress控制器,它基于nginx Web服务器,并补充了一组用于实现额外功能的Lua插件。


由于Nginx的普及使用,在将应用迁移到K8S后,该Ingress控制器是最容易上手的控制器,而且学习成本相对较低,如果你对控制器的能力要求不高,建议使用。


不过当配置文件太多的时候,Reload是很慢的,而且虽然可用插件很多,但插件扩展能力非常弱。


Nginx Ingress


github.com/nginxinc/kubernetes-ingress


Nginx Ingress是NGINX开发的官方版本,它基于NGINX Plus商业版本,NGINX控制器具有很高的稳定性,持续的向后兼容性,没有任何第三方模块,并且由于消除了Lua代码而保证了较高的速度(与官方控制器相比)。


相比官方控制器,它支持TCP/UDP的流量转发,付费版有很广泛的附加功能,主要缺点就是缺失了鉴权方式、流量调度等其他功能。


Kong Ingress


github.com/Kong/kubernetes-ingress-controller


Kong Ingress建立在NGINX之上,并增加了扩展其功能的Lua模块。


kong在之前是专注于API网关,现在已经成为了成熟的Ingress控制器,相较于官方控制器,在路由匹配规则、upstream探针、鉴权上做了提升,并且支持大量的模块插件,并且便与配置。


它提供了一些 API、服务的定义,可以抽象成 Kubernetes 的 CRD,通过Kubernetes Ingress 配置便可完成同步状态至 Kong 集群。


Traefik Ingress


github.com/containous/traefik


traefik Ingress是一个功能很全面的Ingress,官方称其为:Traefik is an  Edge Router that makes publishing your services a fun and easy experience.


它具有许多有用的功能:连续更新配置(不重新启动),支持多种负载平衡算法,Web UI,指标导出,支持各种协议,REST API,Canary版本等。开箱即用的“Let's Encrypt”支持是另一个不错的功能。而且在2.0版本已经支持了TCP / SSL,金丝雀部署和流量镜像/阴影等功能,社区非常活跃。


Istio Ingress


istio.io/docs/tasks/traffic-management/ingress


Istio是IBM,Google和Lyft(Envoy的原始作者)的联合项目,它是一个全面的服务网格解决方案。它不仅可以管理所有传入的外部流量(作为Ingress控制器),还可以控制集群内部的所有流量。在幕后,Istio将Envoy用作每种服务的辅助代理。从本质上讲,它是一个可以执行几乎所有操作的大型处理器。其中心思想是最大程度的控制,可扩展性,安全性和透明性。


借助Istio Ingress,您可以微调流量路由,服务之间的访问授权,平衡,监控,金丝雀发布等.


不过社区现在更推荐使用Ingress Gateways。


HAProxy Ingress


github.com/jcmoraisjr/haproxy-ingress


HAProxy作为王牌的负载均衡器,在众多控制器中最大的优势还在负载均衡上。


它提供了“软”配置更新(无流量丢失),基于DNS的服务发现,通过API的动态配置。

HAProxy还支持完全自定义配置文件模板(通过替换ConfigMap)以及在其中使用Spring Boot函数。


APISIX Ingress


github.com/api7/ingress-controller


ApiSix Ingress是一个新兴的Ingress Controller,它主要对标Kong Ingress。


它具有非常强大的路由能力、灵活的插件拓展能力,在性能上表现也非常优秀。同时,它的缺点也非常明显,尽管APISIX开源后有非常多的功能,但是缺少落地案例,没有相关的文档指引大家如何使用这些功能。


下面附一张对比图:


640.png



这里还有一个更全的对比方案:

https://docs.google.com/spreadsheets/d/1DnsHtdHbxjvHmxvlu7VhzWcWgLAn_Mc5L1WlhLDA__k/edit#gid=0


写在最后


每个控制器都有自己的优缺点,在选型的时候除了参考上面的标准外,还应考虑:


  • 技术人员的技术栈、维护能力
  • 公司业务的真实诉求


适合公司的才是最好的,一切不是为了用而用,而是因为需要而用。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
缓存 API 区块链
ccxt中文教程
CCXT官方教程中文版由汇智网翻译整理,访问地址:http://cw.hubwiz.com/card/c/ccxt-dev-manual/。 CCXT是一个JavaScript / Python / PHP 开发库,用于数字货币的交易与电子商务,支持众多的比特币/以太币/山寨币交易市场和商户API。
10723 2
|
文字识别 自然语言处理 数据处理
《大模型赋能文化遗产数字化:古籍修复与知识挖掘的技术实践》
本文记录大模型赋能文化遗产数字化的实践,针对古籍异体字识别难、残缺文本补全不准、隐性知识难挖掘、多模态数据割裂、中小机构部署难、知识难更新等痛点,提出对应方案:搭建古籍文字与语境知识库提升识别理解率,以多源史料关联与历史逻辑约束实现文本精准补全,构建多层级框架挖掘隐性知识,设计多模态语义对齐整合多元信息,通过轻量化优化与混合部署降低使用门槛,建立动态机制保障知识迭代。优化后多项关键指标显著提升,为古籍数字化提供有效路径。
781 9
|
10月前
|
存储 监控 测试技术
游戏停服不停机:如何利用阿里云完成游戏服务器的热更新与迁移?
本文介绍如何基于阿里云技术实现游戏服务器热更新与无缝迁移,通过容器化部署、流量调度、数据兼容等方案,保障玩家“停服不停机”的流畅体验。结合ACK、ALB、DTS等核心服务,支持灰度发布、跨区迁移与混合云部署,提升运维效率与系统可靠性,助力游戏平稳升级。
|
缓存 网络协议 Linux
扩展Linux网络栈
扩展Linux网络栈
703 3
|
关系型数据库 MySQL 数据库
MySQL 复制A的表结构和数据到表B
在MySQL中复制表A至表B可通过不同方法实现。一种是先用`CREATE TABLE B LIKE A;`复制结构,再用`INSERT INTO B SELECT * FROM A;`填充数据。另一种更简便的方法是直接使用`CREATE TABLE B AS SELECT * FROM A;`一次性完成结构和数据的复制。还有一种高级方法是通过`SHOW CREATE TABLE A;`获取表A的创建语句,手动调整后创建表B,如有需要再用`INSERT INTO ... SELECT`复制数据。注意权限问题、跨数据库复制时需指定数据库名,以及大表复制时可能影响性能。
1931 1
|
存储 Kubernetes Cloud Native
K8S Ingress 之 Apache APISIX 解析
在云原生时代,基于主流的云操作系统 Kubernetes ,其常见的外部流量访问方式主要基于以下 NodePort、LoadBalancer 以及 Ingress 等。
2485 0
|
Kubernetes 负载均衡 应用服务中间件
Kubernetes的Ingress
Kubernetes的Ingress
609 0
Kubernetes的Ingress
|
Java 程序员 调度
park与unpark基本使用与原理分析
park与unpark基本使用与原理分析
741 0
|
消息中间件 中间件 Kafka
RocketMQ源码(一)RocketMQ消息生产及消费通信链路源码分析
**RocketMQ**的核心架构主要分为Broker、Producer、Consumer,通过阅读源码看到他们之间是通过Netty来通信的 ,具体来说Broker端是**Netty服务器**用来负责与客户端的连接请求处理,而Producer/Consumer端是**Netty客户端**用来负责与Netty服务器的通信及请求响应处理。
825 1