链路追踪--使用nginx-ingress-controller记录后端pod真实ip

news/2025/12/10 0:09:07/文章来源:https://www.cnblogs.com/MrVolleyball/p/19320726

前言

常见的nginx做反向代理架构,nginx转发到后端的多台服务

                 ┌─────────┐│backend-1│└─────────┘┌─────────┐
┌─────┐          │backend-2│
│nginx│  ────►   └─────────┘
└─────┘...┌─────────┐│backend-n│└─────────┘

在传统的部署,如直接部署在nginx上,或者部署在docker中,nginx转发到后面的的backend是固定在nginx的配置文件中的,这也很方便排查问题节点在哪儿:直接看access_log中的upstream_addr即可

该部署的优点非常明显,简单高效易维护,每一条链路,每一个状态都非常清晰。但是缺点也很明显,扩缩容艰难,一旦需要扩容backend,就非常麻烦了,需要首先部署backend,修改nginx转发配置,最后重启nginx

为了提高扩缩容效率,将该架构搬到k8s中

                                        ┌─────────┐│backend-1│└─────────┘┌─────────┐
┌─────┐       ┌───────────────┐         │backend-2│
│nginx│ ────► │backend-service│ ────►   └─────────┘
└─────┘       └───────────────┘            ...┌─────────┐│backend-n│└─────────┘

通过k8s-service的能力,自动做服务发现,每当上/下线一个backend,就会动态发现backend的个数,从此之后,扩缩容就会变得非常简单

但是新的问题来了,问题出现时,比如某个backend出现问题,导致从nginx的日志出现了502,在access_log中显示的upstream_addr并不是后端backend的地址,而是backend-service的地址,无法立刻知道到底是哪个backend 出问题

问题出现了,如何跟踪一条request,能够明确知道它进入了哪一个pod,就是本文需要探索的内容

nginx-ingress

如果架构迁移还在方案验证阶段,那么恭喜,这个方法可以一劳永逸的解决nginx的问题,那就是利用nginx-ingress-controller来作为入口

安装

这个就不班门弄斧了,直接祭出官网

  • github仓库地址
  • 安装脚本地址

这一步需要注意的点不多,就是镜像的问题,镜像有可能拉不下来,至于怎么解决,大家可以看我之前的文章,关于如何拉镜像

安装完成之后

▶ kubectl -n ingress-nginx get pod
NAME                                        READY   STATUS    RESTARTS       AGE
ingress-nginx-controller-78f7f8bd46-tqjm4   1/1     Running   0              1m

nginx-ingress-controller本质和其他的nginx没有什么区别,只不过有一些额外的功能来辅助nginx提供更好的服务,这个一会再讨论

backend后端服务

接着创建一个backend服务,使用最简单的python tornado作为web容器

test.py

from tornado.ioloop import IOLoop
import tornado.httpserver as httpserver
import tornado.web
import osclass TestFlow(tornado.web.RequestHandler):def get(self):ret = 'i am backend in {}'.format(os.environ['HOSTNAME'])self.write(ret)def post(self, *args, **kwargs):print(self.request.body.decode('utf-8'))def applications():urls = []urls.append([r'/', TestFlow])urls.append([r'/test', TestFlow])return tornado.web.Application(urls)def main():app = applications()server = httpserver.HTTPServer(app)server.bind(10000, '0.0.0.0')server.start(1)IOLoop.current().start()if __name__ == "__main__":try:main()except KeyboardInterrupt as e:IOLoop.current().stop()finally:IOLoop.current().close()

将其打包成镜像

Dockerfile

FROM python:3.11-alpineWORKDIR /opt
RUN pip3 install tornado  -i https://mirrors.aliyun.com/pypi/simple/
ADD test.py /opt/test.pyCMD ["python3", "test.py"]
docker build . -t backend-service:v1

制作完成之后将其放入k8s,并且使用一个service作为访问入口

