俄罗斯入口Nginx是如何工作的呢(1)?
ingress-nginx是什么?
在解释 ingress-nginx 之前,先简单解释一下 Kubernetes 的 Ingress 和 Ingress Controller。
Ingress是什么东西?
根据Ingress的官方文档,Ingress是指的
一个API对象用于管理集群中服务的外部访问,通常是HTTP。
Ingress可以提供负载均衡、SSL终止和基于名称的虚拟主机。
作为控制对服务访问的功能,它是提供负载均衡、SSL和虚拟主机等功能的API对象。
Ingress Controller是什么?
根据Ingress Controller的官方文件,Ingress Controller是指
为了使Ingress资源正常工作,集群必须运行一个Ingress控制器。
Ingress资源是一种设置,其实现类似于Ingress控制器可以按照该设置来运行。
在实现方面,有基于envoy、HAProxy、nginx等各种不同的控制器,它们分别满足Ingress定义的规范,并提供各种独特的扩展功能(如金丝雀发布机制)。
用户根据自己的需求,决定选择哪种实现作为Ingress控制器来使用。
实际上,就像普通的应用程序一样,需要将Ingress Controller的Deployment和Service部署到Kubernetes中。
ingress-nginx是什么?
终于到正题了。kubernetes/ingress-nginx是Ingress Controller的一种实现,是在Kubernetes Community的代码库中开发的。
除了由NGINX, Inc.提供的NGINX Ingress Controller for Kubernetes,还有一个基于Nginx的Ingress Controller——ingress-nginx。由于它是由社区基于开源方式开发的,因此添加了许多实验性的功能等。
关于具体差异的详细信息也写在了官方文档中。
ingress-nginx是以何种机制运行的?
看了how-it-works.md文件中的概述,同时参考源代码(v0.26.1)的情况下,试图以图表方式呈现整体结构,大致就是这个样子(应该是这样的)。

主要处理
主要的进程是由Go语言构建的二进制文件运行,基于Kubernetes的资源(包括Ingress、ConfigMap、Service等)信息来控制nginx。具体来说,
-
- Kubernetesのリソース情報を取得
-
- nginxプロセスの起動/リロード
-
- nginx.confの作成/更新
- LuaモジュールのConfigurationの更新
正在进行类似的处理。
Kubernetes 资源监控
如果Ingress资源等更新了nginx配置的信息,则需要将这些信息同步到ingress-nginx中。为此,ingress-nginx通过kubernetes/client-go库监视Kubernetes的各种资源。
如果想了解我们是如何进行监视的,请查看sample-controller仓库中的controller-client-go.md文件,这将很清楚地解释,希望感兴趣的人可以参考一下。
Lua 模块
除了通过Go构建的二进制文件之外,ingress-nginx还提供在nginx进程内运行的Lua模块。这些模块根据接收到的配置信息,执行各种算法来进行负载均衡、金丝雀发布的控制等操作。
接下来
在”Ingress-nginx的工作原理(2)”中,我们将会通过跟踪代码来深入了解其详细的处理流程。