目前最流行的分布式链路追踪系统——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种:
1)、在Kubernetes集群中创建一个单独运行SkyWalking容器的Namespace。命令如下:
kubectl create ns skywalking
2)、编写SkyWalking-UI及OAP Server服务Kubernetes部署文件
编写SkyWalking服务端Kubernetes部署文件(skywalking-aop.yml),具体内容如下:
编写SkyWalking-UI部署文件(skywalking-ui.yml),具体内容如下:
SkyWalking的数据采集主要是通过业务探针(Agent)来实现的,针对不同的编程语言SkyWalking提供了对应的Agent实现。Java微服务接入SkyWalking可以使用“SkyWalking Java Agent”来上报监控数据。
通过sidecar 模式挂载agent,sidecar模式则是利用k8s的相关特性来实现在容器启动时挂载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
wget连接不通就直接去官网下载即可
#将下载的发布包解压到当前目录
$ tar -zxvf apache-skywalking-apm-es7-8.3.0.tar.gz
2)、构建skywalking-agentsidecar镜像并push至hub私有镜像仓库
编写dokerfile文件
执行镜像构建命令:
docker build Dockerfile -t zinger-dev/skywalking-agent-sidecar:8.3.0
3)、将打包的镜像推送到harbor镜像仓库
#这里将原先构建的镜像安装{镜像仓库地址}/项目名称/镜像名称的方式打tag
$ docker tag zinger-dev/skywalking-agent-sidecar:8.3.0 hub.XX.com/zinger-dev/skywalking- agent-sidecar
接下来我们将打过tag的镜像推送至私有Harbor仓库,具体操作如下:
#将镜像推送到Harbor私有镜像仓库
$ docker push hub.XX.com/zinger-dev/skywalking-agent-sidecar
4)、微服务Kubernetes发布文件集成SkyWalking Agent实现埋点
其主要原理是通过Kubernetes的初始化容器initContainers来实现的,initContainers是一种专用容器,可以在应用容器启动之前运行,可以用于完成应用启动前的必要初始化工作。具体的Kubernetes部署文件(deploy-skywalking.yml)内容如下:
以上是挂载sidecar的k8s发布文件,以微服务“cloud-portal”为例,主要是通过共享volume的方式挂载agent。其中initContainers通过skywalking-agent卷挂载了skywalking-agent-sidecar镜像中的/skywalking/agent,并将上面构建好的镜像中的agent目录cp到了/skywalking/agent目录,完成之后微服务容器启动时也挂载了skywalking-agent卷,并将其挂载到容器的/usr/skywalking/agent目录,这样就完成了共享过程。
发布后在rancher上查看
访问: