k8s学习(三十八) 使用OpenTelemetry+jaeger实现链路追踪

news2024/11/18 9:32:58

文章目录

  • 前言
  • 一、安装jaeger
  • 二、安装cert-manager
  • 三、安装OpenTelemetry Operator
  • 四、配置 OpenTelemetry Collector
  • 五、配置 Instrumentation
  • 六、编写java示例程序并测试调用链跟踪


前言

OpenTelemetry 可以用于从应用程序收集数据。它是一组工具、API 和 SDK 集合,我们可以使用它们来检测、生成、收集和导出遥测数据(指标、日志和追踪),以帮助分析应用的性能和行为。
这里基于K8S 1.20.2部署,其他版本可现在对应的operator和镜像即可。


提示:以下是本篇文章正文内容,下面案例可供参考

一、安装jaeger

下载镜像,并推送至私服

docker pull  docker.m.daocloud.io/jaegertracing/all-in-one:1.60.0
docker tag docker.m.daocloud.io/jaegertracing/all-in-one:1.60.0  172.16.10.160:88/library/jaegertracing/all-in-one:1.60.0
docker push 172.16.10.160:88/library/jaegertracing/all-in-one:1.60.0

修改jaeger.yaml,修改其中的镜像为172.16.10.160:88私服中的地址
jaeger.yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jaeger
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jaeger
  template:
    metadata:
      labels:
        app: jaeger
    spec:
      containers:
      - name: jaeger
        image: 172.16.10.160:88/library/jaegertracing/all-in-one:1.60.0
        env:
        - name: COLLECTOR_OTLP_ENABLED
          value: "true"
        ports:
        - containerPort: 16686
        - containerPort: 14268

---
apiVersion: v1
kind: Service
metadata:
  name: jaeger
spec:
  selector:
    app: jaeger
  type: ClusterIP
  ports:
    - name: ui
      port: 16686
      targetPort: 16686
      nodePort: 32186
    - name: collector
      port: 14268
      targetPort: 14268
    - name: http
      protocol: TCP
      port: 4318
      targetPort: 4318
    - name: grpc
      protocol: TCP
      port: 4317
      targetPort: 4317
  type: NodePort

执行:

apply -f jaeger.yaml

二、安装cert-manager

下载镜像并推送至私服

docker pull m.daocloud.io/quay.io/jetstack/cert-manager-cainjector:v1.15.2
docker tag m.daocloud.io/quay.io/jetstack/cert-manager-cainjector:v1.15.2 172.16.10.160:88/library/jetstack/cert-manager-cainjector:v1.15.2
docker push 172.16.10.160:88/library/jetstack/cert-manager-cainjector:v1.15.2

docker pull m.daocloud.io/quay.io/jetstack/cert-manager-controller:v1.15.2
docker tag m.daocloud.io/quay.io/jetstack/cert-manager-controller:v1.15.2 172.16.10.160:88/library/jetstack/cert-manager-controller:v1.15.2
docker push 172.16.10.160:88/library/jetstack/cert-manager-controller:v1.15.2

docker pull m.daocloud.io/quay.io/jetstack/cert-manager-acmesolver:v1.15.2
docker tag m.daocloud.io/quay.io/jetstack/cert-manager-acmesolver:v1.15.2 172.16.10.160:88/library/jetstack/cert-manager-acmesolver:v1.15.2
docker push 172.16.10.160:88/library/jetstack/cert-manager-acmesolver:v1.15.2

docker pull m.daocloud.io/quay.io/jetstack/cert-manager-webhook:v1.15.2
docker tag m.daocloud.io/quay.io/jetstack/cert-manager-webhook:v1.15.2 172.16.10.160:88/library/jetstack/cert-manager-webhook:v1.15.2
docker push 172.16.10.160:88/library/jetstack/cert-manager-webhook:v1.15.2
修改cert-manager中的镜像地址为172.16.10.160:88私服中对应的镜像地址(cert-manager下载地址:https://github.com/cert-manager/cert-manager/releases/download/v1.15.2/cert-manager.yaml)

cert-manager.yaml内容略,可直接从上面地址下载。
执行:

kubectl apply -f cert-manager.yaml

三、安装OpenTelemetry Operator

下载镜像并推送至私服

docker pull m.daocloud.io/ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator:0.85.0
docker tag m.daocloud.io/ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator:0.85.0 172.16.10.160:88/library/open-telemetry/opentelemetry-operator/opentelemetry-operator:0.85.0
docker push 172.16.10.160:88/library/open-telemetry/opentelemetry-operator/opentelemetry-operator:0.85.0

docker pull m.daocloud.io/gcr.io/kubebuilder/kube-rbac-proxy:v0.13.1
docker tag m.daocloud.io/gcr.io/kubebuilder/kube-rbac-proxy:v0.13.1 172.16.10.160:88/library/kubebuilder/kube-rbac-proxy:v0.13.1
docker push 172.16.10.160:88/library/kubebuilder/kube-rbac-proxy:v0.13.1

修改opentelemetry-operator.yaml中的镜像地址为172.16.10.160:88私服中对应的镜像地址(cert-manager下载地址:https://github.com/open-telemetry/opentelemetry-operator/releases/download/v0.85.0/opentelemetry-operator.yaml)

opentelemetry-operator.yaml的内容略

执行:

kubectl apply -f opentelemetry-operator.yaml

四、配置 OpenTelemetry Collector

通过创建 CR OpenTelemetryCollector 来配置 Otel 的采集器
open-telemetry-collector.yaml:

apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
spec:
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:
      memory_limiter:
        check_interval: 1s
        limit_percentage: 75
        spike_limit_percentage: 15
      batch:
        send_batch_size: 10000
        timeout: 10s

    exporters:
      otlp/jaeger:
        endpoint: "jaeger.default:4317"
        tls:
          insecure: true

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: []
          exporters: [otlp/jaeger]

执行:

kubectl apply -f open-telemetry-collector.yaml

查看自定义的OpenTelemetryCollector
在这里插入图片描述

查看otel的pod
在这里插入图片描述

查看otel的service

在这里插入图片描述

五、配置 Instrumentation

下载java的对应镜像,(其他语言的也可以下载的对应的镜像例如nodejs、python等)

docker pull m.daocloud.io/ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.30.0
docker tag m.daocloud.io/ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.30.0 172.16.10.160:88/library/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.30.0
docker push 172.16.10.160:88/library/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.30.0

Instrumentation 是 Otel Operator 的另一个 CRD,用于自动安装 Otel 探针和配置

open-telemetry-instrumentation.yaml:

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: instrumentation-sample
spec:
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_traceidratio
    argument: "1"
  env:
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: otel-collector.default:4318
  java:    
    image: 172.16.10.160:88/library/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.30.0
    env:
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: http://otel-collector.default:4317

执行:

kubectl apply -f open-telemetry-instrumentation.yaml

在这里插入图片描述

六、编写java示例程序并测试调用链跟踪

为 Pod 添加注解 instrumentation.opentelemetry.io/inject-java: "true" 通知 Otel Operator 该应用的类型以便注入正确的探针。
简单的示例为servicea -> serviceb

servicea和serviceb就是两个普通的java程序,servicea通过K8S服务名调用serviceb,没有其他额外配置

servera调用

package cn.ac.iscas.servicea.controller;

import cn.ac.iscas.servicea.util.CustomHttpClient;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.UUID;

/**
 * @author zhuquanwen
 * @version 1.0
 * @date 2024/8/9 9:50
 */
@RestController
public class TestController {
    @Value("${serverb.endpoint}")
    private String servicebEndpoint;

    private CustomHttpClient httpClient;

    @PostConstruct
    public void init() {
        httpClient = new CustomHttpClient(new CustomHttpClient.HttpClientProps());
    }

    @GetMapping("t1")
    public String t1() throws IOException, InterruptedException {
        return httpClient.doGet("http://" + servicebEndpoint + "/t1");
    }
}

servicea配置:

spring.application.name=service-a
server.port=4001
serverb.endpoint=localhost:4002

serviceb逻辑:

package cn.ac.iscas.serviceb.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * @author zhuquanwen
 * @version 1.0
 * @date 2024/8/9 9:50
 */
@RestController
public class TestController {
    @GetMapping("t1")
    public String t1() {
        return "serverb-res-" + UUID.randomUUID();
    }
}

使用dockerfile将程序打包,并上传至私服

编写两个程序的k8s编排配置,并启动
deploy-servicea.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: servicea
spec:
  replicas: 1
  selector:
    matchLabels:
      app: servicea
  template:
    metadata:
      labels:
        app: servicea
      annotations:
        instrumentation.opentelemetry.io/inject-java: "true"
    spec:
      containers:
      - name: servicea
        image: 172.16.10.160:88/library/test-micro/servicea:0.0.1
        ports:
        - containerPort: 4001


---
apiVersion: v1
kind: Service
metadata:
  name: servicea
spec:
  selector:
    app: servicea
  ports:
  - name: my-port
    protocol: TCP
    port: 4001
    targetPort: 4001
    nodePort: 32401
  type: NodePort

deploy-serviceb.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: serviceb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: serviceb
  template:
    metadata:
      labels:
        app: serviceb
      annotations:
        instrumentation.opentelemetry.io/inject-java: "true"
    spec:
      containers:
      - name: serviceb
        image: 172.16.10.160:88/library/test-micro/serviceb:0.0.1
        ports:
        - containerPort: 4002


---
apiVersion: v1
kind: Service
metadata:
  name: serviceb
spec:
  selector:
    app: serviceb
  ports:
  - name: my-port
    protocol: TCP
    port: 4002
    targetPort: 4002
    nodePort: 32402
  type: NodePort

部署:

kubectl apply -f deploy-servicea.yaml
kubectl apply -f deploy-serviceb.yaml

通过describe pod 可以看到注入了一个initContainer和一些环境变量
在这里插入图片描述

通过浏览器访问servicea

在这里插入图片描述

访问jaeger,查看调用链
在这里插入图片描述

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

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

相关文章

《黑神话:悟空》Steam全球评价出炉:18个语言区好评率超90%

《黑神话:悟空》Steam在线人数已经不断打破纪录,连续三天刷榜,目前最高成绩超过241万。这个成绩也稳坐总榜第二,同时也是单机游戏的历史第一。 除了游玩人数之外,该作的评价口碑也非常出色,根据媒体汇总的数…

Flutter->`Flutter` 通过`ffi`调用`Rust`编译生成的产物.so文件(Android)和.a文件(iOS)接口方法

flutter_rust_ffi Flutter 通过ffi调用Rust编译生成的产物.so文件(Android)和.a文件(iOS)接口方法; 拾用本文您将获取以下技能: Rust编译.so文件的能力;Rust编译.a文件的能力;Flutter调用.so文件的能力;Flutter调用.a文件的能力; 附加Buff: Flutter环境安装指南;Rust环境安…

游戏行业如此竞争激烈,个人开发者是否仍存机会?

在当今这个数字化时代,游戏行业以其庞大的市场规模、高速的增长速度以及无限的创意空间,吸引了无数开发者投身其中。然而,随着技术的进步、资本的涌入以及大型游戏公司的强势扩张,游戏行业的竞争日益激烈,似乎形成了一…

选择合适系统

选择合适系统 原厂SDK系统 硬件兼容性 ⭐⭐⭐⭐⭐软件功能完善度 ⭐⭐⭐⭐⭐开发使用难度 ⭐⭐⭐⭐⭐烧写工具 全志自家烧录器。 TinaSDK-4.0 TF卡系统镜像 tina_v851se-tinyvision_uart0.img 默认TinaSDK编译出来 支持ADB 和默认SDK兼容性最好 tina-4.0_cameratest_ti…

使用知识图谱,大幅提升RAG准确性

大家好,图形检索—增强生成(GraphRAG)的发展势头日益强劲,已成为传统向量搜索检索方法的有力补充。这种方法利用图数据库的结构化特性,将数据组织为节点和关系,从而增强了检索信息的深度和上下文关联性。 知…

Stablediffusion有哪几种模型,小白入门必看!

前言 在Stable Diffusion中,模型有好几种,不同插件有不同的模型,分别作用于不同的功能。 今天卧龙君就带着大家一起来了解一下。 大模型:Stable Diffusion StableDiffusion大模型,可以理解为绘画风格集合&#xff…

16:【stm32】I2C的使用一:I2C片上外设的使用

I2C 1、片上外设1.1:寄存器与内部结构 2、通过I2C向外发送数据2.1:I2C的初始化2.1.1:初始化SCL和SDA2.1.2:使能时钟PCLK1(APB1)2.1.3:配置I2C1的参数 2.2:发送数据2.2.1:…

P2P 文件共享:现代网络中的高效文件传输

在互联网的世界中,不同应用程序的数据传输方法各异。P2P文件共享(Peer-to-Peer File Sharing) 作为一种高效的文件传输方式,使得用户可以在没有中央服务器的情况下直接进行文件交换。本文将详细介绍P2P文件共享的基本原理、优势及…

【通俗理解】CNN复杂度——卷积神经网络的计算成本解析

【通俗理解】CNN复杂度——卷积神经网络的计算成本解析 关键词提炼 #CNN复杂度 #卷积神经网络 #计算成本 #输入数据尺寸 #卷积核大小 #卷积核数量 #复杂度公式 第一节:CNN复杂度的类比与核心概念【尽可能通俗】 1.1 CNN复杂度的类比 CNN的复杂度就像是烹饪一道大…

引擎切换pdf识别简历分析

文章目录 1.EasyCode生成interview_history的crud1.在模板设置中手动指定逻辑删除的值2.生成代码,进行测试 2.PDF识别关键字1.引入依赖2.代码概览3.PDFUtil.java4.keyword1.EndType.java2.FlagIndex.java3.WordType.java4.KeyWordUtil.java 3.策略模式实现引擎切换&…

QT-window记事本

QT-window记事本 一、演示效果二、核心代码三、下载连接 一、演示效果 二、核心代码 #include <QMessageBox> #include <QFileDialog> #include <QDebug> #include <QProcess> #include <QDesktopServices> #include <QDateTime> #includ…

孙宇晨:区块链领域的坚韧领航者,以智慧铸就行业基石

​ 在区块链领域&#xff0c;孙宇晨以其卓越的智慧与不懈的韧性&#xff0c;成为行业内备受瞩目的领军人物。从创立波场 TRON 到引领去中心化的变革&#xff0c;孙宇晨始终以坚定的信念和独特的战略眼光推动着区块链技术的发展。 孙宇晨的成功不仅仅是因为他对技术的深入…

叉车驾驶员状态监控系统,司机身份安全识别,强化监管能力建设!

人脸识别技术作为人工智能领域的一个重要分支&#xff0c;已经广泛应用于安全识别、个人化推荐、社交网络等多个领域。其基于计算机视觉、图像处理、人脸检测、特征提取和人脸识别等先进技术&#xff0c;能够实现对人脸图像的精准分析和识别。在叉车驾驶场景中&#xff0c;AI人…

windows mfc webview2 接收html信息

webview2导入到mfc参考&#xff1a; windows vs2022 MFC使用webview2嵌入网页-CSDN博客 webview2与js交互参考&#xff1a;WebView2教程(基于C)【四】JS与C互访&#xff08;上&#xff09;_window.chrome.webview.postmessage-CSDN博客 一、JS端发送和接收 JS中&#xff0c;…

12代装win7影响性能吗?12代酷睿装win7关闭小核提高性能方法

12代酷睿装win7影响性能吗&#xff1f;12代酷睿装win7在性能上有点损耗&#xff0c;可以关闭小核提高性能。有些小朋友不知道怎么关闭上核来提高性能&#xff0c;下面电脑系统城小编就教大家12代酷睿装win7关闭核提高性能方法。 12代酷睿装win7说明&#xff1a;关闭小核解锁更多…

【分布式】分布式Session共享

这里通过SpringSession来实现Session的共享&#xff0c;Session数据存储在Redis中 SpringSession的操作指南&#xff1a; https://docs.spring.io/spring-session/docs/2.5.6/reference/html5/guides/boot-redis.html 导入相关的依赖 <dependency><groupId>org.s…

算法入门-递归3

第四部分&#xff1a;递归 143.重排链表&#xff08;中等&#xff09; 题目&#xff1a;给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → …

问题-小技巧-win11状态栏卡住

目前我只知道治标不治本的办法&#xff0c;打开任务管理器&#xff0c;找到Windows资源管理器右键重新启动&#xff0c;就可以解决这个问题。 这个问题我觉得是Win11自己的问题&#xff0c;等有新的发现&#xff0c;会进行补充。

使用Hutool工具类轻松生成验证码

效果图&#xff1a; 引入依赖&#xff1a; <!--hutool工具包--> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.15</version> </dependency>核心代码 import cn.hutool.…

使用docker-compose运行kafka及验证(无需zookpeer)

前言&#xff1a;要求安装docker-compose kafka镜像版本&#xff1a;apache/kafka:3.8.0 可能存在镜像拉不下来的情况&#xff1a; 1、vim /etc/docker/daemon.json {"data-root":"/data/docker","registry-mirrors": ["https://docker.m…