为什么 APISIX Ingress 是比 Ingress NGINX 更好的选择?

news2025/1/13 10:08:41

作者容鑫,API7.ai 云原生技术工程师,Apache APISIX Committer。

本文将会对比两个比较流行的 Ingress controller 实现,希望能对读者进行 Ingress controller 选型中有所帮助。

Ingress NGINX 是 Kubernetes 社区实现的 Ingress controller,在社区中被广泛使用。Apache APISIX Ingress 则是 Apache 软件基金会下的开源项目,使用 APISIX 作为数据面的 Kubernetes Ingress controller。

Ingress NGINX vs APISIX Ingress

功能对比

下列表格中,对比了 Ingress NGINX 和 APISIX Ingress 基本功能,包括协议支持、鉴权方式、上游探针/策略、负载均衡策略、Kubenertes 集成等。以下表格数据取自 learnk8s.io。

Product/ProjectIngress NGINXApache APISIX Ingress
1. General info
Based onnginxnginx
2. Protocols
HTTP/HTTPS✔️✔️
HTTP2✔️✔️
gRPC✔️✔️
TCPPartial✔️
TCP+TLS✖︎✔️
UDPPartial✔️
Websockets✔️✔️
Proxy Protocol✔️✔️
QUIC/HTTP3PreviewPreview
3. Clients
Rate limiting (L7)✔️✔️
WAF✔️Partial
Timeouts✔️✔️
Safe-list/Block-list✔️✔️
Authentication✔️✔️
Authorisation✖︎✔️
4. Traffic routing
Host✔️✔️
Path✔️✔️
Headers✔️✔️
Querystring✔️✔️
Method✔️✔️
ClientIP✔️✔️
5. Upstream probes/resiliency
Healthchecks✖︎✔️
Retries✔️✔️
Circuit Breaker✖︎✔️
6.Load balancer strategies
Round robin✔️✔️
Sticky sessions✔️✔️
Least connections✖︎✔️
Ring hash✔️✔️
Custom load balancing✖︎✔️
7. Authentication
Basic auth✔️✔️
External Auth✔️✔️
Client certificate - mTLS✔️✔️
OAuth✔️✔️
OpenID✖︎✔️
JWT✖︎✔️
LDAP✖︎✔️
HMAC✖︎✔️
8. Observability
Logging✔️✔️
Metrics✔️✔️
Tracing✔️✔️
9. Kubernetes Integration
StateKubernetesKubernetes
CRD✖︎✔️
ScopeClusterwide
namespace
namespace
Support for the Gateway API✖︎Preview
Integrates with service meshes✔️✔️
10. Traffic shaping
Canary✔️✔️
Session Affinity✔️✔️
Traffic Mirroring✔️✔️
11. Other
Hot reloading✔️✔️
LetsEncrypt Integration✔️✔️
Wildcard certificate support✔️✔️
Configure hot reloadingPreview✔️
Service Discovery✔️

功能差异

通过下图,可以粗略看到 APISIX Ingress 内置的功能和特性相比 Ingress NGINX 更加丰富,其中包括服务发现、协议支持、认证鉴权等等。

功能差异

服务发现

在微服务架构中,应用被拆分为很多微服务,无论是微服务故障,还是对应用服务进行扩缩容,都需要尽快的通知到调用方,以免调用失败。因此,在微服务架构中,服务注册和发现机制就显得很重要了,通常这会通过注册中心来完成。

Service DiscoveryIngress NGINXApache APISIX Ingress
Kubernetes✔️✔️
DNS✔️
nacos✔️
exureka✔️
consul_kv✔️

协议支持

两者都对 HTTP/HTTPS 协议提供完整支持,APISIX Ingress 在协议支持上更丰富一些,能够的使用 TLS 来加密 TCP 流量,还支持 MQTT,Dubbo、Kafka 等协议进行代理。

服务治理能力

健康检查

在后端节点故障或者迁移时,不可避免会出现节点不可用的情况。如果大量请求访问到了这些不可用的节点时,将会造成流量损失,导致业务中断。因此,需要对节点进行健康检查,通过探针的形式探测后端节点的可用性,将请求代理到健康的节点,从而减少或避免流量损失。

