k8s上分布式链路追踪

目前最流行的分布式链路追踪系统——SkyWalking

简介:

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

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

k8s上分布式链路追踪_第1张图片

原理:

如上图所示,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协议采集数据面、控制面的数据,实现对服务网格链路数据的观测;

安装部署

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

kubectl create ns skywalking

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

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

k8s上分布式链路追踪_第2张图片

k8s上分布式链路追踪_第3张图片

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

k8s上分布式链路追踪_第4张图片

k8s上分布式链路追踪_第5张图片

Java微服务接入SkyWalking的方式

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文件

k8s上分布式链路追踪_第6张图片

执行镜像构建命令:

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)内容如下:

k8s上分布式链路追踪_第7张图片

k8s上分布式链路追踪_第8张图片

以上是挂载sidecar的k8s发布文件,以微服务“cloud-portal”为例,主要是通过共享volume的方式挂载agent。其中initContainers通过skywalking-agent卷挂载了skywalking-agent-sidecar镜像中的/skywalking/agent,并将上面构建好的镜像中的agent目录cp到了/skywalking/agent目录,完成之后微服务容器启动时也挂载了skywalking-agent卷,并将其挂载到容器的/usr/skywalking/agent目录,这样就完成了共享过程。

发布后在rancher上查看

k8s上分布式链路追踪_第9张图片

访问:

k8s上分布式链路追踪_第10张图片

你可能感兴趣的:(skywalking,k8s)