skywalking链路跟踪

前言

微服务中,有时候服务调用多了,排查问题会变得异常繁琐,需要不断找到调用链每个服务的日志查看问题,消耗大量人力物力,最终才找到问题。
这时候如果出现线上重大问题,又需要快速定位问题,有什么组件是实时监控整个调用链辅助我们快速定位问题的呢?
当然有,那就是链路跟踪,其中比较出名的就是skywalking,无代码侵入性,只需要运行脚本加入对应命令即可。
本文介绍skywalking的搭建全过程,同时提供了普通服务和k8s服务加入skywalking探针的方法。

skywalking简单安装部署

前提:需要安装java环境

1、下载

安装
版本目录地址:https://archive.apache.org/dist/skywalking/

这里下载当前最新for es7的8.5.0版本。不用es7存储的可以下载其他版本。

下载命令:

wget https://dlcdn.apache.org/skywalking/8.7.0/apache-skywalking-apm-es7-8.7.0.tar.gz```  
## 解压  
```shell  
mkdir /data -p#解压到/data目录  
tar -zxf apache-skywalking-apm-es7-8.5.0.tar.gz -C /data/  
#重命名  
mv /data/apache-skywalking-apm-bin-es7 /data/skywalking```  
  
# 配置  
  
  
  
## 环境配置  
  
修改/etc/hosts,加入如下内容  
  
```shell  
#es在本地安装  
127.0.0.1 es  

搭建docker版的es

docker安装略,直接用docker安装es吧,省事点。

docker pull elasticsearch:7.6.2  
#创建docker容器挂在的目录:  
sudo mkdir -p /data/elasticsearch/configsudo mkdir -p /data/elasticsearch/datasudo mkdir -p /data/elasticsearch/plugins#配置文件  
echo "http.host: 0.0.0.0" >> /data/elasticsearch/config/elasticsearch.yml  
#创建容器  
sudo docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \-e "discovery.type=single-node" \  
-e ES_JAVA_OPTS="-Xms84m -Xmx512m" \  
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \  
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \  
-v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \  
-d elasticsearch:7.6.2  
  
  
#查看启动详情  
  
docker ps # 查看是否启动  
docker logs elasticsearch #启动日志查询  
docker restart elasticsearch #重启  
docker exec -it elasticsearch bash #进入  
  
  
# 可能会出现的安装异常  
## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/  
## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/  
## 异常三:因虚拟内存太少导致,处理:sudo sysctl -w vm.max_map_count=262144  

服务配置

进入安装目录

cd /data/skywalking```  
  
修改配置文件./config/application.yml,修改数据库为elasticsearch7,其他使用默认配置即可。  
  
```shell  
vim config/application.yml#集群配置  
cluster:  
#选择配置,这里使用单机版  
selector: ${SW_CLUSTER:standalone}#单机版配置  
standalone:  
...  
#基于zk集群配置  
zookeeper:  
...  
...  
#数据库  
storage:  
#这里使用elasticsearch7  
selector: ${SW_STORAGE:elasticsearch7}...  
elasticsearch7:  
nameSpace: ${SW_NAMESPACE:""}clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:node3:9200}...  
...  

UI端口修改

修改./webapp/webapp.yml文件

vim webapp/webapp.ymlserver:  
#访问端口号  
port: 8080  
collector:  
path: /graphqlribbon:  
ReadTimeout: 10000# Point to all backend's restHost:restPort, split by ,  
# 内置zuul负载均衡  
listOfServers: 127.0.0.1:12800```  
  
## 启停  
  
### 启动  
  
执行启动命令./bin/startup.sh,默认会占用的8080,11800,12800端口  
  
```shell  
$ ./bin/startup.shSkyWalking OAP started successfully!SkyWalking Web Application started successfully!```  
  
### 停止  
  
杀掉8080、11800端口对应的pid  
  
```shell  
kill -9 [pid]```  
  
### 访问  
  
访问地址  
  