apiVersion: apps/v1
kind: Deployment
metadata:name: backendnamespace: default
spec:replicas: 1selector:matchLabels:app: backendtemplate:metadata:labels:app: backendspec:containers:- image: backend-service:v1imagePullPolicy: Nevername: backendports:- containerPort: 10000protocol: TCP
---
apiVersion: v1
kind: Service
metadata:name: backend-servicenamespace: default
spec:ports:- port: 10000protocol: TCPtargetPort: 10000selector:app: backendtype: ClusterIP
NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
backend-6d4cdd4c68-mqzgj      1/1     Running   0          2m      10.244.0.40   wilson   <none>           <none>
backend-6d4cdd4c68-qjp9m      1/1     Running   0          2m      10.244.0.60   wilson   <none>           <none>

大功告成

创建ingress

继续创建ingress,ingress其实就是nginx转发到后端服务的配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-test-ingressnamespace: default
spec:rules:- host: wilsonchai.comhttp:paths:- backend:service:name: backend-serviceport:number: 10000path: /pathType: Prefix

测试结果

折腾了半天,先捋一下整个的路径,我们创建了nginx-ingress-controller,它是整个系统的入口,其次创建了后端服务backend,请求的终点是该服务,还创建了一系列的service以及ingress,他们的关系如图所示

watermarked-nginx-ingress_1

  • 请求通过nodePort进来进入nginx-ingress。
    ▶ kubectl -n ingress-nginx get svc
    NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.98.224.124   <pending>     80:30296/TCP,443:31592/TCP   30m
    
  • nginx-ingress检查ingress规则,将请求转发至backend-service
    ▶ kubectl  get svc backend-service
    NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
    backend-service   ClusterIP   10.105.148.194   <none>        10000/TCP   30m
    
  • backend-service随机转发该流量进入一个pod
    ▶ kubectl  get pod -owide
    NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
    backend-6d4cdd4c68-mqzgj      1/1     Running   0          30m     10.244.0.40   wilson   <none>           <none>
    backend-6d4cdd4c68-qjp9m      1/1     Running   0          30m     10.244.0.60   wilson   <none>           <none>
    

访问集群: curl -H "host: wilsonchai.com" 127.0.0.1:30296

▶ curl -H "host: wilsonchai.com" 127.0.0.1:30296
i am backend in backend-6d4cdd4c68-qjp9m

请求顺利到达了backend,再检查一下nginx-ingress的日志

10.244.0.1 - - [28/Nov/2025:09:28:45 +0000] "GET / HTTP/1.1" 200 40 "-" "curl/7.81.0" 78 0.001 [default-backend-service-10000] [] 10.244.0.60:10000 40 0.001 200 1896b48d60ef31861478e713d65c9660

upstream_addr上面,显示的就是后端pod的ip: 10.244.0.60

至此,终于解决了开篇提出的问题,如果有request报错502、503等,可以精准的定位到时哪个pod出现了问题

小结

Nginx Ingress Controller 能够直接记录后端 Pod IP,是因为它在转发流量时,绕过了 Service 的 Cluster IP,直接与后端 Pod 建立连接,Nginx Ingress Controller 并不是一个普通的客户端,而是一个特殊的 K8s Controller

  • Service 与 Endpoints: 当创建一个 Service 时,K8s 会自动创建一个相应的 Endpoints 对象(或 EndpointSlice)。这个 Endpoints 对象会实时记录所有与 Service 标签匹配的 后端 Pod 的实际 IP 地址和端口
  • Controller 实时同步: Nginx Ingress Controller 会持续监听 K8s API Server 中所有 Service 对应的 Endpoints 对象的变化(即 Pod 的创建、删除、就绪状态改变)

检验一下,再次访问: curl -H "host: wilsonchai.com" 127.0.0.1:30296

登录到nginx-ingress-controller容器,使用netstat检查连接状态

