高手问答第 311 期 —— 聊聊 NGINX 向云原生演进那点儿事

小白兔爱吃大灰狼 发布于 2023/12/12 11:35
阅读 8K+
收藏 3

阅读《2024 中国开源开发者报告》赢大奖,扫码申请享特权

据Gartner预测,到2025年,云原生架构将成为超过95%的新数字计划基础,高于2021年的不到40%,云原生架构市场占有率不断提高。而如今,全球半数以上(55%) 的网站都基于 NGINX 运行,差不多相同比例 (53.7%) 的中国网站在 NGINX 开源版上运行。而NGINX存在难于动态配置、管理功能影响业务等问题,为了解决这些问题,OpenNJet由此诞生。

OpenNJet基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,通过数据面与控制面的隔离,能够在不重启进程的情况下基于动态配置能力进行配置的实时更新。最近还推出了OpenNJet K8s Ingress Controller 1.0,基于OpenNJet的动态特性、高性能实现,弥补了NGINX在云原生场景中不足,而且提供了丰富的流量管理功能,如动态location、host/path路由、负载均衡、动态upstream、金丝雀发布、SNI等。

OSCHINA 本期高手问答(12 月 13 日 - 12 月 19 日)我们请来了嘉宾单雷老师和大家一起聊聊NGINX向云原生演进那点儿事。

可讨论的问题包括但不限于

  • OpenNJet和NGINX是什么关系?
  • 什么是云原生应用引擎?OpenNJet的有哪些优势
  • 我们如何解决数据面控制面隔离、国密、动态配置等问题?
  • 读NGINX/OpenNJet源码的建议
  • 如何上手开发一个开源项目?

其他关于NGINX、OpenNJet的更多内容,也欢迎积极提问。

嘉宾介绍

通明智云产品总监 单雷

20年的IT行业经验,精通云原生以及高性能应用引擎技术。曾在亚信科技历任研发主管、首席架构师等职务,并主导多个云原生、高性能应用网关项目的设计开发工作,现任公司应用引擎产品总监。


🎁 为了鼓励踊跃提问,下一代云原生应用引擎OpenNJet开源社区会在问答结束后从提问者中抽取 5 名幸运会员,赠予精美棉马甲一件。

OpenNJet 应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,OpenNJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器、流媒体服务器、负载均衡、代理(Proxy)、应用中间件、API网关、消息队列等产品形态等等。OpenNJet 在云原生架构中作为数据平面,除了提供南北向通信网关的功能以外,还提供了服务网格中东西向通信能力。在原有功能基础上增加了透明流量劫持、熔断、遥测与故障注入等新功能特性。

Gitee:https://gitee.com/njet-rd/njet

官网:https://njet.org.cn/

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 “NGINX 向云原生演进 相关问题向 单雷老师 提问,直接回帖提问既可。

加载中
0
小白兔爱吃大灰狼
小白兔爱吃大灰狼

高手问答第 311 期 —— 聊聊 NGINX 向云原生演进那点儿事

@HeartArea   @famince   @osc_89645095  @os_bitmap   @猪娃娃  

恭喜以上5位网友分别获得 精美棉马甲一件

请于12月28日23点前登陆账号, 私信  @小白兔爱吃大灰狼   告知快递信息(格式:姓名+电话+地址+尺码),过期视为自动放弃哦~

尺码参考:

0
iman123
iman123

@OpenNJet 大佬,你好,OpenNJet作为云原生应用引擎,有哪些优势以及有哪些类似的产品,各自的优缺点是什么呢?

0
apple-12345
apple-12345

@OpenNJet 您好,OpenNJet是云原生应用引擎,那么他与kong(基于nginx的The Cloud-Native API Gateway)有什么联系?

OpenNJet
OpenNJet
回复 @OpenNJet : 另外,因为OpenNJet利用了原生的C模块实现了kong利用lua实现的功能,如果kong底层切换到OpenNJet,会有更好的性能
OpenNJet
OpenNJet
我们原先在做项目时也对接过kong,其基于nginx+lua架构,利用lua编写了大量的业务需求插件. 我们理解kong的特点更体现在API管理上。OpenNJet是相当于kong底层使用的nginx,或者说可以平滑替换kong使用的底层nginx,因为OpenNJet也使用到了openresty开放出来的lua模块。
0
HeartArea
HeartArea

@OpenNJet  您好,我们刚好有需求,正在调研类似的产品。主要考虑几个点:

1、能不能有企业内部的账号权限体系快速的整合。

2、能不能实现一键回切,走直连接模式。

3、在跨城多中心的场景效果怎么样,底层的数据存储和同步架构如何。

不知道OpenNJet在这些方面如何支持的?

OpenNJet
OpenNJet
回复 @HeartArea : 可以参考https://my.oschina.net/u/6606114/blog/10143305,可以看出NJet本身是实现了控制面控制的。但您提到的这个一键切换,我们理解是在NJet和其他系统间一键切换,所以这个开关,是需要配置在管理多个proxy系统的管理面中的
HeartArea
HeartArea
回复 @OpenNJet : 感谢您的回复,但“控制浮动ip的漂移”还是有点粗放,是否考虑在控制面做开关,通过数据面实现IP漂移。
OpenNJet
OpenNJet
Ans3: NJet支持集群模式,配置数据的存储也是基于消息的,同步模式是基于mqtt消息协议的,所以多中心支持是没问题的。
OpenNJet
OpenNJet
Ans2: 这个需求是否是要实现一键回切到其他的proxy/直连应用? 如果是这样,我们建议: 在两台代理机器上部署分别部署njet和其他代理,如nginx/haproxy等。两台机器配置一个浮动IP(如利用keepalived),那么通过控制浮动ip的漂移,就可以实现一键回切
OpenNJet
OpenNJet
Ans1: NJet目前提供API对外接口,并且可以配置在访问授权时,利用后端的radius/ldap/openid等其他的标准auth方式。所以是可以和现有企业快速整合。针对这个需求,我们月底前将在官网放出一个blog,描述如何使用
0
木川瓦兹
木川瓦兹

@OpenNJet  我也是刚刚了解到这个开源软件,希望了解以下问题:
OpenNJet目前是否成熟,是否可用于生产环境?
OpenNJet在内核重构、安全加固和功能增强方面进行了哪些工作?
OpenNJet如何与NGINX进行版本迭代?
OpenNJet的未来发展规划和路线图是什么?

OpenNJet
OpenNJet
如官网首页展示,NJet是期望在云原生环境中,做数据面的内核,可以部署为sidecar/KIC,以及应用容器。前两者已经有版本release出来,所以基于WASM实现通用的应用容器,是NJet24年的一个重点规划。 另外,针对现有的modsecurity模块进行优化,实现高性能waf,是另一个重点。 最后,是要实现HTTP3 proxy,完善http协议间的互操作,
OpenNJet
OpenNJet
OpenNJet的上游包括openresty和nginx,会定期从其同步。之所以定期,是因为NJet的内部结构已经和nginx有了较大差异,只能人工分析代码差异,手工merge。但NJet一直在做,保证CVE及严重bug得到及时修复
OpenNJet
OpenNJet
在功能增强方面, NJet主要实现了先有模块的动态化,这个在对其他提问的回复中有涉及。另外,是对特定协议的支持,比如ftp协议,虽然古老,但在企业内部还有大量应用。还有,NJet很大的一块功能增强是对KIC/sidecar等云原生环境的部署形态进行支持,像实现proxy_protocol_v2以支持sidecar功能中的流量劫持中的路由等等。这块的内容太多,可以访问官网的blog进行了解
OpenNJet
OpenNJet
在安全加固方面,NJet集成了modsecurity,目前对其做了动态化改造,可以按需开关。在24年度,会对其的规则加载实现动态化,并利用线程池的模式优化执行性能。此外,也实现了4/7层面的限流,一定程度上防止DOS攻击。最后,支持国密标准,可以利用国标算法
OpenNJet
OpenNJet
回复 @OpenNJet : 此外, 我们还剥离出nginx原先由业务处理进程(worker)做的配置等控制面功能,实现了CoPilots(副驾驶)架构,比如主动健康检查,指标输出等功能,避免这些功能对正常的业务请求处理的影响
下一页
0
五品带砖侍卫-achin
五品带砖侍卫-achin

@OpenNJet Nginx 老了吗?哈哈哈. 关于OpenNJet 应用引擎如何通过增强 NGINX 的云原生功能和安全性,以及提供多种产品形态和新功能特性,来支持云原生架构中的高效和可靠的服务交付?

