课程实录 | Ingress Controller 的工作原理(下)

news2025/3/10 21:59:22

原文作者:陶辉 - 杭州智链达数据有限公司,联合创始人兼 CTO

原文链接:课程实录 | Ingress Controller 的工作原理(下)

转载来源:NGINX 开源社区

NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

编者按——本文为系列课程《 K8S Ingress Controller 技术细节探讨》的第一节《 Ingress Controller 的工作原理》的课程实录。由于文章较长,将分为上下两篇发布,点击这里观看课程回放。

在本节课程中,陶辉老师介绍了 NGINX 集群是怎么工作的,并对比 NGINX 官方和 Kubernetes 官方的两个 Ingress Controller 在运行时各自的特点以及性能上的差别。

课程内容包括 Kubernetes 的网络流量场景,以及 NGINX 集群该如何管理,如何解决分布式集群中常见的高可用、容灾、扩容等问题。


数据的高可用

第二个方面,高可用体现在 Kubernetes 集群本身的管理层面上。

假如我们给 Kubernetes 的池里放 100 台物理机,当你需要新起个 NGINX 时,只需要新起个 pod 。在 pod 池里面新起一个 pod ,立刻就能搞定所有的事情。

能搞定哪些事呢?第一,可以任意分配一个 IP 地址,比如原本 10.1.2.3 ,换成 10.1.100.100 。这是由 Networking 来完成的,也就是由 CNI 插件(网桥)来完成的。网络由 Kubelet 管理,存储及 Protobuf、gRPC、JSON 等协议,都在里面。

也就是说 Kubernetes 的 Scheduler (编排)会自动管理, APIServer 做通讯。因此运维人数可以大幅度减少,只需要通过 APIServer 在控制面板做一些操作,就可以自动地把托管的容器 pod 解决。

在此基础上,我们的 NGINX Ingress Controller 也自动地得到了高可用。所以,如果不基于 Kubernetes 去做 NGINX 的集群管理,要花更多的功夫来保证 NGINX 本身的高可用。

NGINX 高可用地管理 Kubernetes 中的 pod

接下来看 NGINX 如何高可用地管理 Kubernetes 中的 pod 。

关于此处相关精彩内容,您可以点击文章《课程实录 | Ingress Controller 的工作原理(下)》进行查看。

nginx.conf 模板

下面简单介绍一下 nginx.conf 模板。

Kubernetes 官方的模板是 Go 语言的一个模板, ETCD 里面的指令通过 JSON 写进去,就会通过替换模板中的字符串变成新的 nginx.conf。

NGINX 官方的更简单一点,分了两个配置,一个叫 nginx.tmpl ,一个叫 nginx.ingress.tmpl ,这两个模板的差别就是把 server 单独放在 ingress 里了,通过 nginx.conf 的 include 功能完成。

Reload 流程

NGINX 中的 reload 流程如下图。

当基于新的 nginx.conf 起了新配置时,新老配置同时存在,理论上来讲用户是感知不到 reload 重启的,但是在高并发、高性能、高吞吐量的场景下, reload 还是会有一些影响,产生长尾效应,百分之零点零几的请求可能会受到影响。

这也是为什么 Kubernetes 官方用 OpenResty 实现 Ingress controller 的原因之一。

Kubernetes 官方 Ingress controller 架构

下面介绍一下 Kubernetes 官方的 Ingress controller 架构。

Kubernetes APIServer 里面能拿到 ETCD 的五类数据 (Ingress、Service、Endpoint、Secret、ConfigMap,ConfigMap) ,在那之后,我们需要一个 Go 语言写的进程去管理 nginx.conf ,以及向 Lua Server 发送更新请求——也就是改共享内存。

这两件事是怎么样完成的呢?

Go 语言中有很多协程,在一个 Go 语言写的进程里面,会并发很多协程——若不熟悉协程,可以将其当成一个线程理解。上图中的 store 协程,就是在跟 APIServer 通讯,以便通过 informer 模式来监听资源的变化。

也就是说,ETCD 里五类数据一旦发生变化, APIServer 就要推给 store 协程。如果有一台机器挂掉, endpoint 就改了;如果有人更新了密钥, secret 就改了;如果 worker 进程数从两个变到四个, ConfigMap 就改了;加了新的域名, ingress 就改了……发生变化之后, store 协程就会知晓。