ingress-nginx-controller-78f7f8bd46-tqjm4:/etc/nginx$ netstat -anpt | grep ESTABLISH
tcp        0      0 10.244.0.16:36074       10.244.0.40:10000       ESTABLISHED -

果然直接与后端的pod建立了连接

后记

盲目的搬进k8s真的是完全错误的,解决了新的问题,又带来更多不可控的问题,所以架构迁移真的需要做好调研:新架构能够满足需求,并且新架构的缺点也能够克服或者忍受,方可行动

有位兄弟说了,如果没有使用nginx-ingress-controller,而是直接把nginx直接搬迁到k8s,那怎么办?并且该文只是解决了nginx访问后端的问题,如果是服务之间的访问,又该怎么办呢?并且这是http协议,如果是其他协议, 比如gRPC,又该怎么办呢?

大家稍安勿躁,本文只是一个引子,后面会把这些问题统统说清楚,敬请期待

联系我

  • 联系我,做深入的交流


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/992519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年 12 月食堂送菜服务商权威推荐榜:新鲜直达、高效配送与智慧供应链管理口碑之选

2025 年 12 月食堂送菜服务商权威推荐榜:新鲜直达、高效配送与智慧供应链管理口碑之选 随着企事业单位、学校、医院等机构后勤社会化改革的深入,以及社会对食品安全、营养均衡与运营效率要求的不断提升,食堂食材配送…

AO3401-ASEMI低压控制领域核芯组件AO3401

AO3401-ASEMI低压控制领域核芯组件AO3401编辑:ll AO3401-ASEMI低压控制领域核芯组件AO3401 型号:AO3401 品牌:ASEMI 封装:SOT-23 批号:最新 漏源电流:4.2A 漏源电压:30V 引脚数量:3 特性:N沟道MOS管 工作温度…

基于BP_Adaboost分类器与RBF神经网络的回归实现

一、BP_Adaboost分类器实现 核心原理:将BP神经网络作为弱分类器,通过Adaboost迭代调整样本权重,最终组合成强分类器。每个弱分类器的错误率影响其权重,同时样本权重动态调整以关注难分类样本。 1. 数据准备与初始化…

高考教育信息智能助手 API 接口

高考教育信息智能助手 API 接口 教育/高考 高考教育信息智能问答助手 智能问答 / 知识库检索 / 多轮对话 AI / 高考 / 高考录取 / 高等教育1. 产品功能RAG 智能体,强大的 AI 问答能力,支持高校基础信息查询、招生政策…

理解 netstat

分享学习和经验,欢迎指正。 含 AI 告知信息。 简单描述一下 netstat,就是可以查看本机网络服务状况,如监听哪些网络端口、端口向哪些网络开放、与其他设备的通信连接状态等等。 笔者平时调试一般都是用到 netstat -…

2025 年 12 月东莞食材配送公司权威推荐榜:生鲜食材、食堂配送服务口碑之选,精选源头直供与高效冷链

2025 年 12 月东莞食材配送公司权威推荐榜:生鲜食材、食堂配送服务口碑之选,精选源头直供与高效冷链 随着东莞城市化进程的加速和餐饮服务业的蓬勃发展,食材配送行业已成为连接田间地头与餐桌的关键纽带。尤其在大型…

2025年geo优化监控系统推荐:AI驱动下的流量突围利器

2025年,生成式引擎优化(GEO)已从数字营销的“加分项”升级为企业获客的“必选项”,伴随AI搜索用户规模突破15亿,geo优化与AI技术的深度融合彻底重构了流量逻辑。在这一背景下,geo优化服务商、AI优化服务商已成为…

2025 年 12 月精品包装盒,礼盒包装盒厂家最新推荐,产能、专利、环保三维数据透视!

引言​ 在品牌竞争白热化的当下,精品包装盒与礼盒包装盒已成为传递品牌价值、提升产品溢价的核心载体。然而市场上产品品质良莠不齐,选材不达标、工艺粗糙、环保不达标等问题频发。为精准筛选优质厂家,本次榜单由中…

