透彻!Ingress-nginx工作原理和实践,这操作可以吧

article/2025/10/4 10:43:04

本文记录/分享 目前项目的 K8s 部署结构和请求追踪改造方案

透彻!Ingress-nginx工作原理和实践,这操作可以吧

 

这个图算是一个通用的前后端分离的 k8s 部署结构:
Nginx Ingress 负责暴露服务(nginx前端静态资源服务), 根据十二要素应用的原
则,将后端 api 作为 nginx 服务的附加动态资源。

Ingress vs Ingress-nginx#

Ingress 是一种向 k8s 集群外部的客户端公开服务的方法, Ingress 在网络协议栈的应用层工作,
根据请求的主机名 host 和路径 path 决定请求转发到的服务。

透彻!Ingress-nginx工作原理和实践,这操作可以吧

 

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

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

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

透彻!Ingress-nginx工作原理和实践,这操作可以吧

 

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

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: kibanalabels:app: kibanaannotations: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-certrules:- host: 'https://logging.internal.gridsum.com'http:paths:- path: /backend:serviceName: kibanaservicePort: 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: elasticsearchlabels:app: kibanaannotations: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-certrules:- host: 'logging.internal.gridsum.com'http:paths:- path: /es(/|$)(.*)backend:serviceName: elasticsearchservicePort: 9200

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

透彻!Ingress-nginx工作原理和实践,这操作可以吧

 

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

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

① 定义 NLog Render

    /// <summary>/// Represent a unique identifier to represent a request from the request HTTP header X-Request-Id./// </summary>[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);}}/// <summary>/// Represent a http context layout renderer to access the current http context./// </summary>public abstract class HttpContextLayoutRendererBase : LayoutRenderer{private IHttpContextAccessor _httpContextAccessor;/// <summary>/// Gets the <see cref="IHttpContextAccessor"/>./// </summary>protected IHttpContextAccessor HttpContextAccessor { get { return _httpContextAccessor ?? (_httpContextAccessor = ServiceLocator.ServiceProvider.GetService<IHttpContextAccessor>()); } }}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<XRequestIdLayoutRender>("x_request_id");CreateHostBuilder(args).Build().Run();
}

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

  • https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#generate-request-id
  • http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_request_headers

总结#

  1. 了解了Ingress在应用层工作,根据Host和Path暴露k8s服务
  2. 本文梳理了Ingress和常见的Ingress-nginx的关系
  3. 对于应用了Ingress的应用,梳理了从Ingress-Nginx到WebApp的日志追踪id, 便于排查网络/业务故障

http://chatgpt.dhexx.cn/article/9vArFAtI.shtml

相关文章

nginx的工作原理与nginx的配置

1、nginx的工作原理 nginx的模块直接被编译进nginx&#xff0c;因此属于静态编译方式。 启动nginx后&#xff0c;nginx的模块被自动加载&#xff0c;与Apache不一样&#xff0c;首先将模块编译为一个so文件&#xff0c;然后在配置文件中指定是否进行加载。 在解析配置文件时&am…

详解Nginx的核心原理

Nginx的核心原理 本节为大家介绍Nginx的核心原理&#xff0c;包含Reactor模型、Nginx的模块化设计、Nginx的请求处理阶段。 虽然本节的知识有一定的理论深度&#xff0c;但是与另一个有名的Java底层通信框架Netty在原理上有很多相似的地方。如果大家了解Netty的原理和Reactor…

nginx工作原理、配置以及web服务器的资源请求过程

nginx工作原理、配置以及web服务器的资源请求过程 1. nginx简介2. nginx的特性与优点2.1 nginx的特性2.2 nginx的优点2.3 nginx工作原理2.4 Nginx的模块从功能上分为如下三类&#xff1a; 3. nginx进程架构4. web服务器请求资源的过程5. nginx的配置6. nginx的安装与配置6.1 ng…

Nginx(1)— Nginx工作原理

Nginx的模块与工作原理 Nginx由内核和模块组成&#xff0c;其中&#xff0c;内核的设计非常微小和简洁&#xff0c;完成的工作也非常简单&#xff0c;仅仅通过查找配置文件将客户端请求映射到一个location block&#xff08;location是Nginx配置中的一个指令&#xff0c;用于U…

nginx工作原理与配置

nginx工作原理与配置 文章目录 nginx工作原理与配置nginx的模块与工作原理nginx的模块分类nginx的工作原理 nginx的安装与配置nginx安装nginx配置 nginx的配置文件详解nginx.conf配置详解用于调试、定位问题的配置参数https配置基于用户认证开启状态界面URLURL - 统一资源定位器…

Nginx工作原理和优化、漏洞

1. Nginx的模块与工作原理 Nginx由内核和模块组成&#xff0c;其中&#xff0c;内核的设计非常微小和简洁&#xff0c;完成的工作也非常简单&#xff0c;仅仅通过查找配置文件将客户端请求映射到一个location block&#xff08;location是Nginx配置中的一个指令&#xff0c;用…

nginx 工作原理

1. Nginx的模块与工作原理 Nginx由内核和模块组成&#xff0c;其中&#xff0c;内核的设计非常微小和简洁&#xff0c;完成的工作也非常简单&#xff0c;仅仅通过查找配置文件将客户端请求映射到一个location block&#xff08;location是Nginx配置中的一个指令&#xff0c;用…

nginx工作原理及配置

模块与工作原理 nginx由内核和模块组成。其中&#xff0c;内核的设计非常微小和简洁&#xff0c;完成的工作也非常简单&#xff0c;仅仅通过查找配置文件将客户端请求映射到一个location block&#xff08;location是nginx配置中的一个指令&#xff0c;用于URL匹配&#xff09…

Nginx工作原理

一、明确Nginx与Tomcat的区别 web上的server都叫web server&#xff0c;但是大家分工也有不同的。 nginx常用做静态内容服务和代理服务器&#xff0c;直面外来请求转发给后面的应用服务&#xff08;tomcat&#xff09;&#xff0c;tomcat更多用来做一个应用容器&#xff0c;让…

nginx工作原理详解

一、Nginx请求处理流程 图解&#xff1a; 进入nginx的大致三种流量&#xff1a;WEB、EMAIL及TCP Nginx中三个状态机&#xff1a; 传输层状态机&#xff1a;处理TCP/UDP四层传输层HTTP状态机&#xff1a;处理应用层MAIL状态机&#xff1a;处理邮件 状态机作用&#xff1a;Ngin…

nginx工作原理:

首先nginx,采用的是多线程&多路io复用模型,使用I/O多路复用技术的nginx,成就了”并发驱动”的服务器. nginx的框架模型: 进程组件角色: master进程: 监视工作进程的状态,当工作进程死掉后重启一个新的,处理信号和通知工作进程. work进程: 处理客户端请求,从主进程处获得…

原来使用 Spring 实现策略模式可以这么简单

策略模式作为一种软件设计模式&#xff0c;指对象有某个行为&#xff0c;但是在不同的场景中&#xff0c;该行为有不同的实现算法&#xff0c;可以替代代码中大量的 if-else。 比如我们生活中的场景&#xff1a;买东西结账可以使用微信支付、支付宝支付或者银行卡支付&#xf…

策略设计模式

介绍 Java策略模式(Strategy Pattern)是一种行为设计模式,它允许再运行时动态选择算法的行为.策略模式通过将算法封装在可互换的策略对象中,使得客户端代码能够轻松地切换算法,而无需修改原始代码.在策略模式中,每个算法都被实现为一个单独的策略类,这些策略类都实现了相同的接…

Java 设计模式——策略模式(行为型设计模式)

策略模式用我个人的理解就是&#xff1a; 用一种更灵活更优雅和更健壮的方式替换了if…else… 一、问题引入 当我们导出一些数据到Excel表格时&#xff0c;有时候需要从不同的维度导出&#xff08;如&#xff1a;个人维度&#xff0c;时间维度&#xff09;&#xff0c;不同维…

采用注解实现策略模式

目录 一、前言 二、采用简单的注解方式进行业务策略模式 &#xff08;一&#xff09;场景举例 &#xff08;二&#xff09;实现方案 1、基本代码准备 2、基本功能接口定义 3、定义注解与不同的策略实现 4、业务实际使用 5、测试及结果展示 三、采用组合的注解方式进行…

​JAVA设计模式(六)——策略模式

下图为所有设计模式&#xff0c;带标记为重点掌握以及工作中常用到的&#xff1a; 策略模式是行为型设计模式之一&#xff0c;其作用是让一个类的行为或其算法可以在运行时更改&#xff0c;该模式也算是我比较熟悉的模式之一了&#xff0c;因为之前项目中有幸遇到大佬用过&…

java 策略模式例子_策略模式—Java实现(转)

1. 现实需求 客户有了新的需求&#xff0c;这时我们直接新增策略即可&#xff0c;改很少的代码。基本符合我们面向对象原则中的开闭原则(对扩展开放&#xff0c;对修改关系)&#xff0c;实现了高内聚低耦合。 2. 策略模式定义 策略模式&#xff0c;又叫算法簇模式&#xff0c;就…

Java设计模式(五)策略模式-在SpringBoot项目中的实际应用

文章目录 什么是策略模式优点缺点使用场景结构图 策略模式的简单示例策略模式的项目实战场景实现 小结 什么是策略模式 官话&#xff1a;策略模式(Strategy Pattern)&#xff1a; 定义一系列算法类&#xff0c;将每一个算法封装起来&#xff0c;并让它们可以相互替换&#xff…

java调用微信加密_java微信消息加解密

今天心血来潮就信手拈来学了下微信消息加解密的知识,忽然觉得微信真的好强大。可能在大部分项目微信消息的加解密都用不上,但是仍然不排除有使用到的情况,如涉及金钱方面的微信应用包括商城类、金融类还有其他安全级别要求很高的微信应用。针对这些情况我觉得还是有必要分享…

spring如何使用策略模式

这里使用登录做例子介绍如何实现登录的多种策略 上图是策略模式的基础模型。 context Context上下文角色&#xff0c;也叫Context封装角色&#xff0c;起承上启下的作用&#xff0c;屏蔽高层模块对策略、算法的直接访问&#xff0c;封装可能存在的变化。 Strategy 策略角色…