健康检查的能力在 Ingress NGINX 中尚未支持,而 APISIX Ingress 提供了该能力,其中包括:

  • 主动健康检查:确保后端服务中的 Pod 处于可用的状态。在应用服务进行滚动更新时,会牵扯大量的节点进行更新,不健康的节点将会被负载均衡器忽略,开启健康检查能够有效的挑选出可用的 Pod,避免流量损失。
  • 被动健康检查:被动的方式无需发起额外的探针,每个请求就是探针,若一个健康节点连续 N 个请求都被判定为失败(取决于如何配置),则该节点将被标记为不健康。由于无法提前感知节点的状态,可能会有一定量的失败请求,在滚动更新时这种情况会相对常见,可以通过服务降级来避免失败的请求量。

如下是 APISIX Ingress 为 httpbin 服务配置健康检查示例:

apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
name: httpbin
spec:
healthCheck:
passive:
unhealthy:
httpCodes:
- 500
httpFailures: 3
active:
type: http
httpPath: /healthz
healthy:
successes: 3
interval: 2s
httpCodes:
- 200

服务熔断

流量高峰时,网关作为流量入口向后端服务发起调用,后端服务有可能会产生调用失败(超时或者异常),失败时不能让请求堆积在网关上,需要快速失败并返回回去,这就需要在网关上进行熔断。

服务熔断的功能在 Ingress NGINX 中尚未支持。在 APISIX Ingress 中则可以通过 api-breaker 熔断插件来实现。

具体使用配置示例如下:

apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- httpbin.org
paths:
- /status/*
backends:
- serviceName: httpbin
servicePort: 80
plugins:
- name: api-breaker
enable: true
config:
break_response_code: 502
unhealthy:
http_statuses:
- 505
failures: 2
healthy:
http_statuses:
- 200
successes: 2

插件和鉴权方式

目前 Ingress NGINX 主要通过 Annotations 和 ConfigMap 等方式进行配置,支持的插件功能比较有限。如果想要使用 JWT、HAMC 等鉴权方式,只能自行开发。

而 APISIX Ingress 得益于 APISIX 的丰富功能,原生支持 APISIX 内置的 80+ 插件,能够覆盖大部分使用场景,还支持 JWT、HMAC、wolf-rbac 等多种鉴权方式。以下仅展示 APISIX Ingress 使用 HMAC 认证并在路由上的应用示例:

apiVersion: apisix.apache.org/v2
kind: ApisixConsumer
metadata:
name: hmac-value
spec:
authParameter:
hmacAuth:
value:
access_key: papa
secret_key: fatpa
algorithm: "hmac-sha256"
clock_skew: 0
 
---
 
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- httpbin.org
paths:
- /ip
backends:
- serviceName: httpbin
servicePort: 80
authentication:
enable: true
type: hmacAuth

Ingress NGINX 和 APISIX Ingress 的扩展方式

除了以上这些细节对比外,两者对于额外功能的扩展也有所不同。当 Ingress controller 的基础功能无法满足企业用户的需求时,只能通过扩展的方式进行定制开发。接下来将具体介绍 Ingress NGINX 和 APISIX Ingress 如何进行功能扩展。

Ingress NGINX 如何进行功能扩展

Ingress NGINX 在扩展方式上比较单一,只能通过嵌入 Lua 程序的方式来扩展功能。我们以 Ingress NGINX 插件开发为例,大概需要以下步骤:

  1. 编写 Lua 程序 example-plugin
  2. 将插件安装到 ingress-nginx pod 中的 /etc/nginx/lua/plugins/<your plugin name>/etc/nginx/lua/plugins/example-plugin
  3. 在 ConfigMap 中启用 example-plugin 插件,需要在安装 Ingress NGINX 时引用此 ConfigMap 对象
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
data:
plugins: "example-plugin"

APISIX Ingress 如何进行功能扩展

APISIX Ingress 提供了多种扩展方式,企业用户可以根据自身情况自由选择或组合,当前支持如下拓展方式:

  • 通过 Lua 进行插件开发:这种方式相对简单,并且几乎没有性能损耗;
  • 通过 plugin-runner 开发:这种模式下支持 Java/Python/Go 等语言进行开发,这可以方便用户利用一些现有的业务逻辑,并且无需学习新语言;
  • 通过 WASM 进行插件插件:这种模式下,可以使用任何支持构建出 WASM 的语言进行插件开发;

此外还可以通过 Serverless 插件来直接编写 Lua 代码,快速满足业务需求。

为什么 APISIX Ingress 选择维护 CRD

目前 APISIX Ingress 支持三种声明式配置:Ingress 、CRD 和 Gateway API。这里主要对比 Ingress 和 CRD,Gateway API 将在后续展开。

Ingress 比较适合从 Ingress NGINX 迁移的企业用户,其转换成本较低。但缺点也较明显,比如语义化能力弱、没有细致规范等,同时也只能通过 Annotations 方式扩展,且 Annotations 无法支撑复杂配置场景。相对的使用 CRD 主要有以下好处:

  • 更契合数据面的设计语义,更加简单易用;
  • 一些重要配置能够被复用,而不会存在冗余庞大的单个配置;
  • 功能性和可扩展能力有了巨大提升;
  • 数据面 APISIX 有着活跃的社区,更新和发布版本快,CRD 的方式能够轻易支持数据面的更多能力;

Ingress NGXIN 的痛点:不支持配置热加载

静态配置带来的问题

Ingress NGINX 主要基于 NGINX 配置文件的方式,尽管使用 NGINX + Lua 来实现功能扩展,但没有彻底解决静态配置文件的问题。在路由能力和加载模式上稍显不足,并且存在一些明显劣势。

比如添加、修改任何新的规则时,需要重新加载 NGINX 配置。随着越来越多的路由规则和证书,在触发变更时,reload 操作将会更耗时,甚至需要几秒到十几秒的时间,对线上流量的影响将会非常大的,会导致流量短暂中断、影响响应延迟、负载均衡质量(每次重新加载 NGINX 都会重置负载均衡状态)等。

触发 NGINX 重新加载的情况

以下这些情况,涵盖了 Ingress controller 大量的使用场景:

  • 创建新的 Inresss 资源;
  • 将TLS 部分添加到现有 Ingress;
  • Ingress Annotations 的变化可能影响上游配置(例如 load-balance 注释不需要重新加载);
  • 在 Ingress 中添加或删除 path;
  • Ingress、Service、Secret 资源被删除;
  • Secret 发生更新;

在上述场景下,具有频繁部署应用程序的集群环境中,会不断触发 Ingress、Secret 等资源的操作(创建、更新、删除等),导致 NGINX 重新加载次数剧增,给生产环境带来了极大的影响。

小结

Ingress NGINX 的架构决定了它必须生成 NGINX 配置然后通过 reload 方式完成配置更新,架构不调整是无法解决这些已知问题。比如路由的实现,APISIX Ingress 则不再依赖 NGINX 配置改为了纯内存结构,通过热更新方式实现动态路由,不再需要重启 NGINX。

云原生新一代网关规范 Gateway API

Gateway API 优势

Gateway API 相比 Ingress 的功能性更强,旨在通过由许多供应商实现并具有广泛行业支持的富有表现力、可扩展和面向角色的接口来发展 Kubernetes 服务网络。当下 Gateway API 具有如下的优势:

  • 面向角色:Gateway 是由一组 API 资源组成的。不同的 API 资源代表了使用与配置 Kubernetes 网络资源的不同角色;
  • 表现力强:Gateway API 的核心功能就包含诸如基于头的匹配、流量加权以及其他在 Ingress 中只能通过各实现者自定义的非标准化 Annotations 等方式实现的功能;
  • 可扩展:Gateway API 允许不同资源在不同层级一同使用。这使得能够对 API 结构进行更精细化的控制。

支持情况

Gateway API 作为一种扩展 Kubernetes 服务网络的标准,其 Gateway 资源能够实现作为 Kubernetes API 来管理网关的生命周期,功能十分强大。目前许多 Ingress controller 都在积极支持它,包括 Istio、Kong、Traefik 等。在目前 Gateway API 实现情况中,很遗憾的是,Ingress NGXIN 尚未计划支持 Gateway API 。而 APISIX Ingress 已经支持了 Gateway API 的大部分特性:包括 HTTPRoute、TCPRoute、TLSRoute、UDPRoute 等。

总结

经过 APISIX Ingress 与 Ingress NGINX 的完整对比,我们可以看到两者基础功能差异不大,也都具备扩展能力。但在微服务的架构中,APISIX Ingress 对服务治理和服务发现的支持更具优势。

总体来看,两款开源软件均非常优秀,Ingress NGINX 主要特点是简单、易接入,但缺点也十分明显;APISIX Ingress 作为后来者解决了 NGINX 不支持热加载的痛点,在扩展能力和功能上相比 Ingress NGINX 也具有很大的优势。从项目发展角度而言,支持 Gateway API 和 CRD 能够扩展和丰富 Ingress controller 基础能力。

如果读者正在进行 Ingress controller 选型,倾向于功能丰富和更强的扩展能力,推荐使用 APISIX Ingress 。如果只是刚接触 Ingress controller,没有更多的功能需求,Ingress NGINX 也是一个比较好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高通量代谢组学四路筛选法,揭秘“神药”二甲双胍延长寿命的机制

百趣代谢组学分享—研究背景 目前据统计中国糖尿病患者人数达9700万以上&#xff0c;数量达到世界第一。这其中2型糖尿病占到了90%以上。二甲双胍是目前治疗2型糖尿病的一线“明星”药物&#xff0c;因其较少出现低血糖和体重增加副作用而受到广大患者和医生的青睐。代谢组学文…

Replicate Brogaard Stock Volatility Decomposition

文章目录IntroductionData and SampleDownload DataClean DataExtract Estimation Unit and Set Global VariablesImplement Brogaard DecompositionEstimate VAR Coefficients, Matrix BBB, ϵt\epsilon_tϵt​, Σe\Sigma_eΣe​, and Σϵ\Sigma_\epsilonΣϵ​Estimate 15-…

常用的前端大屏 适配方案

方案实现方式优点缺点vm vh1.按照设计稿的尺寸&#xff0c;将px按比例计算转为vw和vh1.可以动态计算图表的宽高&#xff0c;字体等&#xff0c;灵活性较高 2.当屏幕比例跟 ui 稿不一致时&#xff0c;不会出现两边留白情况1.每个图表都需要单独做字体、间距、位移的适配&#xf…

【寒假每日一题】AcWing 4509. 归一化处理

目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 1、cmath头文件相关函数 2、cout大法 一、题目 1、原题链接 4509. 归一化处理 - AcWing题库 2、题目描述 在机器学习中&#xff0c;对数据进行归一化处理…

【C++】list用法简单模拟实现

文章目录1. list的介绍及使用1.1 list基本概念1.2 list的构造1.3 list的迭代器使用1.4 list 赋值和交换1.5 list 插入和删除1.6 list容量大小操作1.7 list 数据存取2. list的模拟实现这次要模拟实现的类及其成员函数接口总览2.1 结点类的实现2.2 迭代器的模拟实现2.3 反向迭代器…

yolov1 论文精读 - You Only Look Once- Unified, Real-Time Object Detection-统一的实时目标检测

Abstract 我们提出了一种新的目标检测方法- YOLO。以前的目标检测工作重复利用分类器来完成检测任务。相反&#xff0c;我们将目标检测框架看作回归问题&#xff0c;从空间上分割边界框和相关的类别概率。单个神经网络在一次评估中直接从整个图像上预测边界框和类别概率。由于…

PDF体积太大怎么缩小?这两种方法轻松解决

在我们日常处理的文件中&#xff0c;PDF文件的体积已经算是比较小的文件了&#xff0c;但是随着工作时间增加&#xff0c;我们用到的PDF文件也越来越多&#xff0c;而且有些PDF文件的内容非常丰富&#xff0c;文件体积变得更大&#xff0c;这就不利于我们将文件传输给别人&…

人脸检测算法模型MTCNN

MTCNN,Multi-task convolutional neural network(多任务卷积神经网络),将人脸区域检测与人脸关键点检测放在了一起。总体可分为P-Net、R-Net、和O-Net三层网络结构。P-Net是快速生成候选窗口,R-Net进行高精度候选窗口的过滤和选择,O-Net是生成最终边界框和人脸关键点。该…

使用JDK的 keytool 生成JKS,修改查看JKS信息

什么是keytool keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书&#xff0c;在JDK 1.4以后的版本中都包含了这一工具&#xff0c;所以不用再上网去找keytool的安装&#xff0c;电脑如果安装有JDK1.4及以上&#xff0c;就可以直接使用。 第一步&…

TOOM舆情分析网络舆情监控平台研究现状

随着网络舆情迅速发展&#xff0c;国内的舆情监测行业也日渐完善&#xff0c;舆情监控平台在企业发展过程中发挥重要作用&#xff0c;但同样也是有问题存在的&#xff0c;接下来TOOM舆情分析网络舆情监控平台研究现状? 一、网络舆情监控平台 网络舆情监控平台是一种能够对网…

maven概述以及简单入门

目录 1、Maven概述 1.1、Maven是什么 1.2 依赖管理 1.3 maven管理资源存放地址 1.4 Maven的作用 2.Maven基础概念 2.1仓库概念 2.坐标概念 1、Maven概述 1.1、Maven是什么 在Javaweb开发中&#xff0c;需要使用大量的jar包&#xff0c;我们手动去导入&#xff1b; 如何…

Mask RCNN网络源码解读(Ⅵ) --- 自定义数据集读取:MS COCOPascal VOC

目录 1.如何在Mask R-CNN中读取有关COCO数据集的内容&#xff08;my_dataset_coco.py&#xff09; 1.1 CocoDetection类 1.1.1 初始化方法__init__ 1.1.2 __getitem__方法 1.1.3 parse_targets 2.如何在Mask R-CNN中读取有关Pascal VOC数据集的内容&#xff08;my_datas…

docker搭建 java web服务

安装 Docker 只需通过以下命令即可安装 Docker 软件&#xff1a; >> rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm >> yum -y install docker-io可使用以下命令&#xff0c;查看 Docker 是否安装成功&#xff1a; …

SpringMvc源码分析(一):启动tomcat服务器,加载DispatcherServlet并将DispatcherServlet纳入tomcat管理

SpringMvc是主流的MVC框架&#xff0c;它是基于Spring提供的web应用框架&#xff0c;该框架遵循servlet规范。该框架的作用是接收Servlet容器&#xff08;如Tomcat&#xff09;传递过来的请求并返回响应。SpringMvc的核心就是servlet实例&#xff0c;而这个servlet在spring中就…

IB地理科SL和HL课程的区别

今期我们会谈到IB地理科这一科目的标准级别&#xff08;StandardLevel&#xff0c;SL&#xff09;课程和高级级别&#xff08;HigherLevel&#xff0c;HL&#xff09;。 两课程的最大区别:试卷数目和题目数量的不同&#xff0c;但两者的教材内容和科目指引&#xff08;SubjectG…

VTK-不同类型的数据集

前言&#xff1a;本博文主要讲解vtk中不同类型的数据集以及它们之间的关系&#xff0c;如何进行转换等。 目录 vtkImageData vtkRectilinearGrid vtkStructuredGrid vtkUnstructuredPoints vtkPolyData vtkUnstructuredGrid vtkPolyData->vtkImageData vtkPolyData…

Go反射学习

文章目录反射介绍&#xff1a;反射应用点变量-空接口-reflect.Value&#xff08;Type)类型值方法结构体&#xff1a;反射修改变量值反射操作结构体MethodCall反射介绍&#xff1a; 反射是在运行时&#xff0c;动态的获取变量的各种信息&#xff0c;如变量的类型&#xff0c;类…

Springboot中如何优雅的写好Service层代码

前言《Springboot中如何优雅的写好controller层代码》一不小心进入了全站综合热榜&#xff0c;收到了大家热情的支持&#xff0c;非常感谢大家&#xff0c;同时说明大家都有同样一个诉求&#xff0c;想好好写代码&#xff0c;不想给别人挖坑&#xff0c;争取可以早点下班。今天…

【Spring源码】CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

CommonAnnotationBeanPostProcessor的postProcessMergedBeanDefinition()中一共包含3个方法&#xff0c;上篇文章我们介绍了的第一个方法&#xff0c;它一个父类调用&#xff08;如下图&#xff09;&#xff0c;其实就是处理PostConstruct和PreDestroy这两个注解的这篇我们继续…

一起聊聊数据治理

统一赵秦车轨&#xff0c;推行秦篆&#xff0c;统一七国文字&#xff0c;兵器统一标准&#xff0c;统一度量衡… 我们优秀的数据治理专家-秦始皇&#xff01; 数据治理这个名字起得好&#xff0c;一般人听不懂&#xff0c;实际上并不是IT人员的专属&#xff0c;广义上来说我们日…