Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nginx Ingress 控制器工作原理

Nginx Ingress 控制器工作原理

作者头像
CNCF
发布于 2020-04-01 08:58:52
发布于 2020-04-01 08:58:52
2K0
举报
文章被收录于专栏:CNCFCNCF

原文链接:https://kubernetes.github.io/ingress-nginx/how-it-works/

本文的目的是解释 Nginx Ingress 控制器的工作原理,特别是 Nginx 模型的构建方式以及我们为何需要这个模型。

1. NGINX 配置

ingress-nginx 的目标是构造配置文件(nginx.conf),主要用途是在配置文件有任何变更后都需要重新加载 NGINX。不过需要特别注意的是,在只有 upstream 配置变更的时候我们不需要重新加载 Nginx(即当你部署的应用 Endpoints 变更时)。我们使用 lua-nginx-module(https://github.com/openresty/lua-nginx-module) 达到这个目的。请通过 下面的内容 来了解有关操作方法的更多信息。

2. NGINX 模型

通常,一个 Kubernetes 控制器采用 synchronization loop pattern(https://coreos.com/kubernetes/docs/latest/replication-controller.html#the-reconciliation-loop-in-detail) 来检查控制器中所需的状态是否已更新或者需要变更。为了达到这个目的,我们需要使用集群中放入不同对象来构建模型,特别是 Ingresses、Services、Endpoints、Secrets 以及 Configmaps 来生成反映集群状态时间点的配置文件。

为了从集群获取这些对象,我们使用 Kubernetes Informers(https://godoc.org/k8s.io/client-go/informers#NewFilteredSharedInformerFactory),特别是 FilteredSharedInformer。当一个新的对象添加、修改或者删除的时候,informers 允许通过 回调(https://godoc.org/k8s.io/client-go/tools/cache#ResourceEventHandlerFuncs) 针对单个变更进行响应。不过没有办法知道一个特定的变更是否会影响最终的配置文件,所以在每次变更时,我们都必须基于集群的状态重新构建一个新模型,并将其和当前的模型进行比较。如果新模型等于当前模型,那么我们就可以避免生成新的 NGINX 配置并触发重新加载,否则,我们就通过 Endpoints 来检查不同,然后使用 HTTP POST 请求一个新的 Endpoints 列表发送给运行在 Nginx 中的 Lua 程序并且避免重新生成一个新的 NGINX 配置以及触发重新加载。如果运行的模型和当前的差异不仅仅是 Endpoints,我们则基于新的模型创建一个新的 NGINX 配置文件,替代当前的模型并触发一次重新加载。

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

生成 NGINX 配置最终是从一个 Go template 生成的,使用新模型作为这个模板所需要的变量输入。

3. 构建 NGINX 模型

建立模型是一项成本比较高的操作,所以必须使用同步循环。通过使用 work queue(https://github.com/kubernetes/ingress-nginx/blob/master/internal/task/queue.go#L38),可以不丢失变更并通过 sync.Mutex 移除来强制执行一次同步循环,此外还可以在同步循环的开始和结束之间创建一个时间窗口,从而允许我们摒弃不必要的更新。重要的是要理解,集群中的任何变更都会生成事件,然后 informer 会发送给控制器,这也是使用 work queue 的原因之一。

建立模型的操作方式:

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

4. 重新加载

下面描述了一些需要重新加载的场景:

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

5. 避免重新加载

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

5.1 避免 Endpoints 变更时重新加载

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

在频繁部署应用的较大集群中,这个特性可以避免大量的 Nginx 重新加载,否则会影响响应延迟,负责均衡质量(每一次重新加载 Nginx 都会重置负载均衡状态)等等。

5.2 避免因错误的配置而中断

因为 ingress-nginx 使用 synchronization loop pattern,它对所有匹配到的对象应用配置。如果某些 Ingress 对象配置损坏,如 nginx.ingress.kubernetes.io/configuration-snippet 这个 annotation 语法错误,生成的配置变得无效,将不会重新加载,并不再考虑其它 Ingress。

为了防止这种情况发生,nginx ingress 控制器选择暴露一个 validating admission webhook server(https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#validatingadmissionwebhook) 以确保传入的 ingress 对象可用性。这个 webhook 把传入的 ingress 对象追加到 ingresses 列表上,生成配置并调用 nginx 以确保配置没有语法错误。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
kubernetes1.22安装使用ingress-nginx
我们已经了解了 Ingress 资源对象只是一个路由请求描述配置文件,要让其真正生效还需要对应的 Ingress 控制器才行,Ingress 控制器有很多,这里我们先介绍使用最多的 ingress-nginx,它是基于 Nginx 的 Ingress 控制器。
我是阳明
2021/12/27
3.2K0
kubernetes1.22安装使用ingress-nginx
APISIX Ingress 控制器的安装及原理
APISIX 是动态、实时、高性能的 API 网关。它提供丰富的流量管理功能,比如负载均衡、动态上游、金丝雀发布、熔断、认证、可观测性等。既可以使用 APISIX API 网关处理传统的南北向流量,也可以使用它处理服务间的东西向流量。同时,它也可被用作 Kubernetes Ingress 控制器。 APISIX Ingress 控制器提供 Helm 安装方式,但是使用原生 YAML 安装,更加有助于理解其原理。
小阑本阑
2023/06/09
1.2K0
APISIX Ingress 控制器的安装及原理
Ingress-Nginx 服务暴露基础学习与实践 (2)
更多学习笔记文章请关注 WeiyiGeek 公众账号,学习交流【邮箱联系: Master#weiyigeek.top】
全栈工程师修炼指南
2021/07/25
3.3K0
Ingress-Nginx 服务暴露基础学习与实践 (2)
Kubernetes Ingresses (1)
在连接上一个 k8s cluster 后执行下面的命令可以看到系统中的ingressclasses。这篇文字用来帮助自己理解下面几行简单的输出。
dhyuan
2023/08/28
2440
Kubernetes Ingresses (1)
Nginx-Ingress详解
k8s 中所有的资源都有对应的控制器在操控这个资源,管理资源的生命周期,实现”声明式“效果。Deployment、Service、Replicaset等资源的控制器封装在k8s内置的 controller-manager进程中。
kinnylee
2021/12/30
6.8K1
ingress的用法与原理[通俗易懂]
我们知道真正提供服务的是后端的pod,但是为了负载均衡,为了使用域名,为了….,service诞生了,再后来ingress诞生了,那么为什么需要有Ingress呢?先看看官网怎么说的:
全栈程序员站长
2022/09/06
2.1K0
Nginx Ingress解析
负载均衡(Load Balancer,简称 LB)是指把客户端访问的流量通过负载均衡器,然后根据指定的一些负载均衡策略进行转发,最终可以均匀的分摊到后端上游服务器上,然后上游服务器进行响应后再返回数据给客户端。负载均衡的最常见应用是充当反向代理,通过负载均衡,可以大大的提高服务的响应速度、提高并发请求、提高稳定性(防止单点故障)。 负载均衡的基本实现方案,从业界来看,一般分为软件和硬件两大类,软件负载均衡又可以分层如4层、7层负载均衡,如下:
tunsuy
2023/08/19
3550
Nginx Ingress解析
Ingress-Nginx 服务暴露基础学习与实践
描述: 到目前为止我们了解kubernetes常用的三种暴露服务的方式:LoadBlancer Service、 NodePort Service、Ingress
全栈工程师修炼指南
2022/09/29
3K1
Ingress-Nginx 服务暴露基础学习与实践
一篇文章看明白 nginx-ingress 控制器
其中192.168.1.10:5001,192.168.1.10:5001我们把他们称为 Endpoint,就是所谓的具体的服务,比如 order 订单服务。
DevOps时代
2021/03/15
2K0
6张图循序渐进讲透Kubernetes Ingress资源对象
Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到外部,比如 ingress-nginx,本质上来说它只是一个 Nginx Pod,然后将请求重定向到其他内部(ClusterIP)服务去,这个 Pod 本身也是通过 Kubernetes 服务暴露出去,最常见的方式是通过 LoadBalancer 来实现的。同样本文我们希望用一个简单清晰的概述,让你来了解 Kubernetes Ingress 背后的东西,让你更容易理解使用的 Ingress。
公众号: 云原生生态圈
2020/11/10
9280
6张图循序渐进讲透Kubernetes Ingress资源对象
编排系统K8S Ingress-nginx源码解析
上篇文章介绍了Ingress-nginx的基本架构原理,具体可参考:
Luga Lee
2021/12/09
8780
编排系统K8S Ingress-nginx源码解析
再战 k8s(15):Ingress和Ingress Controller
从前面的学习,我们可以了解到Kubernetes暴露服务的方式目前只有三种:LoadBlancer Service、ExternalName、NodePort Service、Ingress;而我们需要将集群内服务提供外界访问就会产生以下几个问题:
看、未来
2022/05/06
1.6K0
再战 k8s(15):Ingress和Ingress Controller
Ingress API 的增强属性
我们知道在 Kubernetes 集群内部使用 kube-dns 实现服务发现的功能,那么我们部署在 Kubernetes 集群中的应用如何暴露给外部的用户使用呢?我们知道可以使用 NodePort 和 LoadBlancer 类型的 Service 可以把应用暴露给外部用户使用,除此之外,Kubernetes 还为我们提供了一个非常重要的资源对象可以用来暴露服务给外部用户,那就是 Ingress。对于小规模的应用我们使用 NodePort 或许能够满足我们的需求,但是当你的应用越来越多的时候,你就会发现对于 NodePort 的管理就非常麻烦了,这个时候使用 Ingress 就非常方便了,可以避免管理大量的端口。
我是阳明
2021/12/16
7250
Ingress API 的增强属性
vivo AI计算平台 Kubernetes集群Ingress网关实践
vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经在 kubernetes 集群、以及离线的深度学习模型训练等方面,积累了众多宝贵的开发、运维经验,并逐步打造出稳定的基础容器平台 - AI 容器平台(VContainer)。为了支撑公司 AI 在线业务的发展,满足公司对算力资源的高效调度管控需求,需要将在线业务,主要包括 C 端、推理等业务,由原来的虚拟机或物理机迁移至 AI 容器平台。于是小组从 2020 年初开始,基于在线业务的需求对 AI 容器平台进行进一步建设,并将平台与公司的 CMDB、CICD 等基础模块进行打通,使在线业务能够顺利从虚拟机、物理机迁移至 AI 容器平台。
深度学习与Python
2020/12/18
7360
kubernetes-ingress(十)
https://kubernetes.io/docs/concepts/services-networking/ingress/
yuezhimi
2020/09/30
5240
kubernetes-ingress(十)
Ingress-Nginx 服务暴露基础学习与实践(1)
本章讲解通过服务发现的功能进行实现 , 由 Ingress controller 来提供路由信息的刷新, Ingress controller可以理解为一个监视器不断监听 kube-apiserver 实时感知service、Pod的变化
全栈工程师修炼指南
2021/07/25
3.2K0
七层调度:ingress 资源及 Ingress Controller 控制器
使用 Service NodePort 可以实现 IP:端口 对外访问,通过任意 Node 节点可访问对应的资源,这意味着每个端口只能使用一次,一个端口对应一个应用。
懒人的小脑
2020/11/30
1.9K0
七层调度:ingress 资源及 Ingress Controller 控制器
【K8s】Kubernetes 服务发现之 Ingress
Ingress 是 Kubernetes 提供的一种服务发现机制,主要作用是为集群外部访问集群内部服务提供访问入口,通过制定 Ingress 策略管理 HTTP 路由,将集群外部的访问请求反向代理到集群内部不同 Service 对应的 Endpoint(即 Pod)上。
行者Sun
2024/09/02
2370
【K8s】Kubernetes 服务发现之 Ingress
kubernetes系列教程(十六)基于nginx ingress实现服务暴露
本章介绍kubernetes系列教程的ingress概念,在kubernetes中对外暴露服务的方式有两种:service(NodePort或者外部LoadBalancer)和ingress,其中service是提供四层的负载均衡,通过iptables DNAT或lvs nat模式实现后端Pod的代理请求。如需实现http,域名,URI,证书等请求方式,service是无法实现的,需要借助于ingress来来实现,本文将来介绍ingress相关的内容。
HappyLau谈云计算
2020/01/01
41.2K0
kubernetes系列教程(十六)基于nginx ingress实现服务暴露
kubernetes通俗易懂的ingress-nginx部署示例
pod的IP以及service IP只能在集群内访问,如果想在集群外访问kubernetes提供的服务,可以使用nodeport、proxy、loadbalacer以及ingress等方式,由于service的IP集群外不能访问,就使用ingress方式再代理一次,即ingress代理service,service代理pod。
天天向上_82634
2021/11/19
8.5K0
kubernetes通俗易懂的ingress-nginx部署示例
相关推荐
kubernetes1.22安装使用ingress-nginx
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档