基于SkyWalking的链路追踪系统

链路追踪提供了分布式调用链路的还原、统计、分析等功能,是提升微服务诊断效率的重要环节。

本节,我们将基于SkyWalking搭建链路追踪系统。

SkyWalking是一款开源的APM(Application Performance Monitor)工具,以Java Agent + 插件化的方式运行。2019年其从孵化器毕业,正式成为Apache的顶级项目。

单机实验

我们首先跑通单机版的链路追踪。

SkyWalking支持多种后台存储,这里我们选用ElasticSearch:

  1. #!/bin/bash
  2. NAME="elasticsearch"
  3. PUID="1000"
  4. PGID="1000"
  5. VOLUME="$HOME/docker_data/elasticsearch"
  6. mkdir -p $VOLUME
  7. docker ps -q -a --filter "name=$NAME" | xargs -I {} docker rm -f {}
  8. docker run \
  9. --hostname $NAME \
  10. --name $NAME \
  11. --env discovery.type=single-node \
  12. --volume "$VOLUME:/usr/share/elasticsearch/data" \
  13. -p 9200:9200 \
  14. -p 9300:9300 \
  15. --detach \
  16. --restart always \
  17. docker.elastic.co/elasticsearch/elasticsearch:7.15.2

接着,我们启动SkyWalking的后台服务:

  1. #!/bin/bash
  2. NAME="skywalking"
  3. PUID="1000"
  4. PGID="1000"
  5. docker ps -q -a --filter "name=$NAME" | xargs -I {} docker rm -f {}
  6. docker run \
  7. --hostname $NAME \
  8. --name $NAME \
  9. -e SW_STORAGE=elasticsearch7 \
  10. -e SW_STORAGE_ES_CLUSTER_NODES="10.1.172.136:9200" \
  11. -p 12800:12800 \
  12. -p 11800:11800 \
  13. --detach \
  14. --restart always \
  15. apache/skywalking-oap-server:8.7.0-es7

最后,启动SkyWalking的UI服务:

  1. #!/bin/bash
  2. NAME="skywalkingui"
  3. PUID="1000"
  4. PGID="1000"
  5. docker ps -q -a --filter "name=$NAME" | xargs -I {} docker rm -f {}
  6. docker run \
  7. --hostname $NAME \
  8. --name $NAME \
  9. -e SW_OAP_ADDRESS="http://10.1.172.136:12800" \
  10. -p 8080:8080 \
  11. --detach \
  12. --restart always \
  13. apache/skywalking-ui:8.7.0

上述,我们让容器直接使用了Host Net:10.1.172.136。

下一步,我们下载最新版的Java Agent,其支持的框架可以在这里)查看。

解压后,我们直接使用java命令行运行:

  1. java -javaagent:./skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=homs-start -Dskywalking.collector.backend_service=10.1.172.136:11800 -jar ./homs-start-0.0.1-SNAPSHOT.jar

如上所示:

  • 服务名字:homs-start

  • SkyWalking后台服务地址:10.1.172.136:11800

启动成功后,我们尝试访问端口:

  1. curl "127.0.0.1:8080"

查看SkyWalking的UI,可以发现,已经统计到了链路追踪!

f

Kubernets中部署SkyWalking

在Kubernets环境中,我们倾向只部署无状态服务,以便拓展。

而对于SkyWaling Server这种服务,会占用较大性能,且没有太多需要扩展的场景,因此我们维持其外部部署方式,不上k8s。

回顾下之前的内容,我们的homs-start是通过Docker镜像的方式启动的Pod和Deployment。

我们需要对其进行改造,添加initContainer,注入Java Agent:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: homs-start-deployment
  5. labels:
  6. app: homs-start
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: homs-start
  11. replicas: 1
  12. strategy:
  13. type: RollingUpdate
  14. template:
  15. metadata:
  16. labels:
  17. app: homs-start
  18. spec:
  19. volumes:
  20. - name: skywalking-agent
  21. emptyDir: {}
  22. containers:
  23. - name: homs-start-server
  24. image: coder4/homs-start:107
  25. ports:
  26. - containerPort: 8080
  27. volumeMounts:
  28. - name: skywalking-agent
  29. mountPath: /skywalking
  30. env:
  31. - name: JAVA_TOOL_OPTIONS
  32. value: -javaagent:/skywalking/agent/skywalking-agent.jar
  33. - name: SW_AGENT_NAME
  34. value: homs-start
  35. - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
  36. value: 10.1.172.136:11800
  37. resources:
  38. requests:
  39. memory: 500Mi
  40. initContainers:
  41. - name: agent-container
  42. image: apache/skywalking-java-agent:8.8.0-java8
  43. volumeMounts:
  44. - name: skywalking-agent
  45. mountPath: /agent
  46. command: [ "/bin/sh" ]
  47. args: [ "-c", "cp -R /skywalking/agent /agent/" ]

如上所示:

  • 这里我们没有额外制作agent的镜像,而是使用了官方的最新版

  • 我们添加了全局的临时Volume:skywalking-agent

  • 添加了initContainer:agent-container,主要负责启动时拷贝agent的jar包

  • 在启动homs-start-server时需要设定一些环境变量参数

启动成功后,我们尝试登录minikube访问服务:

  1. minikube ssh
  2. Last login: Tue Nov 16 07:54:28 2021 from 192.168.49.1
  3. docker@minikube:~$ curl "172.17.0.3:8080"
  4. {"timestamp":"2021-11-16T07:55:08.669+00:00","status":404,"error":"Not Found","path":"/"}

然后查看SkyWalking的UI,也能成功记录到最新追踪请求!

f

至此,我们已经搭建了最基本的链路追踪系统,其还有很大的优化空间:

  • 官方agent镜像中包含了全量插件,你应当根据实际需要剪裁

  • 微服务中会有某些缺乏Agent插件的场景,需要自行定制插件

  • 不仅agent,服务的jar包其实也是可以通过initContainer来拷贝的,这可以进一步压缩镜像体积。

上述优化,做为课后作业,留给喜欢挑战的你吧:-)