千家信息网

Ingress-Nginx工作原理是什么

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容介绍了"Ingress-Nginx工作原理是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2025年12月02日Ingress-Nginx工作原理是什么

本篇内容介绍了"Ingress-Nginx工作原理是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

这个图算是一个通用的前后端分离的 k8s 部署结构:

Nginx Ingress 负责暴露服务(nginx前端静态资源服务), 根据十二要素应用的原 则,将后端 api 作为 nginx 服务的附加动态资源。

Ingress vs Ingress-nginx

Ingress 是一种向 k8s 集群外部的客户端公开服务的方法, Ingress 在网络协议栈的应用层工作,

根据请求的主机名 host 和路径 path 决定请求转发到的服务。

在应用Ingress 对象提供的功能之前,必须强调集群中存在Ingress Controller, Ingress资源才能正常工作。

我这里web项目使用的是常见的Ingress-nginx (官方还有其他用途的 Ingress),Ingress-nginx 是使用nginx 作为反向代理和负载均衡器的 K8s Ingress Controller, 作为Pod运行在kube-system 命名空间。

了解 Ingress 工作原理,有利于我们与运维人员打交道。

下面通过 Ingress-nginx 暴露 Kibana 服务:

--- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:   name: kibana   labels:     app: kibana   annotations:     kubernetes.io/ingress.class: "nginx"     nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"     nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"     nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"     nginx.ingress.kubernetes.io/proxy-body-size: "8m"     nginx.ingress.kubernetes.io/ssl-redirect: "true" spec:   tls:     - hosts:       - 'https://logging.internal.gridsum.com/'       secretName: tls-cert   rules:     - host: 'https://logging.internal.gridsum.com'       http:         paths:           - path: /             backend:               serviceName: kibana               servicePort: 5601

☹️ Ingress-nginx 中最让我困惑的是它的Paths分流与rewrite-target注解。

  • Paths 分流 一般用于 根据特定的 Path,将请求转发到特定的后端服务 Pod,后端服务 Pod 能接收到 Path 这个信息。一般后端服务是作为 api。

  • rewrite-target 将请求重定向到后端服务, 那有什么用处呢?

答:以上面暴露的 kibana 为例, 我们已经可以在https://logging.internal.gridsum.com/ 访问完整的 Kibana, 如果我想利用这个域名暴露 ElasticSearch 站点,怎么操作?这时就可以利用rewrite-target,

--- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:   name: elasticsearch   labels:     app: kibana   annotations:     kubernetes.io/ingress.class: "nginx"     nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"     nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"     nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"     nginx.ingress.kubernetes.io/proxy-body-size: "8m"     nginx.ingress.kubernetes.io/ssl-redirect: "true"     nginx.ingress.kubernetes.io/rewrite-target: "/$2" spec:   tls:     - hosts:       - 'logging.internal.gridsum.com'       secretName: tls-cert   rules:     - host: 'logging.internal.gridsum.com'       http:         paths:           - path: /es(/|$)(.*)             backend:               serviceName: elasticsearch               servicePort: 9200

在此 Ingress 定义中,由(.*)捕获的所有字符都将分配给占位符$2,然后将其用作重写目标注解中的参数。这样的话:https://logging.internal.gridsum.com/es 将会重定向到后端 elasticsearch 站点,并且忽略了 es 这个 path

Ingress-nginx 到 webapp 的日志追踪

熟悉我的朋友知道, 我写了《一套标准的ASP.NET Core容器化应用日志收集分析方案》,这里面主要是 BackEnd App 的日志,从我上面的结构图看,

Ingress-nginx----> Nginx FrontEnd App--->BackEnd App 需要一个串联的追踪 Id, 便于观察运维网络和业务应用。

幸好 Ingress-nginx, Nginx 强大的配置能力帮助我们做了很多事情:

  • 客户端请求到达 Ingress-Nginx Controllerr,Ingress-Nginx Controller 会自动添加一个X-Request-ID的请求 Header (随机值)---- 这个配置是默认的

  • 请求达到 Nginx FrontEnd App, Nginx 有默认配置proxy_pass_request_headers on;, 自动将请求头都传递到上游的 Backend App

这样跨越整个结构图的 request_id 思路已经清楚了,最后一步只需要我们在 Backend App 中提取请求中携带的X-Request-ID, 并作为日志的关键输出字段。

☺️ 这就涉及到怎么自定义日志的LayoutRender。

下面为Asp.NETCore NLog 自定义名为x_request_id的 Render,该 Render 从请求的 X-Request-ID 标头中提取值。

① 定义 NLog Render

///      /// Represent a unique identifier to represent a request from the request HTTP header X-Request-Id.     ///      [LayoutRenderer("x_request_id")]     public class XRequestIdLayoutRender : HttpContextLayoutRendererBase     {         protected override void Append(StringBuilder builder, LogEventInfo logEvent)         {             var identityName = HttpContextAccessor.HttpContext?.Request?.Headers?["X-Request-Id"].FirstOrDefault();             builder.Append(identityName);         }     }     ///      /// Represent a http context layout renderer to access the current http context.     ///      public abstract class HttpContextLayoutRendererBase : LayoutRenderer     {         private IHttpContextAccessor _httpContextAccessor;         ///          /// Gets the .         ///          protected IHttpContextAccessor HttpContextAccessor { get { return _httpContextAccessor ?? (_httpContextAccessor = ServiceLocator.ServiceProvider.GetService()); } }     }     internal sealed class ServiceLocator     {         public static IServiceProvider ServiceProvider { get; set; }     }

② 从请求中获取 X-Request-Id 依赖 IHttpContextAccessor 组件

这里使用依赖查找的方式获取该组件,故请在Startup ConfigureService 中生成服务

public void ConfigureServices(IServiceCollection services)  {      // ......      ServiceLocator.ServiceProvider = services.BuildServiceProvider();  }

③ 最后在 Program 中注册这个NLog Render:

 public static void Main(string[] args) {      LayoutRenderer.Register("x_request_id");      CreateHostBuilder(args).Build().Run(); }

这样从 Ingress-Nginx 产生的request_id,将会流转到 Backend App, 并在日志分析中起到巨大作用,也便于划清运维/开发的故障责任。

"Ingress-Nginx工作原理是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

服务 日志 工作 应用 原理 结构 资源 配置 内容 客户 客户端 更多 注解 知识 站点 组件 结构图 网络 集群 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 专业软件开发价格多少 益阳软件开发合同律师哪家好 苏州软件开发哪家实惠 我的世界服务器管理员故意欺负人 网络安全文明上网班会流程 网络安全法对个人信息保护要点 lsh数据库 u8系统在哪里重启数据库服务 中华人民共和国网络安全条律 数据库一个表可以设置多个字 寿险互联网科技平台有哪些 小米原神服务器名称 网络安全手抄报丰富多彩 软件开发与程序开发 我是网络安全小卫士手抄报怎么画 软件开发板块涨价 h5下拉框随数据库 数据库有哪些语言 软件开发者误报反馈 开展网络安全宣传周活动心得 vb建立查询数据库连接 软件开发最难的阶段物理设计阶段 广西在线云互联网科技公司 数据库学生表年龄 数据库自动创建影响性能吗 山西餐饮软件开发服务介绍 阿克苏网络技术调试 数据库泄露危害 时序数据库配置 学校的校园网络安全吗
0