k8s集成skywalking

news2025/1/15 9:33:47

如果能科学上网的话,安装应该不难,如果有问题可以给我留言

本篇文章我将给大家介绍“分布式链路追踪”的内容,对于目前大部分采用微服务架构的公司来说,分布式链路追踪都是必备的,无论它是传统微服务体系亦或是新一代Service Mesh的微服务架构!而具体介绍的内容,本文不是完全讲理论,而是希望从理论到实践,引导大家去操作,因为只有这样才能真正从技术层面有深刻的认识和了解!

分布式链路追踪概述

在具体介绍分布式链路追踪系统之前,我们首先需要理解下什么是链路追踪?在本专栏前面关于监控系统的介绍中可以知道,监控系统的观测数据主要来源于统计指标、日志以及链路追踪这三个方面。而这些数据从类型上又可以划分为两种:请求级别、聚合级别。

请求级别的数据主要来源于真实的请求,例如一次HTTP调用、RPC调用等,本文要介绍的链路追踪就是这种类型。而聚合级别则是接口请求的度量指标或者一些参数数据的聚合,如QPS、CPU使用率等数值。日志和统计指标数据既可以是请求级别,也可以是聚合级别,因为它们可能来自源于真实的请求,也可能是系统自身诊断时记录下来的信息。

而对于链路追踪来说,它主要的逻辑就是将请求链路的完整行为记录下来,以便可以通过可视化的形式实现链路查询、性能分析、依赖关系、拓扑图等分布式链路追踪相关的功能。如下图所示:

在上图中假设微服务系统中的一次接口调用总共有两个微服务参与,其调用关系分别是A->B->C,其中B服务还与Redis这样的第三方服务产生了调用关系、C服务则还需要调用MySQL数据库服务。所以实际上链路追踪所做的事情就是详细记录A->B(B->Redis)->C(C->MySQL)这条完整链路上的详细调用信息,例如接口响应结果、耗时等。

那么这条调用链路上的数据到底是怎样被记录的呢?接下来我们继续以上面的调用链为例分析下链路追踪信息的具体组成和传递形式,以便进一步理解分布式链路追踪系统的原理和概念。具体逻辑示意图如下:

如上图所示,分布式链路追踪所监控的对象就是一次次调用所产生的链路,图中1-8所示的就是一条完整的链路(Trace),系统会通过唯一的标识(TraceId)对此进行记录。而链路中的每一个依赖调用都会生成一个调用踪迹信息(Span),最开始生成的Span叫做根Span(Root Span),后续生成的Span都会将前一个Span 的标示(Sid)作为本Span信息的父ID(Pid)。

这样以此类推,Span信息就会随着链路的执行被进程内或跨进程进行上下文传递,通过Span数据链就能将一次次链路调用所产生的踪迹信息串联起来,而每一个Span之上附着的日志信息(Annotation)就是我们进行调用链监控分析的数据来源。这就是分布式链路追踪的基本原理。

而说到这里,你可能会有疑问:监控这么大的数据量,是不是会很消耗系统资源?的确如此,所以大部分链路追踪系统,都会存在一个叫做采样率(Sampling)的设定,用来控制系统采集链路信息的比例,从而提升系统性能。因为很多时候,大量的链路信息都是相同的,我们需要关注的可能也只是相对耗时较高、出错次数较多的链路,而并没有必要100%的进行采集。

SkyWalking简介

前面我们从基本原理的角度说明了链路追踪是什么,那么接下来我们将介绍下目前最流行的分布式链路追踪系统——SkyWalking。

SkyWalking是一款优秀的开源APM(Application Performance Management)系统,它不仅提供了链路追踪,链路分析等分布式追踪功能,还支持性能指标分析、应用和服务依赖性分析、服务拓扑图分析、报警等一系列应用性能监控相关的功能,可以帮助我们有效地定位问题。

而从数据收集上看,SkyWalking支持多种不同的数据来源及格式,包括支持Java、.NET Core、NodeJS、PHP和Python等不同语言的无侵入式Agent探针,以及对Service Mesh(服务网格)架构的支持等。其具体结构如下图所示:

