Kubernetes+SpirngCloud+SkyWalking实现链路追踪
版本
- k8s版本:1.24.4(k8s版本不重要,高于1.15就可以)
- SpringCloud版本:2021.0.3(如果网关使用SpringGateway的话会很重要)
- Skywalking版本:8.7.0(本文仅针对8.7.0版本,因为每一版本差异都比较大)
- ElasticSearch7
- Centos7
流程原理
Skywalking可以划分为三个大模块:
- SkyWalking Agent:作为运行时的代理端,可以实现无侵入式对调用链的数据进行采集。
- SkyWalking OAP:作为链路系统中心具备收集、传输等功能。
- SkyWalking UI:ui管理界面
- ElasticSearch:数据存储中心
SkyWalking服务搭建
新建文件夹
mkdir /opt/skywalking
mkdir /opt/skywalking/docker
mkdir /opt/skywalking/k8s
新建构造文件
创建skywalking-oap构造文件
vim /opt/skywalking/k8s/skywalking-oap.yml
skywalking-oap.yaml内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: oapnamespace: skywalking
spec:replicas: 1selector:matchLabels:app: oaprelease: skywalkingtemplate:metadata:labels:app: oaprelease: skywalkingspec:containers:- name: oapimage: apache/skywalking-oap-server:8.7.0-es7env:- name: TZvalue: Asia/Shanghai# 选择ES作为存储器- name: SW_STORAGEvalue: elasticsearch7# ES的服务节点- name: SW_STORAGE_ES_CLUSTER_NODESvalue: 127.0.0.1:9200 # ES的账号(如果ES布设账号密码,那么可以不填写)- name: SW_ES_USERvalue: my-elastic# ES的账号(如果ES布设账号密码,那么可以不填写)- name: SW_ES_PASSWORDvalue: 123456imagePullPolicy: IfNotPresentports:- containerPort: 11800name: grpc- containerPort: 12800name: rest
---
apiVersion: v1
kind: Service
metadata:name: oapnamespace: skywalkinglabels:service: oap
spec:ports:- port: 12800name: restnodePort: 31280- port: 11800name: grpcnodePort: 31180#type: ClusterIP# 为了测试方便这里暴露为主机端口,生产环境请使用ClustreIPtype: NodePortselector:app: oap
创建skywalking-ui构造文件
vim /opt/skywalking/k8s/skywalking-ui.yml
skywalking-ui.yml内容如下
apiVersion: apps/v1
kind: Deployment
metadata:name: ui-deploymentnamespace: skywalkinglabels:app: ui
spec:replicas: 1selector:matchLabels:app: uitemplate:metadata:labels:app: uispec:containers:- name: uiimage: apache/skywalking-ui:8.7.0ports:- containerPort: 8080name: pageenv:- name: TZvalue: Asia/Shanghai- name: SW_OAP_ADDRESSvalue: http://oap:12800
# volumeMounts:
# - mountPath: /etc/localtime
# name: volume-localtime
# volumes:
# - hostPath:
# path: /etc/localtime
# type: ''
# name: volume-localtime
---
apiVersion: v1
kind: Service
metadata:name: uinamespace: skywalkinglabels:service: ui
spec:ports:- port: 8080name: pagenodePort: 31234type: NodePortselector:app: ui
发布运行
cd /opt/skywalking/k8s
创建命名空间
kubectl create ns skywalking
发布oap、ui服务
kubectl apply -f .
等待服务创建起来后,执行以下命令进行检查
kubectl get all -n skywalking
构建Skywalking Sidecar镜像
cd /opt/skywalking/docker
wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-8.7.0.tar.gz
tar -zxvf apache-skywalking-apm-8.7.0.tar.gz
这个版本默认是不支持SpringGateway的,所以需要手动添加gateway的支持jar包,执行一下下命令(把解压出来的包的option-plugins的gateway移动到plugins下即可)。
mv apache-skywalking-apm-bin/agent/optional-plugins/apm-spring-cloud-gateway-3.x-plugin-8.7.0.jar apache-skywalking-apm-bin/agent/plugins/
构建agent的Docker镜像
vim /opt/skywalking/docker/Dockerfile
Dockerfile内容如下
FROM busybox:latest
ENV LANG=C.UTF-8
RUN set -eux && mkdir -p /usr/skywalking/agent/
ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/
WORKDIR /
构建docker镜像
cd /opt/skywalking/docker
这里使用Harbor作为镜像仓库地址(因为要挂载到每个不同的微服务上执行,微服务部署在多个不同的主机节点上,所以需要发布到镜像中心库,这里使用Harbor,省事的也可以使用阿里云的镜像仓库,仓库的搭建使用这里不进行说明。)
docker build . -t harbor的Ip:端口号/plugins/skywalking-agent-sidecar:8.7.0
推送镜像
docker push harbor的Ip:端口号/plugins/skywalking-agent-sidecar:8.7.0
SpringCloud微服务k8s部署集成skywalking
在需要集成的每个SrpingBoot的应用上引入maven依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-log4j-2.x</artifactId><version>8.7.0</version>
</dependency>
在应用的/resources目录下创建log4j2-spring.xml文件:
log4j2-spring.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。
-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30"><Properties><Property name="log.path">/usr/local/logs</Property><Property name="moduleName">my-application-name</Property><Property name="logging.swkj.pattern">[%date{yyyy-MM-dd HH:mm:ss.SSS}][${moduleName}][%level][%traceId][%thread][%C][%M][%line][%X{X-B3-TraceId} %X{X-B3-SpanId} %X{X-B3-ParentSpanId}]-%m%n</Property></Properties><Appenders><!-- 输出控制台日志的配置 --><Console name="Console" target="SYSTEM_OUT"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><!-- 输出日志的格式 --><PatternLayout pattern="${logging.swkj.pattern}"/></Console><RollingRandomAccessFile name="debugRollingFile" fileName="${log.path}/${moduleName}/${moduleName}.log"filePattern="${log.path}/${moduleName}/${moduleName}_%d{yyyy-MM-dd}_%i.log"><ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout charset="UTF-8" pattern="${logging.swkj.pattern}"/><Policies><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="30"/></RollingRandomAccessFile><RollingRandomAccessFile name="errorRollingFile" fileName="${log.path}/${moduleName}/${moduleName}.log"filePattern="${log.path}/${moduleName}/${moduleName}_%d{yyyy-MM-dd}_%i.log"><ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout charset="UTF-8" pattern="${logging.swkj.pattern}"/><Policies><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><DefaultRolloverStrategy max="30"/></RollingRandomAccessFile><GRPCLogClientAppender name="grpc-log"><PatternLayout pattern="${logging.swkj.pattern}"/></GRPCLogClientAppender></Appenders><Loggers><!-- ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<!-- <Logger name="com.swkj.sys" level="debug"/>-->
<!-- <Logger name="org.apache.kafka" level="warn"/>--><Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="debugRollingFile"/><AppenderRef ref="errorRollingFile"/><AppenderRef ref="grpc-log"/></Root></Loggers>
</configuration>
构建SpringBoot的deployment、service的yaml文件
mkdir /usr/project
cd /usr/project
kubectl create ns spring-app
vim my-boot-deploy.yml
my-boot-deploy.yml内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:name: my-gatewaynamespace: spring-applabels:name: my-gateway
spec:replicas: 1selector:matchLabels:name: my-gatewaytemplate:metadata:labels:name: my-gatewayspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: envoperator: Invalues:- devinitContainers:- image: 'harbor的Ip:端口号/plugins/skywalking-agent-sidecar:8.7.0'name: sw-agent-sidecarimagePullPolicy: IfNotPresentcommand:- shargs:- '-c'- >-mkdir -p /skywalking/agent && cp -r /usr/skywalking/agent/*/skywalking/agentvolumeMounts:- name: sw-agentmountPath: /skywalking/agentcontainers:- name: my-gatewayimage: harbor的Ip:端口号/project/my-gateway:latestvolumeMounts:- name: sw-agentmountPath: /usr/skywalking/agentcommand: ["sh","-c","java -javaagent:/usr/skywalking/agent/skywalking-agent.jar=agent.service_name=dev-gateway,collector.backend_service=oap.skywalking:11800,plugin.toolkit.log.grpc.reporter.server_host=oap.skywalking,plugin.toolkit.log.grpc.reporter.server_port=11800 -server -Xms256m -Xmx512m -Dfile.encoding=utf-8 -Djava.io.tmpdir=/var/tmp -Duser.timezone=Asia/Shanghai -jar my-gateway.jar --server.port=8080 --spring.profiles.active=dev"]ports:- containerPort: 8080volumes:- name: sw-agentemptyDir: { }
构建boot应用的service文件
vim my-gateway-svc.yml
my-gateway-svc.yml内容如下:
apiVersion: v1
kind: Service
metadata:name: my-gatewaynamespace: spring-applabels:name: my-gateway
spec:type: NodePortports:- nodePort: 32000targetPort: 8080port: 8080selector:name: my-gateway
每个SpringBoot的应用都如上导入skywalk的agent,即可,然后观察启动日志中和下图一样即应用成功:
注意一点的是,skywalking-ui的浏览器缓存特别难缠,有时候构建成功之后需要到设置里面进行强制清理浏览缓存数据才会显示效果。
成功的skywalking效果图:
Kubernetes+SpirngCloud+SkyWalking实现链路追踪相关推荐
- Spring Cloud Alibaba 高级特性 应用性能监控:通过 SkyWalking 实施链路追踪
上一讲我们掌握了基于 Sleuth+Zipkin 对微服务架构实施基于日志的链路追踪,通过 Sleuth 在微服务应用中附加链路数据,再通过 Zipkin 实现链路数据收集与可视化,从而保证开发与运维 ...
- 从零开始使用Skywalking分布式链路追踪系统
当我们用很多服务时,各个服务间的调用关系是怎么样的?各个服务单调用的顺序\时间性能怎么样?服务出错了,到底是哪个服务引起的?这些问题我们用什么方案解决呢,以前的方式是各个系统自己单独做日志,出了问题从 ...
- Skywalking全链路追踪使用说明
1.背景与需求: 随着业务规模的不断增大,系统的复杂度也越来越高,我们的软件架构也进入了分布式的阶段,服务按照不同的维度进行拆分,那么一次请求可能横跨多个服务模块.项目,依赖的中间件也越来越多,其中任 ...
- 【微服务】分布式如何利用Skywalking实现链路追踪与监控?
Skywalking 前言 APM介绍 分布式链路追踪 Apache Skywalking(Incubator)简介 SkyWalking 原理架构图 SkyWalking 核心模块 SkyWalki ...
- skywalking分布式链路追踪
下载地址Downloads | Apache SkyWalking SkyWalking APM 9.2.0 Java Agent 8.12.0 linux搭建skywalking 0. ...
- SpringBoot2 集成 skywalking 实现链路追踪
文章目录 1. 启动skywalking 2. 配置探针 3. 启动项目 4. 测试验证 5. 效果图 1. 启动skywalking cd D:\apache-skywalking-apm-bin\ ...
- Elasticsearch SkyWalking 分布式链路追踪
文章目录 1. 安装包下载 2. 解压 3. 修改配置文件 4. 启动 5. 测试验证 1. 安装包下载 https://www.apache.org/dyn/closer.cgi/skywalkin ...
- skywalking全链路追踪
系统: centos7.6.1810 内核: 3.10.0-957.el7.x86_64 一.先下载相关的工具 官网下载地址: https://skywalking.apache.org/downlo ...
- skywalking 安装_SkyWalking全链路追踪利器
随着目前系统架构的复杂度越来越高(中台.微服务),并且线上应用的多级监控覆盖到了通讯.应用处理过程监控并且实现端到端的应用监测,线上性能故障的快速定位修复:而传统的监控分析方式已经无法满足我们的需求, ...
最新文章
- 【杂谈】参加有三AI秋季划4个月,薪资翻倍,我在有三AI都学了啥?
- rust腐蚀几人组队_直播圈近几年爆火的求生游戏,人渣基本已经凉凉,rust没挂不敢玩...
- Centos7 安装maven
- CCF201604-2 俄罗斯方块
- java replace stringbuilder_JAVA 中Stringbuilder类的方法
- 中国开启开源新纪元!
- WWDC2019: SwiftUI实现你的第一个App
- UEFI开发探索22 – 环境搭建3(使用UDK2018搭建)
- Postman之Mock Servers虚拟服务器
- python+cv2+pyzbar 二维码画框、角度
- 毫米波雷达相关知识调研
- JAVA//JAVA基本程序设计架构
- Java面试问题总结归纳
- linux 不能开启443端口
- 生化实验技术——Fret荧光共振能量转移
- 【信号与系统】(二十)傅里叶变换与频域分析——取样定理
- 《Android开发常用素材网站》
- python 抓取天涯帖子内容并保存
- 利用PE工具修改系统密码
- 黑马程序员——java要点笔记——正则表达式
热门文章
- 麦当劳重金收购一大数据创业公司,持续加码数字化转型
- WPF 如何使用RelativeSource绑定
- 阿里云AI训练营 Class1课程笔记
- 《微信小程序商城开发实战》笔者的新书,欢迎各位粉丝上京东购买
- ueditor 进行html预览,使用ueditor进行页面预览和打印
- 群晖NAS遇到断电如何自动关机
- 恒生股票数据接口可以实现更加方便地实时获取上海和深圳市场行情数据吗?
- C编程小问题 —— “missing function-prototype“
- 8个数字的字符串(20191001)转为日期格式(2019-10-01);将yyyy-mm-dd格式转换为年月日格式 ;将年月日格式转换为yyyy-mm-dd格式
- 1.6 pointer allow for flexibility