大家好!我是"无敌码农"!前两天我在《分布式链路追踪,要怎么玩下?》这篇文章中给大家分享了关于分布式链路追踪的基本原理和SkyWalking的k8s部署玩法,如果还没来得及看的朋友可以点击上面链接回顾下!
今天要给大家分享是我们日常工作中最常见的一种场景,那就是部署在k8s环境下的Java微服务,要接入SkyWalking的具体玩法,通过这个过程咱们可以更深入的理解SkyWalking进行数据采集的逻辑,也能更深刻地从运维角度理解日常工作中所写的Java微服务被无侵入的方式接入分布式链路追踪系统的过程!
废话不多说,接下来就让我们开启干货模式吧!
Java微服务接入SkyWalking的方式
在上篇文章关于SkyWalking基本原理的内容中有讲过,SkyWalking的数据采集主要是通过业务探针(Agent)来实现的,针对不同的编程语言SkyWalking提供了对应的Agent实现。Java微服务接入SkyWalking可以使用“SkyWalking Java Agent”来上报监控数据。
这就需要Java微服务在部署启动的过程中需要获取"SkyWalking Java Agent"探针包,并在启动参数中通过“--javaagent:xxx”进行参数指定。而具体的集成方式大致有以下三种:
使用官方提供的基础镜像;
将agent包构建到已存在的基础镜像中;
通过sidecar 模式挂载agent;
其中前两种方式主要是通过在构建Docker镜像的过程中将Agent依赖打包集成到Java服务的Docker镜像中,而sidecar模式则是利用k8s的相关特性来实现在容器启动时挂载Agent相关依赖。
如果微服务是直接部署在Kubernetes集群,那么采用sidecar模式来使用SkyWalking Agent会更加方便,因为这种方式不需要修改原来的基础镜像,也不需要重新构建新的服务镜像,而是会以sidecar模式,通过共享的volume将agent所需的相关文件直接挂载到已经存在的服务镜像中。
构建SkyWalking Agent镜像
在开始以sidecar方式,将一个用Spring Cloud框架编写的Java微服务接入SkyWalking之前,我们需要构建SkyWalking Java Agent的公共镜像,具体步骤如下:
1)、下载SkyWalking官方发行包,并解压到指定目录
#下载skywalking-8.3.0 for es7版本的发布包,与部署的skywalking后端版本一致
$ wget https://mirror.bit.edu.cn/apache/skywalking/8.3.0/apache-skywalking-apm-es7-8.3.0.tar.gz
#将下载的发布包解压到当前目录
$ tar -zxvf apache-skywalking-apm-es7-8.3.0.tar.gz
2)、构建skywalking-agentsidecar镜像并push至hub私有镜像仓库
在前面步骤中解压的skywalking发行包的同级目录编写Dockerfile文件,具体内容如下:
FROM busybox:latest
ENV LANG=C.UTF-8
RUN set -eux && mkdir -p /usr/skywalking/agent
add apache-skywalking-apm-bin-es7/agent /usr/skywalking/agent
WORKDIR
在上述Dockefile文件中使用是的bosybox镜像,而不是SkyWalking的发行镜像,这样可以确保构建出来的sidecar镜像保持最小。
完成Docker文件编写后,执行镜像构建命令:
#执行镜像构建命令
$ docker build . -t springcloud-action/skywa