如上图所示,SkyWalking的核心由链路收集服务器(Receiver Cluster)、聚合服务器(AggregatorCluster)组成。其中Receiver Cluster是整个后端服务接入的入口,专门用于收集服务的各种指标及链路信息。

而AggregatorCluster则用于汇总、聚合收集器收集到的数据,并最终将聚合数据存储到数据库中,而具体存储方式可以有多种,例如常见的ElasticSearch、MySQL、TIDB等,我们可以根据实际需要进行选择。这些聚合数据后面可以用于告警设置,也可以被GUI/CLI等可视化系统以HTTP的形式访问后进行可视化展示。

此外,从数据采集逻辑上看,SkyWalking支持多种语言探针及项目协议,能够覆盖目前大部分主流的分布式技术栈,具体来说主要有以下3种:

  • Metrics System:统计系统。支持直接从Prometheus中拉取度量指标数据到SkyWalking,也支持程序自身通过micrometer推送数据;

  • Agents:业务探针。指在各个业务系统中集成探针服务来进行链路追踪,即链路数据采集。SkyWalking支持Java、Go、.NET、PHP、NodeJS、Python、Nginx LUA等多种语言的探针。此外,它还支持通过gRPC或者HTTP的方式来传递数据;

  • Service Mesh:SkyWalking还支持对新一代微服务架构Service Mesh的监控,可以通过特定的Service Mesh协议采集数据面、控制面的数据,实现对服务网格链路数据的观测;

上面的内容简单介绍了SkyWalking的基本情况,并就其系统架构进行了简单分析。实际上SkyWalking最近两年发展得非常快,社区也非常活跃,在微服务链路追踪、应用性能监控领域被使用得也越来越广泛,由于篇幅原因,这里无法进行更深入的分享,感兴趣的读者可以通过官方文档或社区进行深入了解!

SkyWalking安装部署

前面的内容分别介绍了分布式链路追踪的基本原理,并着重介绍了SkyWalking!很显然,写到这里就结束的话,本文就没有啥价值了,因为只是说了一堆正确的废话,看了也就忘了!这显然也不符合我分享的风格,接下来我们就从实验的角度来玩一下SkyWalking。

以下内容需要进行实际实验操作,如果在地铁上不方便可以先收藏,有时间再具体实验玩下!

对于SkyWalking的部署主要涉及到后端OAP Server和前端UI,根据实际需要可以将它们部署在物理机、虚拟机或者Kubernetes集群之中。这里为了演示环境的一致性,我们选择将SkyWalking的后端服务及UI分别部署到Kubernetes集群中。

而具体安装SkyWalking的方式可以通过官方提供的Kubernetes部署文件采用Helm方式安装,也可以手动编写Kubernetes部署文件,这里为了便于学习,我们采用后一种方式。具体步骤如下:

1)、在Kubernetes集群中创建一个单独运行SkyWalking容器的Namespace。命令如下:

#通过kubectl连接Kubernetes集群后执行,创建namespace命令$ kubectl create ns skywalking

2)、编写SkyWalking-UI及OAP Server服务Kubernetes部署文件

在编写具体的Kubernetes部署文件的过程中需要指定SkyWalking-UI及OAP Server的容器镜像,一般来说可以通过源码手动打包也可以直接使用官方已经打包好的镜像。这里为了方便演示,采用Docker官方镜像仓库中已经打包好的镜像。具体如图所示:

如果上面两张图所示,我们分别在Docker Hub官方镜像仓库中找到了SkyWalking-UI及OAP Server的官方发布的容器镜像版本,接下来编写具体的部署文件。

编写SkyWalking服务端Kubernetes部署文件(skywalking-aop.yml),具体内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: oap
  namespace: sanyi-erp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: oap
      release: skywalking
  template:
    metadata:
      labels:
        app: oap
        release: skywalking
    spec:
      containers:
        - name: oap
          image: apache/skywalking-oap-server:8.3.0-es7
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 11800
              name: grpc
            - containerPort: 12800
              name: rest

---
apiVersion: v1
kind: Service
metadata:
  name: oap
  namespace: sanyi-erp
  labels:
    service: oap
spec:
  ports:
    - port: 12800
      name: rest
    - port: 11800
      name: grpc
    - port: 1234
      name: page
  selector:
    app: oap

以上是一个标准的Kubernetes部署文件,关于文件中相关指令的具体含义可查阅Kubernetes相关的资料。

这里部署之后,端口查询可以使用kebectl get svc -n skywalking 查看,我使用的是腾讯云,部署之后,我手动的将svc服务的类型变成了nodePort

编写SkyWalking-UI部署文件(skywalking-ui.yml),具体内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ui-deployment
  namespace: sanyi-erp
  labels:
    app: ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ui
  template:
    metadata:
      labels:
        app: ui
    spec:
      containers:
        - name: ui
          image: apache/skywalking-ui:8.3.0
          ports:
            - containerPort: 8080
              name: page
          env:
            - name: SW_OAP_ADDRESS
              value: oap:12800
---
apiVersion: v1
kind: Service
metadata:
  name: ui
  namespace: sanyi-erp
  labels:
    service: ui
spec:
  ports:
    - port: 8080
      name: page
      nodePort: 31235
  type: NodePort
  selector:
    app: ui

3)、根据编写的部署文件,执行Kubernetes部署命令

根据前面步骤中编写的Kubernetes发布文件,这里我们根据编写的发布文件直接执行部署命令,具体如下:

 kubectl apply -f .

可以看到部署的SkyWalking服务都已经正常运行!如果是第一次部署,拉取镜像的过程可能会比较慢一点。

4)、查看SkyWalking-UI的Web访问地址

经过上述步骤,我们已经成功将SkyWalking-UI、OAP Server两个服务运行在Kubernetes集群之中。接下来通过SkyWalking-UI服务的映射端口(k8s部署文件中定义是31234端口)访问Web UI,具体可通过http://NodeIP:31234进行访问,例如:

查询SkyWalking-UI所部署的Kubernetes集群Node节点的IP地址$ kubectl describe node kubernetesName:   

如上图所示,此时可以看到SkyWalking已成功运行,由于尚无服务接入所以暂时还看不到有任何监控数据!

后记

如前面所述内容我们已经在Kubernetes环境中将分布式链路追踪系统部署成功了,另外由于还没有服务接入所以暂时还看不到任何链路追踪数据,但是由于篇幅的原因这里就不继续介绍如何将Java微服务接入SkyWalking了,但是这个这个接入过程却是非常有意思的,因为它是我们作为研发人员,进一步理解微服务程序与分布式链路追踪系统集成、交互的关键!这部分我将作为续集在下一篇文章中给大家分享,时间不会太久,期待大家保持关注!

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

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

相关文章

微信小程序构建npm失败,没有找到可以构建的npm包

方法:打开终端输入 npm init -y npm install 或 yarn install我用 npm install 下载后并没有出现node_modules, 又用 yarn install 下载,成功了 下载好后,在project.config.json文件添加 "showShadowRootInWxmlPanel": true, …

Vue.js中的交互式样式:鼠标悬停与点击选中响应

在现代Web开发中,用户体验是至关重要的。Vue.js作为一个渐进式JavaScript框架,它提供了一种简洁而高效的方式来构建用户界面。本文将介绍如何在Vue.js中实现两种常见的交互效果:鼠标悬停响应和点击选中响应。 一、鼠标悬停响应右边显示 在V…

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容,与 cat 命令的输出顺序相反。非常有趣,好记。也就是说,当我们使用tac命令查看文件内…

Zero to JupyterHub with Kubernetes上篇 - Kubernetes 离线二进制部署

前言: 纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 k8s二进…

《Vue零基础入门教程》第十四课:列表渲染

往期内容 《Vue零基础入门教程》第六课:基本选项 《Vue零基础入门教程》第八课:模板语法 《Vue零基础入门教程》第九课:插值语法细节 《Vue零基础入门教程》第十课:属性绑定指令 《Vue零基础入门教程》第十一课:事…

