百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Nginx Ingress Controller 工作原理

off999 2025-03-03 19:43 14 浏览 0 评论



前言

本文目的是阐述 Nginx Ingress 控制器的工作原理,尤其是 NGINX模型 的构建方式以及为什么需要这个模型。

Nginx 配置

Nginx Ingress 控制器的目标是构建(nginx.conf)配置文件。主要含义是在配置文件中进行任何更改后都需要重新加载 Nginx。不过需要特别注意的是,在只有 upstream 配置变更的时候我们不需要重新加载 Nginx(即当你部署的应用 Endpoints 变更时)。我们使用 lua-nginx-module 实现这一目标。请查看下面的内容,以了解有关操作方法的更多信息。

Nginx 模型

通常,Kubernetes 控制器利用同步循环模式来检查控制器中所需的状态是否已更新或需要更改。为此,我们需要使用集群中放入不同对象来构建模型,特别是 Ingresses、Services、Endpoints、Secrets 以及 Configmaps 来生成反映集群状态时间点的配置文件。

为了从集群中获取该对象,我们使用了Kubernetes Informers,尤其是 FilteredSharedInformer。当一个新的对象添加、修改或者删除的时候,informers 允许通过 回调 针对单个变更进行响应。不幸的是,没有办法知道特定的更改是否会影响最终的配置文件。因此,每次更改时,我们都必须根据集群的状态从头开始重建一个新模型,并将其与当前模型进行比较。如果新模型等于当前模型,那么我们避免生成新的Nginx配置并触发重新加载。否则,我们就通过 Endpoints 来检查不同,然后使用 HTTP POST 请求一个新的 Endpoints 列表发送给运行在 Nginx 中的 Lua 程序并且避免重新生成一个新的 NGINX 配置以及触发重新加载。如果运行的模型和当前的差异不仅仅是 Endpoints,我们则基于新的模型创建一个新的 NGINX 配置文件,替代当前的模型并触发一次重新加载。

该模型的用途之一是在状态没有变化时避免不必要的重新加载,并检测定义中的冲突。

Nginx 配置的最终表示是从 Go template 生成的,使用新模型作为模板所需变量的输入。

构建 Nginx 模型

建立模型是一项昂贵的操作,因此,必须使用同步循环。通过使用工作队列,可以不丢失变更并通过 sync.Mutex 移除来强制执行一次同步循环,此外,还可以在同步循环的开始和结束之间创建一个时间窗口,从而允许我们丢弃不必要的更新。重要的是要理解,集群中的任何变更都会生成事件,然后 informer 会发送给控制器,这也是使用 工作队列 的原因之一。

建立模型的操作方式:

  • 按 CreationTimestamp 字段对 Ingress 规则排序,即先创建的规则优先。
  • 如果在多个 Ingress 中为同一主机定义了相同路径,则先创建的规则优先。
  • 如果多个 Ingress 包含同一 host 的 TLS 部分,则先创建的规则优先。
  • 如果多个 Ingress 定义了一个 annotation 影响到 Server 块配置,则先创建的规则优先。
  • 创建一个 NGINX Servers 列表(按主机名)。
  • 创建一个 NGINX Upstreams 列表。
  • 如果多个 Ingres Servers 定义了同一个 host 的不同路径,则 Ingress 控制器将合并这些规则。
  • Annotations 被应用于这个 Ingress 的所有路径。
  • 多个 Ingress 可以定义不同的 Annotations。这些定义在 Ingress 之间不共享。

重新加载

下面的列表描述了需要重新加载的情况:

  • 已创建新的 Ingress 资源。
  • TLS 部分已添加到现有 Ingress。
  • Ingress annotations 的更改不仅仅影响 upstream 配置。例如,load-balance annotation 不需要重新加载。
  • 已从 Ingress 添加/删除路径。
  • 一个 Ingress、Service、Secret 被移除。
  • 一些 Ingress 缺少可用的引用对象时,例如 Service 或 Secret。
  • Secret 已更新。

避免重新加载

在某些情况下,有可能避免重新加载,尤其是在 endpoints 发生变化(即,Pod 启动 或 被替换)时。完全删除重新加载超出了Ingress 控制器的范围。这将需要大量工作,并且在某些时候没有任何意义。仅当 Nginx 更改了读取新配置的方式时,这时才可以更改,基本上,新的更改不会替代工作进程。

避免 Endpoints 变更时重新加载

在每个 endpoint 更改上,控制器从所有能看到的服务上获取 endpoints 并生成相应的后端对象。然后,将这些对象发送到在 Nginx 内部运行的 Lua 处理程序。Lua 代码又将这些后端存储在共享内存区域中。然后,对于在 balancer_by_lua 上下文中运行的每个请求,Lua代码将检测它应从哪些 endpoints 中选择对应 upstream 并应用已经配置的负载均衡算法。然后 Nginx 负责其余的工作。这样,我们避免在 endpoints 更改时重新加载 Nginx。请注意,这也包括仅影响 Nginx upstream 配置的 annoations 变更。