之后, Store 协程会把 APIServer 传过来的修改/更新事件,写到 Channel ( Go 语言中,两个协程之间进行通讯的一种方式) 中, NGINX Ingress Controller 这个主程会从 Channel 中取出数据,放到一个同步队列中。另外还有一个协程 ( SyncQueue ),会把数据读出来开始处理。

处理的时候,会有些简单的判断,第一,有没有改 nginx.conf 文件,如果改了,就执行 reload 。有一种情况不需要改,就是 endpoint 发生变化时。这对大规模集群来说是一个高频事件,假如有 1 万台机器,可能每分钟都会挂掉几台,这是很常见的。

如果每分钟都去执行 NGINX reload ,性能就会很差。面对这一问题,基于 OpenResty 的 balance by Lua ,会将 endpoint 的信息保存到 shared DICT 中(一种 Lua 数据结构,通过将共享内存抽象成一个基于红黑树和 LRU 的淘汰链表而实现)。

所以判断条件分为两类:一类是只修改了共享内存中的数据,则只需发送一个 http 请求(这是一个 REST API ,它的 method 的是一个 POST 请求,内容是一个 JSON ),把信息发给 NGINX 即可;第二类是修改了 nginx.conf 配置,则执行 reload , NGINX 就可以用新的配置来服务了。

Kubernetes 官方 Ingress controller 中的流程

下面简单介绍 Kubernetes 官方 Ingress controller 中的流程。其中有个共享内存,里面保存了 Backend (即后端上游信息)、证书等,它是通过 Lua 代码来管理的。

然后,基于 Go 语言写的进程通过许多端口来服务,比如我们修改共享内存的时候,是通过本机的 10246 端口来修改的。这个进程还跟 APIServer 通过 client-go 这个 SDK 来通讯——通过 Store 这个 package ( Go 语言中有 package )。

Kubelet 是本机上的每一个机器、每个 node 上都有的进程,它通过 10254/healthz 来管理健康状态。

关于 Prometheus ,它是 CNCF 里面的第二个项目(第一个是 Kubernetes ),它是做监控的,是一个开源的、现在也被广泛使用的一个可视化的监控系统,通过 10254/metrics 来管理。

这是大概的情况,未来的课程中会详细介绍这一流程。

Ingress controller 的性能比较

最后,为大家展示两个对比测试结果,有三个 Ingress controller ,都是基于 NGINX 来实现的。

第一个是 NGINX 官方的 NGINX OSS Ingress Controller ( OSS 即 Open Source ,开源);第二个是 NGINX Plus Ingress Controller ( NGINX Plus ,是 NGINX 的商业化版本),它是闭源的;第三个是 Kubernetes 官方社区提供的 Ingress controller ,基于 OpenResty ——也是 NGINX 实现的,只不过加了 Lua 语言。(由于 NGINX Plus 是闭源的,所以下面的测试结果中,未对其进行解析。)

下面两张性能测试的图表分别为:静态部署测试、动态部署测试。Kubernetes 中有许多 Ingress controller ,它们会被部署到很多 pod 里,如果这些 pod 总是发生变化,意味着什么?

对于官方 NGINX 来说,就是 nginx.conf 变了;对于 Kubernetes 来说,意味着共享内存里的数据变了,因为它是通过 Lua 来修改的。这就是动态部署。而静态部署,意味着 nginx.conf 基本是不变的。

先看静态测试的图, x 轴是百分比, y 轴是时延 ( latency )。

每秒钟发送 3 万个请求( 3 万 RPS )的情况下, 99% 的请求时延小于 50 毫秒,到了 99.9% 的时候 OpenResty 时延就变高了,接近 100 毫秒——原因在于 Lua ,因为每处理一次请求,从 C 语言跳到 Lua 语言要执行一次 balance by Lua ,所以变慢了。

99.99% 的时候,表现最好的是开源的 NGINX ,因为它最简单,是纯 C 语言的,也不支持动态修改,动态修改需要重新 reload ,而它没有 reload 。所以开源 NGINX 表现最好,表现最差是 Lua 。

动态测试中,大概每隔 10 秒到 12 秒,就把 pod 数从 5 个到 7 个之间反复做调整。

在 3 万 RPS 的情况下,不断地去启停 NGINX 的时候,因为 Lua 走的是 balance by Lua ,根本没有执行 reload ,所以是很稳定的。

开源的 NGINX 表现最差,因为不停的 reload 导致有个别请求时延变高,因为中间会有很多信息,比如丢包,都会导致老的 worker 一直挂着,最后请求会出现一些问题。而只要 NGINX worker 不重启,性能就会非常好。

更具体的细节,大家可以去参看源代码,包括 nginx.conf 模板,以及 Go 语言相关知识等等。以上就是 Ingress controller 的原理,希望对大家有所帮助。


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号

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

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

相关文章

Android Lottie加载gson文件动画

一&#xff1a;Lottie的使用 在你工程的build.gradle文件里添加如下配置 implementation com.airbnb.android:lottie:3.4.0二&#xff1a;布局文件直接引入LottieAnimationView <com.airbnb.lottie.LottieAnimationViewandroid:id"id/lottie_view"android:layout…

axios 介绍

axios 介绍 axios 是一款基于 javascript xhr 进行封装的插件&#xff0c;自己通过 xhr 进行编写 ajax 请求&#xff0c;实现起来逻辑比较复杂&#xff0c;axios 封装后将复杂的逻辑写在插件的内部&#xff0c;我们用户只需要关心如何调用即可。对我们的开发带来了很大的便捷。…

在App备案的规则下,开发者的技术选型更加重要了

网站 ICP 备案已施行了很久&#xff0c;我们也非常清楚必须在进行 ICP 备案后&#xff0c;网站才能在大陆范围合法运营&#xff0c;并且用户可以通过域名正常访问网站。 但是月初出了新规&#xff0c;明年起&#xff0c;国内的 App 也要像网站一样进行备案了。想必大家也是早已…

HTTPS证书如何申请?只需这五个步骤

在如今的互联网时代&#xff0c;网络安全变得愈发重要。为了保障网站内数据的安全&#xff0c;许多网站都开始使用HTTPS协议来进行数据传输。而谷歌、百度等搜索巨擘启用全站HTTPS加密服务&#xff0c;更是掀起了网站HTTPS加密的浪潮。那么申请HTTPS证书都需要什么&#xff1f;…

Typora mac版本安装

提示&#xff1a;文章介绍&#xff0c;Typora在Mac系统中免费安装使用 文章目录 一、官网下载二、安装 一、官网下载 官网地址&#xff1a;https://www.typoraio.cn/ 二、安装 安装好后按 command 空格键&#xff0c;找到 Typora的安装路径 /Applications/Typora.app/Con…

信创、工业软件国产化:全面解析三大实时操作系统

信创与国产工业操作系统可以擦出什么火花。 信创技术的快速发展&#xff0c;为国产工业操作系统的研发和应用提供了广阔的空间。 工业操作系统作为工业制造的大脑和神经&#xff0c;工业软件已渗透和应用到工业领域几乎所有核心环节。工业操作系统是智能制造的核心&#xff0c;…

Vue3.2中使用swiper实现层叠式轮播图

介绍 在 vue3 中使用 swiper 实现缩略图的轮播图效果&#xff0c;具体如下图所示&#xff1a; 代码 <template><div classindex><div class"banner-box"><swiper:autoplay"state.autoplay":loop"state.loop":speed&q…

2023 Android 折叠屏适配详解,是时候点亮新技能了

自 2019 年三星发布了第一台&#xff08;柔宇不算&#xff09; Galaxy Z Fold 之后&#xff0c;Android 厂商们都陆续跟进了各自的可折叠方案&#xff0c;之后折叠屏手机市场一直保持快速增长&#xff0c;例如 2023 年上半年整体销量 227 万台&#xff0c;同比增长 102.0%。 虽…

某支付巨头:提升安全内生“数智”能力,筑牢应用安全长城

某企业是支付领域巨头&#xff0c;处于行业核心地位&#xff0c;推动了中国支付产业的智能化和数字化转型。该企业提供相关专业化服务和金融科技服务&#xff0c;共建开放生态&#xff0c;打造数字网络&#xff0c;服务全球支付。 构建金融操作系统 推动中国金融数字化发展 …