OpenNJet
OpenNJet
请参考官网,概述来说,就是NJet在保留NGINX原生高性能的基础上,实现动态配置,从而适应云原生环境频繁变化的环境。在这个基础上,为KIC/sidecar的特定需求实现了功能扩展,比如实现了协议识别及自适应来适应sidecar的需要。
0
famince
famince

@OpenNJet 当在 OpenNJet 中配置动态路由时,如何确保负载均衡在增加/移除后端服务时能够平稳地进行,避免对现有流量造成中断或延迟?

0
OpenNJet
OpenNJet

引用来自“iman123”的评论

@OpenNJet 大佬,你好,OpenNJet作为云原生应用引擎,有哪些优势以及有哪些类似的产品,各自的优缺点是什么呢?

云原生应用引擎有多种部署形态,如出入口网关,web/应用容器,边车等等。

目前我们看到在市场上,边车这种模型,基本上是istio+envoy一家独大。已经成为了事实上的标准,但由于这种模式相对资源损耗大(每个应用的实例都配一个边车),所以市场上有别的解决方案,像Cilium基于eBPF的实现,或per node的ambient 模式。 前者在国内的环境下大规模部署很不现实,因为需要面对大量的centos7.6(内核长期在3.x,ebpf的网络能力没有实现),后者社区发现有较多的性能问题,还需要较长时间的演进。NJet发布的边车,是遵循和istio对接的xDS接口,仅仅替换envoy,利用nginx良好的架构实现更高的性能。实测边车资源利用率,是envoy的1/3。

在proxy领域,比较流行的有百度BFE,阿里开源的MSON。 都是基于GO语言的实现,由于是基于GO的实现,基本上都具备开发便利,扩展灵活的特点。但是其性能上,尤其是SSL性能上比NJet上有较大差异,其https性能应该约为NJet的1/5。

NJet作为后来者,其功能的完善程度上会比市场上,尤其是经历了社区验证的这些产品有所缺失。性能是目前NJet的主要切入点

0
OpenNJet
OpenNJet

引用来自“famince”的评论

@OpenNJet 当在 OpenNJet 中配置动态路由时,如何确保负载均衡在增加/移除后端服务时能够平稳地进行,避免对现有流量造成中断或延迟?

如果您仅仅关注的是后端服务的变化,那在NJet中是一个较容易的实现。我们都知道,为了支持后端服务的动态调整,NJet(实际上也是原先NGINX的机制)把后端服务的列表保存在一个共享内存中,不同进程(worker)可以实时的访问该内存,获取列表,根据特定的算法来选定一个后端服务,这是对业务毫无影响的(都对该共享内存区加读锁)。当需要通过API变更这个清单时,另外一个独立的进程(这块请参考官网的描述,这个进程被称做CoPilot:ctrl)会通过加读写锁的方式去写修改这个区域。由于每次更新是单条,并且是直接的内存操作,所以锁住的时间只有纳秒级别,不会对业务处理造成影响

0
OpenNJet
OpenNJet

引用来自“小城渔翁”的评论

@OpenNJet 您好,OpenNJet在帮助解决NGINX动态配置问题上表现如何?能否分享一些具体的应用案例,以及在这些案例中OpenNJet如何提高业务效率和稳定性的?

为了解决NGINX的动态配置问题,NJet首先实现了一个有多个CoPilots:CoPilot:Ctrl, CoPilot:broker,CoPilot:沙箱构建的动态配置框架,再基于这个框架,逐个的对现存的模块进行动态化改造。

CoPilot架构如下图所显示:

事件配置框架则基于CoPilots框架,实现为下图:

目前实现的动态配置能力,典型的应用比如:

在高流量的环境下更新到期的服务端证书,这样就可以让业务完全不受影响,可以当前请求访问的还是老证书,下一个请求建立链接时,获得的就是新证书了。

另外的场景就是应用在灰度测试中,在生产环境中,正常的请求访问A集群,B集群部署了升级包,那么就需要引流部分请求到B集群进行验证和测试。这块就可以利用NJet的动态location能力,无需重起/reload,就可以实现,具体可以参考官网blog:http://njet.org.cn/cases/case-gray/

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部