MoonBit Pearls Vol.15: 启用 MoonBit 和 Wassette 构建安全的 WebAssembly 工具

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Gartner发布2026年战略趋势:当AI重塑一切,你的业务流程还跟得上吗?(附报告原文下载)

Gartner发布2026年战略趋势:当AI重塑一切,你的业务流程还跟得上吗?(附报告原文下载)我们无法替你打造AI超级计算平台,但能帮你先让流程"智能就绪" 近日,Gartner发布了2026年十大战略技术趋势,为我们描…

2025 年 12 月东莞生鲜食材配送权威推荐榜:新鲜果蔬/有机蔬菜/食堂大型配送,专业高效与品质保障口碑之选

2025 年 12 月东莞生鲜食材配送权威推荐榜:新鲜果蔬/有机蔬菜/食堂大型配送,专业高效与品质保障口碑之选 随着东莞城市化进程的加速和居民生活水平的持续提升,餐饮服务、企事业单位食堂、大型商超及家庭对高品质生鲜…

紧急!Next.js高危漏洞致服务器被黑,我已经中招了!附解决方案

刚刚,我的服务器因为一个高危漏洞被入侵了,沦为了矿机!把我的经历分享出来,希望更多程序员朋友们不要中招,抓紧预防处理。刚刚,我的服务器因为一个高危漏洞被入侵了,沦为了矿机!把我的经历分享出来,希望更多程…

2025英国出国留学中介排名

2025英国出国留学中介排名一、2025年如何选择英国留学中介作为从业12年的国际教育规划师,我经常被学生和家长问及:2025年申请英国留学,中介机构该如何筛选?事实上,选择中介需综合考量多个维度,而非单一依赖口碑或…

2025年GEO优化系统公司推荐:AI流量时代的掘金伙伴

2025年,生成式AI的爆发式增长彻底重构了流量规则,GEO优化(生成式引擎优化)已从企业营销的“加分项”变为生存发展的“必选项”。当DeepSeek优化排名、豆包优化排名、文心一言优化排名成为企业流量竞争的核心战场,…

2025英国留学中介机构排名上海

2025英国留学中介机构排名上海一、2025年上海地区英国留学中介如何选择?作为从业12年的国际教育规划师,我经常遇到学生和家长询问:"2025年上海地区有哪些靠谱的英国留学中介?"这个问题确实值得深入探讨。…

Transformer 详解:从架构到训练

Transformer 详解:从架构到训练的完整指南本文基于 Transformer Explainer 可视化工具,结合 GPT-2 (small) 模型,详细解释 Transformer 的完整工作流程,包括前向传播、损失计算和反向传播的数学推导。目录整体架构…

2025年东莞智能开关品牌权威推荐榜单:好光时代‌/轻智能品牌‌/智能家居‌‌品牌精选

随着智能家居向“简单稳定、即装即用”的方向迈进,传统开关的智能化改造成为市场焦点。据预测,到2025年,中国智能照明市场规模有望突破1500亿元。在这一浪潮中,一些深耕技术、精准解决用户痛点的品牌正在脱颖而出,…

CISA速通(二)IT治理与管理

CISA速通(二)IT治理与管理视频来源:五小时速通CISA考试_第一章_哔哩哔哩_bilibili、五小时速通CISA考试_第二章(1)_哔哩哔哩_bilibili、五小时速通CISA考试_第二章(2)_哔哩哔哩_bilibili、五小时速通CISA考试_第…

SpringBoot整合OpenAI

记录一下SpringBoot整合OpenAI的过程 要求是jdk17 1、添加pom.xml文件的依赖如下:<!-- 管理依赖--><dependencyManagement><dependencies><dependency><groupId>org.springframewor…

事倍功半是蠢蛋63 cursor一直卡在planning next move

省流 重装回1.7 https://forum.cursor.com/t/cursor-runs-very-slowly-and-gets-stuck-on-planning-next-moves/140994/17