爬虫:绕过5秒盾Cloudflare和DDoS-GUARD

本文章仅供技术研究参考&#xff0c;勿做它用&#xff01; 5秒盾的特点 <title>Just a moment...</title> 返回的页面中不是目标数据&#xff0c;而是包含上面的代码&#xff1a;Just a moment... 或者第一次打开网页的时候&#xff1a; 这几个特征就是被Cloud…

2023年7月天猫糕点市场数据分析(天猫数据怎么看)

烘焙食品行业是近几年食品领域比较火热的赛道之一&#xff0c;随着居民饮食结构的变化&#xff0c;人均消费水平的上升&#xff0c;蛋糕、面包等烘焙糕点越发成为消费者饮食的重要组成部分。同时&#xff0c;在烘焙糕点市场中&#xff0c;老品牌不断推新迭变&#xff0c;新品牌…

线性代数的学习和整理11: 子式与余子式

目录 1 原始矩阵A 2 子式&#xff08;都是行列式&#xff09; 2.1 k阶子式 2.2 k阶主子式 2.3 k阶顺序主子式 3 余子式 3.1 余子式 3.2 代数余子式 3.3 余子式作用是&#xff1f; 1 原始矩阵A 下面设计一个原始矩阵A&#xff0c;故意设计为A34, 行数≠列数 $$ \lef…

【车载开发系列】UDS当中的时间参数

【车载开发系列】UDS当中的时间参数 UDS当中的时间参数 【车载开发系列】UDS当中的时间参数一. 术语定义二. 网络层时间调整参数三. ECU诊断层与会话层参数 一. 术语定义 缩写全称中文说明BSBlock Size块大小STminSeparation time min时间间隙SIService Identifier服务标识符S…

如何在App里拉起小程序?

什么是小程序运行时框架&#xff1f; FinClip 的小程序编程模型是分为多个页面&#xff0c;每个页面有自己的 template、CSS 和 JS&#xff0c;实际在运行的时候&#xff0c;业务逻辑的 JS 代码是运行在独立的 JavaScript 引擎中&#xff0c;每个页面的 template 和 CSS 是运行…

使用Jetpack Compose构建可折叠Card

使用Jetpack Compose构建可折叠Card 为何在Android应用开发中使用扩展卡片 扩展卡片在Android应用开发中广受欢迎&#xff0c;它们可以让开发者打造干净紧凑的用户界面&#xff0c;同时可以轻松展开&#xff0c;显示额外的内容。 通过巧妙地使用扩展卡片&#xff0c;开发者可…

磁盘阵列/视频集中存储/安防监控视频智能分析平台新功能:安全帽/反光衣/安全带AI识别详解

人工智能技术已经越来越多地融入到视频监控领域中&#xff0c;近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能&#xff0c;该平台内置多种AI算法&#xff0c;可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍&#xff0c;支持口罩佩戴检…

基于swing的教务管理系统java jsp学生教师信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的教务管理系统 系统有3权限&#xff1a;管…

气传导耳机哪个好?推荐几款性能表现不错的气传导耳机

​蓝牙耳机大家都很熟悉&#xff0c;如果更了解一些的朋友&#xff0c;一定也知道气传导耳机。气传导耳机最大的好处在于不入耳佩戴更舒适&#xff0c;户外使用时还能听到周围环境音&#xff0c;不会屏蔽汽车鸣笛声&#xff0c;使用更加安全。但也还有很多小伙伴不知道气传导耳…

Android实现网络请求方法

Android网络请求(1) ​ 安卓开发网络请求可谓是安卓开发的灵魂&#xff0c;如果你不会网络请求&#xff0c;那么你开发的应用软件就是一具没有灵魂的枯骨。 ​ 在安卓开发中进行网络请求和java中的网络请求有异曲同工之妙&#xff0c;但是安卓软件毕竟的安装在我们手机上的&a…

C++入门:引用是什么

目录 1.引用的概念 2.引用的特征 3.常引用 4.引用使用场景 5.传值&#xff0c;传引用效率比较 6.引用与指针的区别 1.引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用…