```shell  
http://localhost:8080/  

skywalking做成service服务

做成服务,保证skywalking挂了能自动重启,开机自启,而且方便启停。(当前也能直接用做成镜像,用docker,但对于这种cpu或内存占用大的,还是推荐做成服务比较好点)

位置:

/usr/lib/systemd/system/skywalking.service  

内容

[Unit]  
Description=skywalking service  
After=network.target remote-fs.target nss-lookup.target  
  
[Service]  
Type=forking  
Environment=JAVA_HOME=/data/java/jdk  
ExecStart=/data/skywalking/bin/startup.sh  
KillSignal=SIGQUIT  
TimeoutStopSec=5  
KillMode=process  
PrivateTmp=true  
StandardOutput=syslog  
StandardError=inherit  
  
[Install]  
WantedBy=multi-user.target  

命令

#重载配置  
systemctl daemon-reload  
  
#开机自启  
systemctl enable skywalking  
  
#重启skywalking  
systemctl restart skywalking  
  
  
systemctl status skywalking  
  

加入探针

agent文件放到对应位置

给 springboot 服务加入探针

我的 start.sh 文件如下
,需要注意的是: -jar 后面是要加探针的 jar 包,一定要放在命令行的最后。

java -Dfile.encoding=UTF-8 -Xms256m -Xmx256m \-javaagent:/opt/skywalking/agent/skywalking-agent.jar \  
-Dskywalking.agent.service_name=ybf-static \  
-Dskywalking.collector.backend_service=vipmajia.com:11800 \  
-jar /root/dev/ybf-static-0.0.2-SNAPSHOT.jar \  
&  

启动 springboot:

./start.sh  

给k8s的微服务加入探针

如果是k8s,其yaml要添加如下内容:

#外部 skywalking引入k8s作为endpoints  
apiVersion: v1  
kind: Endpoints  
metadata:  
labels:  
name: skywalking  
name: skywalking  
namespace: xcc-prod  
subsets:  
- addresses:  
- ip: 10.10.40.161  
ports:  
- name: skywalking  
port: 11800  
  
---  
#skywalking作为service  
apiVersion: v1  
kind: Service  
metadata:  
labels:  
name: skywalking  
name: skywalking  
namespace: xcc-prod  
spec:  
ports:  
- name: skywalking  
port: 11800  
targetPort: 11800  
type: NodePort  

对应服务上加入skywalking的探针

apiVersion: apps/v1kind: Deploymentmetadata:  
name: my-project-namenamespace: xcc-testspec:  
replicas: 1selector:  
matchLabels:  
name: my-project-nametemplate:  
metadata:  
labels:  
name: my-project-namespec:  
containers:  
- name: my-project-name...  
env:  
- ...# 镜像中没有JAVA_OPTS这个ENV实际上这个地方不会生效,所以在docker中 -javaagent:/sidecar/agent/skywalking-agent.jar 是需要的。  
#这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成  
- name: JAVA_TOOL_OPTIONSvalue: -javaagent:/data/skywalking/agent/skywalking-agent.jar- name: SW_AGENT_NAMEvalue: my-project-name- name: SW_AGENT_COLLECTOR_BACKEND_SERVICESvalue: skywalking:11800volumeMounts:  
- name: bd-skywalkingmountPath: /data/skywalking/agentvolumes:  
- name: bd-skywalkingnfs:  
path: /data/k8snfs/sys/skywalking/agentserver: 10.10.40.121  
  • volumes前提,在挂载的nfs里提前把skywalking的agent目录放好到目录 :/data/k8snfs/sys/skywalking/agent
  • volumeMounts:跟volumes呼应,name要保持一致,mountPath为当前目录,跟env的JAVA_TOOL_OPTIONS路径一致,都为/data/skywalking/agent
  • env:必要的环境变量,JAVA_TOOL_OPTIONS 是jar跑的时候的代理jar
  • env:必要的环境变量,SW_AGENT_COLLECTOR_BACKEND_SERVICES 是agent后台地址,要能在当前容器里ping通
  • env:必要的环境变量,SW_AGENT_NAME 为最终在 http://127.0.0.1:8080 里会展示出来的名字,最好跟项目名称呼应,如例子里的my-project-name

访问后台

http://localhost:8080/

skywalking

img

页面里,核心是successful rate 即,访问成功率,这个正常服务要一直100%才是对的,低于这个数都得报警