在具有频繁部署应用程序的相对较大的群集中,此功能可以节省大量 Nginx 重载,否则会影响响应延迟,负载平衡质量(每次重载Nginx 都会重置负载平衡状态)等等。

避免因错误的配置而中断

因为 ingress nginx 使用同步循环模式工作,所以它将配置应用于所有匹配的对象。如果某些Ingress 对象的配置损坏,例如
nginx.ingress.kubernetes.io/configuration-snippet annotation 中的语法错误,则生成的配置将变得无效,不会重新加载,因此将不再考虑其他 Ingress。

为了防止这种情况的发生,nginx ingress 控制器可以选择公开一个验证的 准入Webhook服务器,以确保传入的ingress对象的可靠性。此 Webhook 将传入的 ingress 对象追加到 ingresses 列表中,生成配置并调用 nginx 以确保配置没有语法错误。

相关推荐

Python自动化脚本应用与示例(python自动化脚本教程)

Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作O批量重命名文件...

如何使用Python实现一个APP(如何用python做一个程序)

要使用Python实现一个APP,你可以选择使用一些流行的移动应用开发框架,如Kivy、PyQt或Tkinter。这里以Kivy为例,它是一个跨平台的Python框架,可以用于创建漂亮的图形用户界面(...

免费定时运行Python程序并存储输出文档的服务推荐

免费定时运行Python程序并存储输出文档的服务推荐以下是几种可以免费定时运行Python程序并存储输出结果的云服务方案:1.PythonAnywhere特点:提供免费的Python托管环境支持定时...

【Python程序开发系列】如何让python脚本一直在后台保持运行

这是我的第385篇原创文章。一、引言让Python脚本在后台持续运行,有几种常见的方式,具体方式可以根据你的系统环境和需求选择。二、Linux或macOS系统2.1使用nohup命令no...

运行和执行Python程序(运行python的程序)

一、Python是一种解释型的脚本编程语言,这样的编程语言一般支持两种代码运行方式:交互式编程在命令行窗口中直接输入代码,按下回车键就可以运行代码,并立即看到输出结果;执行完一行代码,你还可以继续...

Python 初学者指南:计算程序的运行时长

在编写Python程序时,了解程序的运行时长是一项很有用的技能。这不仅能帮助你评估代码的效率,还能在优化程序性能时提供关键的数据支持。对于初学者来说,计算程序运行时长其实并不复杂,接下来就让我们看...

pyest+appium实现APP自动化测试,思路全总结在这里

每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试01appium环境搭建安装nodejshttp://nodej...

血脉觉醒后,编程小白我是如何通过Deepseek和Trae轻松开发软件的

以下就是作为一个编程小白的我,是如何一步步开发软件的保姆级教程,请点赞收藏:第一步:打开#deepseek#(首先关闭深度思考和联网搜索)输入或复制你要让它做一个什么样软件的要求和提示词(你可以先用...

我用Deepseek+Trae写的python小软件,小白也能轻松用上模型啦!

利用AI大模型deepseek,搭配TraeCN,用半个小时做了一个本地Ollama安装部署和一键卸载的小工具,哈哈哈!感觉还不错#deepseek#一直想做一个本地Ollama安装部署和一键卸载...

在安卓设备上运行Python的方法(安卓能运行python吗)

技术背景在安卓设备上运行Python可以为开发者提供更多的开发选择和灵活性,能够利用Python丰富的库和简洁的语法来开发各种应用,如游戏、脚本工具等。然而,由于安卓系统原生不支持Python,需要借...

零基础小白,DeepSeek全自动编程,超详细提示词,一键生成软件!

我前面发表了文章,详细说了编程零基础小白,如何利用DeepSeek进行编程的全过程,感兴趣的可以去看看:DeepSeek全自动编程很多人不会写提示词,不知道怎么开始对话。话不多说,请先看下图中的对话,...

小白用DeepSeek+Python编写软件(用python制作软件)

周末无事,用DeepSeek生成全部代码,写了一个mp3音乐播放器,几分钟搞定,DeepSeek确实太强大了。我的提示语是这么写的:“请用Python语言写一个音乐播放器,支持常见音乐格式,我是Pyt...

零基础使用DeepSeek开发Windows应用程序,超简单超实用!

你敢相信,我居然用DeepSeek开发了一个能用的Windows软件!整个过程就像和学霸同桌组队做作业,我负责提需求,DeepSeek负责写代码改bug,全程碰到任何问题直接丢给DeepSeek即可。...

第二篇:如何安装Python并运行你的第一个程序

欢迎回到我的Python入门教程系列!在上一篇中,我们讨论了为什么Python是一门值得学习的编程语言。今天,我们将迈出第一步:安装Python并运行你的第一个程序。无论你是Windows、macOS...

Python 运行,带你找入口,快速读懂程序

有C或Java编程开发经验的软件开发者,初次接触python程序,当你想快速读懂python项目工程时,是否觉得python程序有些太过随意,让你看有些无所适从,进而有些茫然。这是...

取消回复欢迎 发表评论: