云原生网关 Ingress-Nginx 链路追踪实战:OpenTelemetry 采集与观测云集成方案
背景在大型分布式系统中服务之间调用复杂链路追踪可以帮助梳理请求流向现代系统也需要实时监控来快速响应事件以及故障让我们了解系统瓶颈和高负载路径从而可以进行优化。Ingress-Nginx 是在 Kubernetes 环境中使用的专门用于管理进入 Kubernetes 集群的外部访问流量。它基于 Nginx利用其作为反向代理和负载均衡器的能力但专门配置和优化以适应 Kubernetes 的架构。Ingress Controller 的主要任务是根据预先定义的规则通过 Kubernetes Ingress 资源设置将外部请求路由到集群内的特定服务。前提Ingress-Nginx 版本 1.10.0应用服务已经接入 Opentelemetry 采集链路数据K8s 集群版本1. 部署示例服务这里我们会部署一个 spring boot 的服务A 服务会调用 B 服务。本示例中 java 版本是 17Maven 版本是 3.9.10。由于采集 Ingress-Nginx 的链路需要和后端链路打通所以在部署业务镜像的时候需要将 OTEL 探针一并打包到业务镜像。以下是在服务 Dockerfile 中将 Agent 打包到业务服务容器镜像的配置为服务提供采集链路数据的基础能力。FROM curlimages/curl:latest AS agent-download USER root RUN curl -Lo /opentelemetry-javaagent.jar \ https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar FROM openjdk:17-jdk-slim WORKDIR /app COPY --fromagent-download /opentelemetry-javaagent.jar /app/opentelemetry-javaagent.jar COPY target/serviceb-1.0-SNAPSHOT.jar /app/service-b.jar ENV OTEL_SERVICE_NAMEservice-b \ OTEL_EXPORTER_OTLP_ENDPOINThttp://datakit-endpoint:4317 \ OTEL_TRACES_SAMPLERparentbased_always_on \ OTEL_PROPAGATORStracecontext,baggage \ OTEL_METRICS_EXPORTERnone \ OTEL_LOGS_EXPORTERnone # 修改启动命令添加 Java Agent CMD [java, -javaagent:/app/opentelemetry-javaagent.jar, -jar, /app/service-b.jar]创建k8s-java-app.yaml部署服务apiVersion: apps/v1 kind: Deployment metadata: name: service-a spec: replicas: 1 selector: matchLabels: app: service-a template: metadata: labels: app: service-a spec: containers: - name: service-a image: your-repo/service-a:otel-1.0 ports: - containerPort: 9090 env: - name: HOST_IP valueFrom: fieldRef: fieldPath: status.hostIP - name: SPRING_MAIN_ALLOW_CIRCULAR_REFERENCES value: true - name: OTEL_SERVICE_NAME value: service-a - name: OTEL_EXPORTER value: otlp - name: OTEL_EXPORTER_OTLP_PROTOCOL value: grpc - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://$(HOST_IP):4317 - name: OTEL_PROPAGATORS value: tracecontext,baggage apiVersion: v1 kind: Service metadata: name: service-a spec: ports: - port: 9090 targetPort: 9090 selector: app: service-a apiVersion: apps/v1 kind: Deployment metadata: name: service-b spec: replicas: 1 selector: matchLabels: app: service-b template: metadata: labels: app: service-b spec: containers: - name: service-b image: your-repo/service-b:otel-1.0 ports: - containerPort: 8090 env: - name: HOST_IP valueFrom: fieldRef: fieldPath: status.hostIP - name: OTEL_SERVICE_NAME value: service-b - name: OTEL_EXPORTER value: otlp - name: OTEL_EXPORTER_OTLP_PROTOCOL value: grpc - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://$(HOST_IP):4317 - name: OTEL_PROPAGATORS value: tracecontext,baggage apiVersion: v1 kind: Service metadata: name: service-b spec: ports: - port: 8090 targetPort: 8090 selector: app: service-b2. 安装 Ingress Nginx创建一个ingress-nginx.yaml文件apiVersion: v1 kind: Namespace metadata: name: ingress-nginx --- apiVersion: v1 kind: ServiceAccount metadata: name: ingress-nginx namespace: ingress-nginx --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ingress-nginx rules: - apiGroups: - resources: - configmaps - endpoints - nodes - pods - secrets - services verbs: - list - watch - get - apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - list - watch - apiGroups: - coordination.k8s.io resources: - leases verbs: - get - watch - list - create - update - apiGroups: - networking.k8s.io resources: - ingresses - ingressclasses verbs: - get - list - watch - apiGroups: - networking.k8s.io resources: - ingresses/status verbs: - update - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update - apiGroups: - resources: - events verbs: - create - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginx subjects: - kind: ServiceAccount name: ingress-nginx namespace: ingress-nginx --- apiVersion: apps/v1 kind: Deployment metadata: name: ingress-nginx-controller namespace: ingress-nginx spec: replicas: 1 selector: matchLabels: app: ingress-nginx template: metadata: labels: app: ingress-nginx spec: hostNetwork: true serviceAccountName: ingress-nginx containers: - name: controller image: k8s.gcr.io/ingress-nginx/controller:v1.10.0 args: - /nginx-ingress-controller - --publish-service$(POD_NAMESPACE)/ingress-nginx-controller - --election-idingress-controller-leader - --controller-classk8s.io/ingress-nginx - --ingress-classnginx - --configmapingress-nginx/ingress-nginx-controller env: - name: HOST_IP valueFrom: fieldRef: fieldPath: status.hostIP - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://$(HOST_IP):4317 - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace ports: - name: http containerPort: 80 - name: https containerPort: 443 --- apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx spec: type: NodePort ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 selector: app: ingress-nginx --- apiVersion: v1 kind: ConfigMap metadata: name: ingress-nginx-controller namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx data: enable-opentelemetry: true otel-sampler: AlwaysOn opentelemetry-operation-name: HTTP $request_method $service_name $uri $opentelemetry_trace_id opentelemetry-trust-incoming-span: true # Defaults # otel-service-name: nginx # otel-sampler-ratio: 0.01应用该配置kubectl apply -f ingress-nginx.yaml3. 采集 Ingress-nginx 链路配置3.1 DataKit 开启 OTEL 采集器datakit.yaml中采用 CM 挂载方式开启集群的 OTEL 采集器。在 volumeMounts 添加- mountPath: /usr/local/datakit/conf.d/opentelemetry/opentelemetry.conf name: datakit-conf subPath: opentelemetry.conf在 CM 处添加采集器opentelemetry.conf: |- [[inputs.opentelemetry]] [inputs.opentelemetry.http] enable true http_status_ok 200 trace_api /otel/v1/traces [inputs.opentelemetry.grpc] trace_enable true metric_enable true addr 0.0.0.0:4317重启 DataKitkubectl apply -f datakit.yaml3.2 OTEL Agent 采集链路数据在服务 Dockerfile 中将 Agent 打包到业务服务容器镜像为服务提供采集链路数据的基础能力。FROM curlimages/curl:latest AS agent-download USER root RUN curl -Lo /opentelemetry-javaagent.jar \ https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar FROM openjdk:17-jdk-slim WORKDIR /app COPY --fromagent-download /opentelemetry-javaagent.jar /app/opentelemetry-javaagent.jar COPY target/serviceb-1.0-SNAPSHOT.jar /app/service-b.jar ENV OTEL_SERVICE_NAMEservice-b \ OTEL_EXPORTER_OTLP_ENDPOINThttp://datakit-endpoint:4317 \ OTEL_TRACES_SAMPLERparentbased_always_on \ OTEL_PROPAGATORStracecontext,baggage \ OTEL_METRICS_EXPORTERnone \ OTEL_LOGS_EXPORTERnone # 修改启动命令添加 Java Agent CMD [java, -javaagent:/app/opentelemetry-javaagent.jar, -jar, /app/service-b.jar]在服务部署的 yaml 中配置环境变量。- name: OTEL_EXPORTER value: otlp - name: OTEL_EXPORTER_OTLP_PROTOCOL value: grpc - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://$(HOST_IP):4317 - name: OTEL_PROPAGATORS value: tracecontext,baggage3.3 编辑 ingress-controller CM 资源如果 ingress-controller 服务有 configmap 则在 CM 中增加如下四行enable-opentelemetry: true otel-sampler: AlwaysOn opentelemetry-operation-name: HTTP $request_method $service_name $uri $opentelemetry_trace_id opentelemetry-trust-incoming-span: trueApply 相应的 ingress 的 yaml并重启 ingress-controller。3.4 增加 ingress-controller 环境变量在部署 ingress-controller 配置文件 ingress-nginx.yaml 的 deployment 部分中添加 OTEL 配置位置在 spec.template.spec.containers.env 下注意端口开启。- name: OTEL_EXPORTER value: otlp - name: OTEL_EXPORTER_OTLP_PROTOCOL value: grpc - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://$(HOST_IP):4317 - name: OTEL_SERVICE_NAME value: nginx - name: OTEL_TRACES_SAMPLER value: always_on - name: OTEL_PROPAGATORS value: tracecontext,baggage重新 apply ingress-nginx.yaml重启 ingress-controller 容器。观测云再次访问 ingress 域名制造数据。到观测云控制台「应用性能监测」可以看到 Ingress-Nginx 链路数据正常上报。

相关新闻

风机润滑数据采集物联网解决方案

风机润滑数据采集物联网解决方案

《新一代煤电升级专项行动实施方案(2025—2027 年)》落地,智能运维已成为煤电转型升级的核心方向,要求强化关键设备运行安全监测与风险预警防控能力。因此,如何通过智能化技术破解润滑系统运维痛点,实现从 …

2026/7/6 2:34:01 阅读更多 →
人工智能之数字生命-本能动作体系规范(任务/方法/本能方法函数)

人工智能之数字生命-本能动作体系规范(任务/方法/本能方法函数)

本能动作体系规范(任务/方法/本能方法函数) 本文是“本能动作体系”的工程规范,用于避免循环依赖、避免各模块 I/O 不一致、避免外设控制权冲突,并支撑: Step1~Step4 四步本能方法函数(确保/解析绑定/执行/输出) 任务→方法→本能方法函数的分层 外设(真实世界)与自我…

2026/7/3 7:51:03 阅读更多 →
模块化与组件化:90%的前端开发者都没搞懂的本质区别

模块化与组件化:90%的前端开发者都没搞懂的本质区别

一位刚入职不久的网友留言问我:“我们一直在说模块化开发、组件化设计,这两个概念到底有什么区别?我感觉它们不就是把代码拆分开来吗?” 今天,我想从自己的角度,聊聊我对这两个概念的深度理解。 什么是模块…

2026/7/4 20:18:48 阅读更多 →

最新新闻

多人格的记忆,有共用有不共用

多人格的记忆,有共用有不共用

最近听到一个多人格案例,引起我的兴趣。大意是某人考试时切换到考试人格,考完再切换回来。我的兴趣在哪里?在于记忆。主人格切换到后台(暂停),相当于睡了一觉。所以主人格对于副人格的做事经历,…

2026/7/6 2:33:52 阅读更多 →
【嵌入式C语言】07.二级指针+函数

【嵌入式C语言】07.二级指针+函数

一、二级指针1.概念概念:二级指针也是个指针,该指针用来存放另外一个一级指针在内存中的地址(指向指针的指针)二级指针解引用一次,变成一级指针2.定义二级指针int a88;int *p&a;int **q&p;3.使用二级指针*q --》二级指针解引用一次&a…

2026/7/6 2:31:52 阅读更多 →
Unity AssetBundle 加密方案对比:3种主流方法性能开销与安全性实测

Unity AssetBundle 加密方案对比:3种主流方法性能开销与安全性实测

Unity AssetBundle加密方案深度评测:异或、AES与文件头偏移的实战对比 在游戏开发领域,AssetBundle作为资源打包和动态加载的核心技术,其安全性问题一直备受关注。未经加密的AssetBundle可以被AssetStudio等工具轻易解析,导致游戏…

2026/7/6 2:31:52 阅读更多 →
基于AI Agent框架与DeepSeek构建智能副业顾问:从原理到实践

基于AI Agent框架与DeepSeek构建智能副业顾问:从原理到实践

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个很有意思的项目:如何用 AI Agent 框架,结合 DeepSeek 等大模型,打造一个能帮你分…

2026/7/6 2:29:51 阅读更多 →
3 种景观格局指数计算工具对比:ArcGIS、Fragstats 与 Python 脚本效率实测

3 种景观格局指数计算工具对比:ArcGIS、Fragstats 与 Python 脚本效率实测

3 种景观格局指数计算工具对比:ArcGIS、Fragstats 与 Python 脚本效率实测景观格局分析是生态学研究中的重要工具,尤其在土地利用规划、生物多样性保护和生态系统服务评估中扮演关键角色。面对海量空间数据,如何高效准确地计算各类景观指数&a…

2026/7/6 2:29:51 阅读更多 →
OTB-2015 与 VOT2023 数据集对比:从 100 个序列到 60 个挑战的 10 年演进分析

OTB-2015 与 VOT2023 数据集对比:从 100 个序列到 60 个挑战的 10 年演进分析

OTB-2015与VOT2023数据集对比:十年演进的技术启示录当计算机视觉研究者第一次在OTB-2015数据集上测试跟踪算法时,可能不会想到这个包含100个视频序列的基准会成为行业里程碑。十年后,VOT2023以60个精心设计的挑战场景重新定义了评估标准。这场…

2026/7/6 2:29:51 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