1.1 数据结构的基本概念

1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象:是具有相同性质的数据元素的集合&…

mmsegmentation自己的数据集

我最大的问题就是没安装官方给定的mask转换格式来转换 这种带白色的不行哦! 黑色的可以,其实mask*50就可以看清楚标记的轮廓之类的。 数据集格式转换按照A,B,C代码直接转换:https://github.com/TommyZihao/Label2Everything/tree/main/lab…

分治算法中的主定理及其应用

引言 学习递归算法的时候,找到了用来计算算法复杂度的主定理。问大语言模型,发现回答的主定理描述有所不同。本文比较了两个不同版本中表述的差异。并给出一些例子用来计算分治递归类算法的复杂度。 主定理的不同版本 版本1 在《算法导论》第三版第四…

【kafka03】消息队列与微服务之Kafka 读写数据

Kafka 读写数据 参考文档 Apache Kafka 常见命令 kafka-topics.sh #消息的管理命令 kafka-console-producer.sh #生产者的模拟命令 kafka-console-consumer.sh #消费者的模拟命令 创建 Topic 创建topic名为 chen,partitions(分区)为3&#xff0…

LuaForWindows_v5.1.5-52.exe

Releases rjpcomputing/luaforwindows GitHub #lua C:\Users\Administrator\Desktop\test.lua print("Hello lua!") print("ZengWenFeng 13805029595")

软件无线电(SDR)的架构及相关术语

今天简要介绍实现无线电系统调制和解调的主要方法,这在软件定义无线电(SDR)的背景下很重要。 外差和超外差 无线电发射机有两种主要架构——一种是从基带频率直接调制到射频频率(称为外差),而第二种超外差是通过两个调制阶段来实…

【Electron学习笔记(四)】进程通信(IPC)

进程通信(IPC) 进程通信(IPC)前言正文1、渲染进程→主进程(单向)2、渲染进程⇌主进程(双向)3、主进程→渲染进程 进程通信(IPC) 前言 在Electron框架中&…

Power BI - Connect to SharePoint online list with Image column

1.简单介绍 当前SharePoint online list有modern和classic两种模式,现在使用modern模式的比较多。list中有Image类型的列,Power BI如何连接到SharePoint list并显示image呢 note, SharePoint list中的Image列,Lookup列,People列…

电机控制理论基础及其应用

电机控制理论是电气工程和自动化领域中的一个重要分支,它主要研究如何有效地控制电机的运行状态,包括速度、位置、扭矩等,以满足各种应用需求。电机控制理论的基础知识涵盖了电机的工作原理、数学模型、控制策略以及实现技术等方面。下面是一…

二十一、QT C++

1.1QT介绍 1.1.1 QT简介 Qt 是一个跨平台的应用程序和用户界面框架,用于开发图形用户界面(GUI)应用程序以及命令行工具。它最初由挪威的 Trolltech (奇趣科技)公司开发,现在由 Qt Company 维护&#xff…

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…

Kubernetes 01

MESOS:APACHE 分布式资源管理框架 2019-5 Twitter退出,转向使用Kubernetes Docker Swarm 与Docker绑定,只对Docker的资源管理框架,阿里云默认Kubernetes Kubernetes:Google 10年的容器化基础框架,borg…

7. 现代卷积神经网络

文章目录 7.1. 深度卷积神经网络(AlexNet)7.2. 使用块的网络(VGG)7.3. 网络中的网络(NiN)7.4. 含并行连结的网络(GoogLeNet)7.5. 批量规范化7.5.1. 训练深层网络7.5.2. 批量规范化层…

芯片测试-射频中的单位

射频中的单位 💢dB,dBc💢💢dB💢💢dBc💢💢3dB和0dB💢 💢dBm和dBw💢💢dBuV,dBmV和dBV💢💢dBuV&#…

【C++】数字位数提取:从个位到十位的深入分析与理论拓展

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯第一题:提取个位数解法代码解法分析代码优化拓展思考:取模运算的普适性 💯第二题:提取十位数题目解读与思路分析方法一&…